【问题标题】:How to create an extrinsic without transaction fee?如何在没有交易费用的情况下创建外在?
【发布时间】:2020-07-07 16:53:02
【问题描述】:

我正在尝试创建一个函数或外部函数,它对源代码没有交易费用,而是完全免费的。我以为权重为 0 的问题可以解决,但仍然需要代币,

#[weight = 0]

然后我尝试通过 rpc 调用调整状态,该调用进行了一些计算但没有修改状态 我如何创建一个免费的函数/外部函数而无需任何交易费用? rpc调用是否可以调整状态?

【问题讨论】:

  • 对不起@Noah,但这不是一个很好的问题,我们将能够为您提供帮助。请花一些时间来制定以下内容:(1)您的问题的背景是什么? (2) 你想做什么? (3) 你试过什么? (4) 我们具体可以做些什么来帮助?使用两句话问题发布指向您的存储库的链接不是在此处获得帮助的合适方式,但如果您可以调整您的问题,我们很乐意提供帮助。

标签: substrate


【解决方案1】:

这实际上使用 Substrate 非常简单。

您只需将Pays::No 传递给函数的权重。

像这样:

#[weight = (100_000, DispatchClass::Normal, Pays::No)]

这里的元组描述:

  1. 函数的权重。您应该在此处输入一个实际值来表示该函数对于您的区块链计算的复杂程度。
  2. 此函数的DispatchClass。默认选择是Normal
  3. Pays 选项用于确定呼叫者是否支付费用。

请注意,如果您创建用户无需支付任何费用的外在功能,您的区块链将立即受到 DDOS 攻击,因为任何用户都可以免费向该功能发送垃圾邮件。

您需要在区块链上构建其他验证层,以确保只有对该函数的有效调用才会传播到其他节点。

看这里: https://github.com/paritytech/polkadot/blob/master/runtime/common/src/claims.rs#L386

在这种情况下,我们验证了一些声明在调用传递到其他节点之前由发出调用的用户正确签名:

https://github.com/paritytech/polkadot/blob/master/runtime/common/src/claims.rs#L592

因此,如果您希望您的区块链具有像这样的免费功能是安全的,您必须这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2022-08-03
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多