在函数中添加不必要的Payable关键字只是为了节省gas可能是一个糟糕的决定。
如果你最近一直在使用Solidity开发智能合约,那么就有可能会遇到Payable关键字。
在智能合约所能做的所有美妙的事情中,存钱(ETH)就是其中之一。现在为了在智能合约中接收ETH,Solidity语言有一个特定的关键字,叫做Payable。
用非常简单的术语来说,Payable关键字是Solidity语言中的一个修饰符,可以附加到任何函数上。附加后,该关键字允许该函数接收以太币。换句话说,当触发一个带有Payable关键字的函数时,就可以将以太币 (msg.value)与该交易一起发送出去。
虽然这一切都很好,但我在几个月前浏览社交媒体时遇到了一个关于Payable关键字的有趣警告。它吸引了我的注意,我发现每当一个Payable修饰符被附加到任何函数时,就会出现一个有趣的场景。
让我们来快速看一下这个有趣的场景:
一个没有 Payable关键字的 setter 函数
在上面的图片中,我们有一个非常简单的setter函数,设置uint256变量状态为100。如果触发这个函数,就会发现交易gas成本大约在43300左右。
现在我们来看第二个条件。
一个有 Payable关键字的 setter 函数
在第二种情况下,我们有完全相同的函数来执行完全相同的设置状态变量的交易。这里唯一的区别是附加在函数上的一个额外的Payable修饰符。
非常有趣的是,如果你看一下调用这个函数的交易gas成本,它大约是43276,这比上面提到的没有 Payable关键字的函数要低。
添加一个简单的Payable关键字只会减少函数中的gas消耗量。
为什么Payable的修饰符会降低gas?
答案是:
添加一个Payable关键字可以降低正在执行的操作码的数量,从而降低gas的消耗量。
为什么给函数添加一个额外的修饰符会降低操作码的数量,而不是增加它呢?
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的语言设计,根本没有任何效果。
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!