谷歌无法给我一个确切的答案,使用 Solidity
中的 require()
函数是否会消耗任何 gas?即使函数中的语句被评估为 true 也是如此吗?
谷歌无法给我一个确切的答案,使用 Solidity
中的 require()
函数是否会消耗任何 gas?即使函数中的语句被评估为 true 也是如此吗?
我不太确定你是否在问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。
require
在失败的情况下不使用gas,但会在其评估为true
时使用。在失败的情况下,状态将被还原,并返回“UNUSED” gas。但它不会返回已经消耗的gas。
function test() public view {
// some function logic;
require(condition,"")
}
require
失败,用于执行“某些函数逻辑”的燃气将不会被还原。这就是为什么在函数开头使用require
的原因。