【问题标题】:Ethereum Solidity - Does require() use any gas?Ethereum Solidity - require() 是否使用任何气体?
【发布时间】:2018-06-13 03:37:30
【问题描述】:

谷歌没有给我一个具体的答案,在Solidity 中使用require() 函数会消耗任何气体吗?即使函数中的语句被评估为真?

【问题讨论】:

    标签: ethereum solidity smartcontracts


    【解决方案1】:

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

    如果您询问的是 OPCODE 本身,我同意您的观点,即答案尚不清楚。我在Google OPCODE gas usage spreadsheetyellowpaper(附录G)中(现在非常不推荐)没有看到REVERT OPCODE(这是require() 编译成的)。

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

    contract GasUsage {
        uint val;
    
        function someFunc() public returns (bool) {
            require(true);
    
            delete val;
        }
    }
    

    包含时的执行成本:5230

    注释掉时的执行成本:5207


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

    来自Solidity docs

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-23
      • 2018-11-12
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2012-10-19
      • 2021-05-11
      相关资源
      最近更新 更多