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

Sai*_*laj 5 ethereum solidity smartcontracts

谷歌没有给我一个具体的答案,使用该require()功能是否会Solidity消耗gas?即使函数中的语句被评估为真?

Ada*_*nis 5

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

如果您问的是 OPCODE 本身,我同意您的看法,即答案尚不清楚。我在(现在非常不推荐使用的)Google OPCODE 气体使用电子表格黄皮书(附录 G)中没有看到REVERTOPCODE(这是require()编译成的)。

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

contract GasUsage {
    uint val;

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

        delete val;
    }
}
Run Code Online (Sandbox Code Playgroud)

包含时的执行成本:5230

注释掉时的执行成本:5207


如果您在require声明之前询问天然气消耗量,那么答案是肯定的。从拜占庭版本开始,直到require声明点为止消耗的所有气体都会被消耗,但任何剩余的气体都会返回。在拜占庭之前,require()assert()是相同的,所有的气体都将被消耗。

来自Solidity 文档

在内部,Solidity 对 require 样式的异常执行还原操作(指令 0xfd)并执行无效操作(指令 0xfe)以抛出断言样式的异常。在这两种情况下,这都会导致 EVM 恢复对状态所做的所有更改……请注意,断言风格的异常消耗了调用可用的所有 gas,而 require 风格的异常不会消耗从 Metropolis 版本开始的任何 gas。