如何创建一个没有交易费用的外部?

Noa*_*rgh 2 substrate

我试图创建一个函数或外部函数,它不收取原始交易费,而是完全免费的。我认为也许权重为 0 就可以解决,但仍然需要花费代币,

#[weight = 0]
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*izi 7

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

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

就像这样:

#[weight = (100_000, DispatchClass::Normal, Pays::No)]
Run Code Online (Sandbox Code Playgroud)

这里元组描述:

  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

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