微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是不收费的黑白已签名 txns 和带签名有效载荷的未签名 txns?

如何解决什么是不收费的黑白已签名 txns 和带签名有效载荷的未签名 txns?

阅读 Substrate recipes 中关于 off-chain workers 的文档,据说我们通常可以进行三种类型的交易,以将来自链外的非确定性数据包含到区块链中。这三种类型是:

  1. 签署的交易
  2. 未签名的交易
  3. 具有签名有效负载的未签名交易

第1种和第3种的共同特点是在两种情况下我们都可以知道签名者的身份。文档中提到的不同之处在于,签名者需要为第 1 种类型支付费用,而无需为第 3 种类型支付费用。 还指出,对于第 3 种类型,我们需要额外的验证逻辑以减轻对我们链的任何类型的攻击,因为没有费用。根据我对签名交易工作原理的理解,您还可以使用 Pays::No 选项以 0 费用允许签名交易,如here 的回答。您还可以在这种情况下放置更多验证逻辑,以保护您的链免受任何形式的攻击。

所以我的问题是,在这两种情况下,如果我们都能达到相同的预期结果,即了解调用者、无费用、验证逻辑,这两种类型的交易是否仍然存在差异? 有没有办法知道什么时候使用哪种类型?

解决方法

确实,返回 Pays::No 的签名交易和未签名交易之间存在非常重要的区别。

前者只会在执行结束时退还费用,如果交易成功几乎可以肯定,而后者总是免费。这就是为什么,正如您所提到的,您真的需要为未签名的交易设置自定义验证逻辑,否则它们很容易受到 DoS 攻击。


让我们看更多的例子:

  • 签名交易将对链进行一些清理,这实际上对链有益并且值得计算。如果你想激励随机用户更多地调用这个交易,你可以把它作为一个签名交易,只有在执行成功并且链受益时才返回Pays::No。否则,如果交易没有收益,签名者将不得不支付全额费用,以防止任何攻击。这就是在民主托盘中提交提案的原像的情况。如果前映像已成功提交,the fee is refunded
  • 一笔交易只能由一组固定的硬编码账户(存储在链上,或验证人组等)提交,并且您希望免除他们支付任何费用。在这种情况下,您将其设为未签名的交易,无需支付任何费用,并使用发件人帐户签署(一部分)有效负载。这可以稍后在链上进行检查,这类似于 ensure_signed 正在执行的操作。
  • 最后,在 Polkadot 的 claims 托盘这样的情况下,您可能希望允许没有任何资金的账户发送交易。这是风险最高的变体,您需要确保拥有合适的权重和防止任何 DoS 攻击的 validate_unsigned

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。