Ethereum Solidity - require() 是否使用任何气体?

Ethereum Solidity - Does require() use any gas?

Google没能给我一个具体的答案,在Solidity中使用require()函数会消耗gas吗?即使函数中的语句被评估为真?

我不太确定您是在询问 OPCODE 本身是否消耗气体,或者如果语句计算结果为真,是否消耗气体。

如果您问的是 OPCODE 本身,我同意您的看法,即答案不明确。我没有在(现在非常不赞成使用)Google OPCODE gas usage spreadsheet or in the yellowpaper(附录 G)中看到 REVERT 操作码(require() 被编译成)。

运行 Remix中的一个测试,看起来确实消耗了很少的gas。只需在此方法的顶部添加一个 require(true) 调用即可将 gas 使用量增加 23。

contract GasUsage {
    uint val;

    function someFunc() public returns (bool) {
        require(true);

        delete val;
    }
}

included:5230

时的执行成本

注释掉时的执行成本:5207


如果您询问 require 语句之前的耗气量,那么答案是肯定的。从 Byzantium 版本开始,在 require 语句点之前消耗的所有气体都已消耗,但会返回任何剩余的气体。在拜占庭之前,require()assert() 是相同的,所有的气体都会被消耗。

来自Solidity docs

Internally, Solidity performs a revert operation (instruction 0xfd) for a require-style exception and executes an invalid operation (instruction 0xfe) to throw an assert-style exception. In both cases, this causes the EVM to revert all changes made to the state...Note that assert-style exceptions consume all gas available to the call, while require-style exceptions will not consume any gas starting from the Metropolis release.