小编use*_*986的帖子

Substrate:如何验证未签名外部变量的发起者?

我需要能够识别未签名的外部信息的来源,以防止垃圾邮件。假设有一组已知的权威,我愿意接受来自他们的未签名的外部信息。我想检查未签名的外部消息的发送者是否是该权限集的成员(并且他们就是他们所说的那个人)。

据我所知,有几种不同的方法,我想更好地了解每种方法之间的差异以及所涉及的权衡。

  1. 添加签名作为调用参数并定义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)
  2. 实现SignedExtension与托盘特征相关的一些元数据。这在文档中有所涉及,并且似乎是在TransactionPayment托盘中实现的。实施将是这样的:

    struct SenderInfo<T> {
        authority: T::Authority, …
    Run Code Online (Sandbox Code Playgroud)

substrate

6
推荐指数
1
解决办法
638
查看次数

标签 统计

substrate ×1