b/w 无费用的签名交易和有签名有效负载的未签名交易的区别是什么?

What is the diff b/w signed txns with no fees and unsigned txns with signed payloads?

阅读Substrate recipes中关于off-chain worker的文档,说我们一般可以做三种类型的交易,将链外的非确定性数据纳入区块链。这三种类型是:

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

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

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

确实,return Pays::No 的签名交易和未签名的交易之间有一个非常重要的区别。

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


让我们看更多的例子:

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