谷歌没有给我一个具体的答案,是否使用require()
中的Solidity
功能消耗了气体?即使函数中的语句被评估为true?
答案 0 :(得分:2)
我不太确定你是否会询问OPCODE本身是否会消耗气体,或者如果声明评估为真,则是否消耗了气体。
如果你问的是OPCODE本身,我同意你的看法,答案不清楚。我在Google OPCODE gas usage spreadsheet或yellowpaper或Byzantium中没有看到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发布的任何气体。