解密 Solidity:添加 PAYABLE 关键字真的可以节省 GAS 吗?

在函数中添加不必要的Payable关键字只是为了节省gas可能是一个糟糕的决定。

_20220621181910.jpg

如果你最近一直在使用Solidity开发智能合约,那么就有可能会遇到Payable关键字。

快速介绍:Payable 关键字的基础知识

在智能合约所能做的所有美妙的事情中,存钱(ETH)就是其中之一。现在为了在智能合约中接收ETH,Solidity语言有一个特定的关键字,叫做Payable。

用非常简单的术语来说,Payable关键字是Solidity语言中的一个修饰符,可以附加到任何函数上。附加后,该关键字允许该函数接收以太币。换句话说,当触发一个带有Payable关键字的函数时,就可以将以太币 (msg.value)与该交易一起发送出去。

虽然这一切都很好,但我在几个月前浏览社交媒体时遇到了一个关于Payable关键字的有趣警告。它吸引了我的注意,我发现每当一个Payable修饰符被附加到任何函数时,就会出现一个有趣的场景。

让我们来快速看一下这个有趣的场景:

11.jpg

一个没有 Payable关键字的 setter 函数

在上面的图片中,我们有一个非常简单的setter函数,设置uint256变量状态为100。如果触发这个函数,就会发现交易gas成本大约在43300左右。

现在我们来看第二个条件。

22.jpg

一个有 Payable关键字的 setter 函数

在第二种情况下,我们有完全相同的函数来执行完全相同的设置状态变量的交易。这里唯一的区别是附加在函数上的一个额外的Payable修饰符。

非常有趣的是,如果你看一下调用这个函数的交易gas成本,它大约是43276,这比上面提到的没有 Payable关键字的函数要低。

添加一个简单的Payable关键字只会减少函数中的gas消耗量。

顿悟时刻💡💡

为什么Payable的修饰符会降低gas?

答案是:

添加一个Payable关键字可以降低正在执行的操作码的数量,从而降低gas的消耗量。

为什么给函数添加一个额外的修饰符会降低操作码的数量,而不是增加它呢?

  • 一个函数要能够接收以太币,必须附加一个Payable的修饰符。而一个没有任何Payable修饰符的函数将永远无法收到任何以太币。
  • 这是 Solidity 中的严格规则,因此,调用Non-Payable函数时尝试传递以太币,它将简单地被恢复。
  • 在Non-Payable函数的情况下,调用Non-Payable函数时需要执行额外的操作码,以确保该函数只有在伴随着交易发送的以太币 (msg.value)恰好等于0的情况下才会执行。
  • 对于Payable函数来说,情况并非如此。Payable函数允许用户在调用函数时传递非0或0以太值。
  • 这基本上意味着即使在调用Payable函数时发送了0以太币( msg.value == 0 ),交易也不会恢复。因此,对于 Payable 函数,无需显式检查msg.value。

总结

33.jpg

Solidity 中 Payable 和 NON-Payable 函数的 GAS 区别

在NON-Payable 函数的情况下:

a.包含额外的检查以确保在调用函数时没有传递以太值。

b.这些检查会增加正在执行的操作码的数量。

c.操作码数的增加最终导致gas使用量的增加。

在Payable函数的情况下:

a.不需要额外的检查,因为该函数可以接受以太币的0值或非0值。

b.没有额外的检查意味着没有执行额外的操作码。

c.执行的操作码越低,耗gas越少。

虽然节省gas很重要,但在函数的预期行为上妥协,尽量减少必要的状态变化,或者使用不适当的战术来节省额外的gas,都不是一个好主意。

换句话说,如果一个函数与接收以太币无关,那么它就不应该附加任何Payable关键字,即使这样可以节省一些gas。

因此,我坚信在函数中添加不必要的Payable关键字只是为了节省gas可能是一个糟糕的决定。上面提到的在添加Payable关键字的同时减少gas的场景只是一种Solidity的语言设计,根本没有任何效果。

Source:https://medium.com/coinmonks/deciphering-solidity-does-adding-a-Payable-keyword-actually-save-gas-89d1d8298d3f

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

本文首发于:https://mp.weixin.qq.com/s/BggdN7QLvl3rtwXSQJSCAQ

  • 发表于 2022-06-21 18:25
  • 阅读 ( 345 )
  • 学分 ( 2 )
  • 分类:DeFi

1 条评论

请先 登录 后评论
ChinaDeFi 去中心化金融社区
ChinaDeFi 去中心化金融社区

94 篇文章, 66 学分