我需要能够识别未签名的外部信息的来源,以防止垃圾邮件。假设有一组已知的权威,我愿意接受来自他们的未签名的外部信息。我想检查未签名的外部消息的发送者是否是该权限集的成员(并且他们就是他们所说的那个人)。
据我所知,有几种不同的方法,我想更好地了解每种方法之间的差异以及所涉及的权衡。
添加签名作为调用参数并定义ValidateUnsigned.
这种方法用在ImOnline托盘上。大致说来:
decl_module!(
// ...
fn my_unsigned_call(_origin,
args: MyArgs<T>,
authority: T::Authority,
signature: T::Signature) {
// Handle the call
todo!()
}
)
impl<T: Trait> frame_support::unsigned::ValidateUnsigned for Module<T> {
// ...
fn validate_unsigned(
_source: TransactionSource,
call: &Self::Call,
) -> TransactionValidity {
if let Call::my_unsigned_call(args, authority, signature) = call {
// Check the sender is in the approved authority set and verify sig
todo!();
}
}
}
Run Code Online (Sandbox Code Playgroud)
实现SignedExtension与托盘特征相关的一些元数据。这在文档中有所涉及,并且似乎是在TransactionPayment托盘中实现的。实施将是这样的:
struct SenderInfo<T> {
authority: T::Authority, …Run Code Online (Sandbox Code Playgroud)substrate ×1