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

use*_*986 6 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,
        signature: T::Signature,
    }
    
    impl<T: Config + Send + Sync> SignedExtension for SenderInfo<T>
    where
        <T as frame_system::Config>::Call: IsSubType<Call<T>>,
    {
        // ... 
    
        fn validate_unsigned(
            call: &Self::Call,
            info: &DispatchInfoOf<Self::Call>,
            len: usize
        ) -> TransactionValidity {
            // validate self.authority and self.signature
    
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    SignedExtension然后需要将其聚合到SignedExtra运行时中。(正确的?)

我倾向于使用第二个选项,因为它看起来更干净:它不需要我用方法调用中甚至未使用的额外信息来污染我的方法签名。但这是否意味着提交到运行时的任何交易(无论签名还是未签名)都需要添加此自定义内容SignedExtra

还有其他我应该注意的注意事项吗?

小智 0

我正在做一件非常相似的事情。

我能够用你的方法1做到这一点。基本上我确实检查了两件事:

  1. 如果有效负载已正确签名 - 当您想到这一点时,这只会告诉您有关用户的信息,但它不会检查用户是否是您的权限用户。
  2. 我会检查此帐户是否在我的权限列表中

我的工作示例可在此处https://github.com/korzewski/jackblock/blob/master/pallets/jackblock/src/lib.rs#L401

尽管如此,这并不完美,因为我需要保留第二个权限列表并手动添加它们。

目前我正在尝试重构它,因此我的权限帐户与我的验证器(Aura Pallet)相同。仍在寻找解决方案,也许您知道如何解决它?基本上如何在我自己的托盘中重复使用 Aura 托盘