他们说
assert
主要是为了使用代码分析器来检测我们合约中的逻辑错误,但为什么它也消耗剩余的gas?
我们不能使用一个新的关键字,它的作用相同(就像
require
),但不消耗剩余的gas?
花费尽可能少的gas不是更好吗?Solidity不应该对其功能进行一些改变吗?
我只是不明白目的(因为每个答案都只是指定断言是为了检查永远正确的事情,而 require 是为了检查用户的输入;但这不是我的答案)。
我猜其他人也有和你一样的问题,因为从 Solidity 0.8 开始,
assert
不再消耗剩余的gas了:
失败的断言和其他内部检查(例如除以零或算术溢出)不使用无效操作码,而是使用恢复操作码。更具体地说,他们将使用等于对 Panic(uint256) 的函数调用的错误数据,并带有特定于情况的错误代码。
这将节省错误时的gas,同时仍然允许静态分析工具将这些情况与无效输入的恢复区分开来,例如失败的需求。
(来自 https://docs.soliditylang.org/en/latest/080-writing-changes.html)