Ethereum Solidity - require() 是否使用任何气体?
Ethereum Solidity - Does require() use any gas?
Google没能给我一个具体的答案,在Solidity
中使用require()
函数会消耗gas吗?即使函数中的语句被评估为真?
我不太确定您是在询问 OPCODE 本身是否消耗气体,或者如果语句计算结果为真,是否消耗气体。
如果您问的是 OPCODE 本身,我同意您的看法,即答案不明确。我没有在(现在非常不赞成使用)Google OPCODE gas usage spreadsheet or in the yellowpaper(附录 G)中看到 REVERT
操作码(require()
被编译成)。
运行 Remix中的一个测试,看起来确实消耗了很少的gas。只需在此方法的顶部添加一个 require(true)
调用即可将 gas 使用量增加 23。
contract GasUsage {
uint val;
function someFunc() public returns (bool) {
require(true);
delete val;
}
}
included:5230
时的执行成本
注释掉时的执行成本:5207
如果您询问 require
语句之前的耗气量,那么答案是肯定的。从 Byzantium 版本开始,在 require
语句点之前消耗的所有气体都已消耗,但会返回任何剩余的气体。在拜占庭之前,require()
和 assert()
是相同的,所有的气体都会被消耗。
Internally, Solidity performs a revert operation (instruction 0xfd)
for a require-style exception and executes an invalid operation
(instruction 0xfe) to throw an assert-style exception. In both cases,
this causes the EVM to revert all changes made to the state...Note that assert-style exceptions consume all gas
available to the call, while require-style exceptions will not consume
any gas starting from the Metropolis release.
Google没能给我一个具体的答案,在Solidity
中使用require()
函数会消耗gas吗?即使函数中的语句被评估为真?
我不太确定您是在询问 OPCODE 本身是否消耗气体,或者如果语句计算结果为真,是否消耗气体。
如果您问的是 OPCODE 本身,我同意您的看法,即答案不明确。我没有在(现在非常不赞成使用)Google OPCODE gas usage spreadsheet or in the yellowpaper(附录 G)中看到 REVERT
操作码(require()
被编译成)。
运行 Remix中的一个测试,看起来确实消耗了很少的gas。只需在此方法的顶部添加一个 require(true)
调用即可将 gas 使用量增加 23。
contract GasUsage {
uint val;
function someFunc() public returns (bool) {
require(true);
delete val;
}
}
included:5230
时的执行成本注释掉时的执行成本:5207
如果您询问 require
语句之前的耗气量,那么答案是肯定的。从 Byzantium 版本开始,在 require
语句点之前消耗的所有气体都已消耗,但会返回任何剩余的气体。在拜占庭之前,require()
和 assert()
是相同的,所有的气体都会被消耗。
Internally, Solidity performs a revert operation (instruction 0xfd) for a require-style exception and executes an invalid operation (instruction 0xfe) to throw an assert-style exception. In both cases, this causes the EVM to revert all changes made to the state...Note that assert-style exceptions consume all gas available to the call, while require-style exceptions will not consume any gas starting from the Metropolis release.