如何解决Substrate:如何验证无符号外部函数的发起者?
为了防止垃圾邮件,我需要能够识别未签名的外部源。假设有一组已知的权威,我愿意从他们那里接受一个未签名的外部。我想检查未签名外部的发件人是否是该权限集的成员(并且他们就是他们所说的人)。
据我所知,有几种不同的方法,我想更好地了解每种方法之间的差异以及所涉及的权衡。
-
添加一个签名作为调用参数并定义
ValidateUnsigned
。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!(); } } }
-
为一些与托盘特征相关的元数据实现
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 } }
此
SignedExtension
然后需要聚合到运行时的SignedExtra
中。 (对吗?)
我倾向于使用第二个选项,因为它看起来更简洁:它不需要我用在方法调用中甚至没有使用的额外信息来污染我的方法签名。但这是否意味着提交给运行时的任何交易,无论是签名的还是未签名的,都需要添加这个自定义的 SignedExtra
?
还有什么我应该注意的注意事项吗?
解决方法
我正在做一个非常相似的事情。
我能够通过您的方法 1 做到这一点。 基本上我会检查两件事:
- 如果有效负载签名正确 - 当您考虑它时,这只会告诉您有关用户的信息,但不会检查用户是否是您的授权用户。
- 我会检查此帐户是否在我的权限列表中
我的工作示例可以在这里找到https://github.com/korzewski/jackblock/blob/master/pallets/jackblock/src/lib.rs#L401
虽然,这并不完美,因为我需要保留第二个权限列表并手动添加它们。
目前我正在尝试重构它,因此我的权限帐户与我的验证器(Aura 托盘)相同。仍在寻找解决方案,所以也许您知道如何解决它?基本上如何在我自己的托盘中重复使用 Aura 托盘
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。