【发布时间】:2018-06-13 03:37:30
【问题描述】:
谷歌没有给我一个具体的答案,在Solidity 中使用require() 函数会消耗任何气体吗?即使函数中的语句被评估为真?
【问题讨论】:
标签: ethereum solidity smartcontracts
谷歌没有给我一个具体的答案,在Solidity 中使用require() 函数会消耗任何气体吗?即使函数中的语句被评估为真?
【问题讨论】:
标签: ethereum solidity smartcontracts
我不太确定您是在询问 OPCODE 本身是否消耗气体,或者如果语句评估为真,是否消耗气体。
如果您询问的是 OPCODE 本身,我同意您的观点,即答案尚不清楚。我在Google OPCODE gas usage spreadsheet 或yellowpaper(附录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 执行还原操作(指令 0xfd) 用于要求样式的异常并执行无效操作 (指令 0xfe)抛出一个断言式异常。在这两种情况下, 这会导致 EVM 恢复对状态所做的所有更改...请注意,断言式异常会消耗所有气体 可用于调用,而 require 样式的异常不会消耗 从 Metropolis 版本开始的任何气体。
【讨论】: