使用if语句时如何计算gas使用量

Zar*_*oon 3 ethereum solidity

假设我与分支有一个智能合约,其中每个分支都有不同数量的操作。

if (someCondition) {
  // do operations costing 10 gas
} else {
  //do operations costing 100 gas
}
Run Code Online (Sandbox Code Playgroud)

当用户从他们的客户端(例如元掩码)调用此函数时,他们如何知道他们的交易将花费多少天然气?他们是否只需要猜测并为最昂贵的路径添加足够的汽油?

And*_*iol 5

您可以在以太坊黄皮书(第 27 页)中找到与交易可能影响的许多抽象操作的相对成本(以天然气为单位)相对应的所有值。

低级语言中的“if”语句被视为“JUMP”操作(改变程序计数器)。因此,在 Gas 成本表(第 27 页)中,JUMPDEST 操作成本为 1 Gas 值。

在此输入图像描述 在此输入图像描述


Pet*_*jda 5

客户端应用程序几乎总是能够计算气体使用量。要么通过运行自己的 EVM 模拟器,要么通过查询模拟交易并返回结果的外部 API。

所有区块链数据都是公开可供读取的(甚至是私有属性的值 - 只是不是使用 Solidity,而是使用更底层的方法并查询存储槽),并且每个操作的 Gas 成本都是预先确定的。

这样客户就知道交易将进行

  1. 从内存中读取一个槽
  2. 写入存储槽
  3. 在内存中声明另一个槽并返回它

它还知道 1 个MLOAD需要 3 Gas,1 个SSTORE需要 5,000 Gas,等等。

它可以使用所有这些数据来计算最终成本。


例外情况是当决策树基于块数据(例如 )时block.timestamp,这是事先未知的。然后这取决于客户,但我的猜测是大多数人建议最昂贵的组合,这样他们就可以降低由于天然气不足而导致交易恢复的风险。

例子:

if (block.timestamp % 2 == 0) {
    // even second, do operations costing 10 gas
} else {
    // odd second, do operations costing 100 gas
}
Run Code Online (Sandbox Code Playgroud)