以太坊的合格性 - 是否要求()使用任何气体?

时间:2018-01-03 12:49:22

标签: ethereum solidity smartcontracts

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

1 个答案:

答案 0 :(得分:2)

我不太确定你是否会询问OPCODE本身是否会消耗气体,或者如果声明评估为真,则是否消耗了气体。

如果你问的是OPCODE本身,我同意你的看法,答案不清楚。我在Google OPCODE gas usage spreadsheetyellowpaperByzantium中没有看到REVERT OPCODE(编译为require()的内容)(附录G) )。

在Remix中运行测试,看起来它确实消耗了非常少量的气体。只需在此方法的顶部添加require(true)调用,就可以将气体使用量增加23点。

contract GasUsage {
    uint val;

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

        delete val;
    }
}

包含时的执行成本:5230

注释时的执行成本:5207

如果您在require声明之前询问燃气消耗,那么答案是肯定的。从Solidity docs版本开始,消耗到require语句点消耗的所有气体,但返回任何剩余的气体。在Byzantium之前,require()assert()是相同的,并且所有的气体都会消耗掉。

来自{{3}}:

  

在内部,Solidity执行恢复操作(指令0xfd)   对于require-style异常并执行无效操作   (指令0xfe)抛出一个断言式异常。在这两种情况下,   这会导致EVM恢复对状态所做的所有更改...请注意,断言式异常会消耗所有气体   可用于调用,而require-style异常不会消耗   从Metropolis发布的任何气体。