以太坊Solidity——require()会使用任何gas吗?

15

谷歌无法给我一个确切的答案,使用 Solidity 中的 require() 函数是否会消耗任何 gas?即使函数中的语句被评估为 true 也是如此吗?

3个回答

16

我不太确定你是否在问OPCODE本身是否会消耗gas,还是询问如果语句评估为true是否会消耗gas。

如果你在问的是OPCODE本身,我同意你的看法,答案不清楚。在(现在非常过时的)Google OPCODE gas usage spreadsheet 或者 黄皮书(附录G)中我没有看到REVERT OPCODE(这就是require()被编译成的代码)。

在Remix中进行测试,看起来它确实消耗了一小部分gas。在此方法顶部添加require(true)调用仅增加了23个gas的使用。

contract GasUsage {
    uint val;

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

        delete val;
    }
}

包含该代码时的执行成本:5230

注释掉该代码时的执行成本:5207


如果您询问在 require 语句之前的 gas 消耗情况,那么答案是肯定的。自Byzantium版本发布以来,所有在 require 语句之前消耗的 gas 将被消耗,但任何剩余的 gas 将被退回。在 Byzantium 之前,require()assert() 是相同的,所有 gas 都将被消耗。

根据 Solidity 文档

在内部,Solidity 对于类似于 require 的异常执行 revert 操作(指令 0xfd),对于类似于 assert 的异常执行无效操作(指令 0xfe)。在这两种情况下,这会导致 EVM 回滚对状态所做的所有更改...请注意,类似于 assert 的异常会消耗调用可用的所有 gas,而在 Metropolis 发布后,类似于 require 的异常将不会消耗任何 gas。


2

require在失败的情况下不使用gas,但会在其评估为true时使用。在失败的情况下,状态将被还原,并返回“UNUSED” gas。但它不会返回已经消耗的gas。

function test() public view {
    // some function logic;
    require(condition,"")
}

在这种情况下,如果require失败,用于执行“某些函数逻辑”的燃气将不会被还原。这就是为什么在函数开头使用require的原因。

1

补充前面的答案,现在已经可以在https://www.evm.codes/中检查REVERT操作码,最小燃气量为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接