使用 if 语句时如何计算 gas 使用量
How is gas usage calculated when using if statements
假设我与分支机构有一个智能合约,其中每个分支机构都有不同数量的操作。
if (someCondition) {
// do operations costing 10 gas
} else {
//do operations costing 100 gas
}
当用户从他们的客户端调用这个函数时,比如 metamask,他们如何知道他们的交易将花费多少 gas?他们是否只需要猜测并为最昂贵的路径添加足够的燃料?
您可以在 Ethereum yellow paper(第 27 页)中找到与交易可能影响的一些抽象操作的相对成本(以气体计)相对应的所有值。
低级语言中的“if”语句被认为是“JUMP”操作(改变程序计数器)。因此在 gas 成本 table(第 25 页)中表示 JUMPDEST 操作成本为 1 gas 值。
客户端应用程序几乎总是能够计算气体使用量。通过 运行 他们自己的 EVM 模拟器,或者通过查询模拟交易的外部 API 并 return 得到结果。
所有区块链数据都是公开可供阅读的(甚至是私有属性的值——只是不是使用 Solidity,而是使用更底层的方法和查询存储槽),并且每个操作的 gas 成本是预先确定的。
所以客户知道,交易将要
- 从内存中读取一个插槽
- 写入存储槽
- 在内存中声明另一个插槽并return它
而且它还知道一个 MLOAD
花费 3 gas,一个 SSTORE
花费 5,000 gas,等等
它可以使用所有这些数据来计算最终成本。
例外情况是当决策树基于 block.timestamp
等事先未知的块数据时。然后这取决于客户,但我的猜测是大多数人建议最昂贵的组合,这样他们就可以降低由于 gas 不足而导致交易恢复的风险。
示例:
if (block.timestamp % 2 == 0) {
// even second, do operations costing 10 gas
} else {
// odd second, do operations costing 100 gas
}
假设我与分支机构有一个智能合约,其中每个分支机构都有不同数量的操作。
if (someCondition) {
// do operations costing 10 gas
} else {
//do operations costing 100 gas
}
当用户从他们的客户端调用这个函数时,比如 metamask,他们如何知道他们的交易将花费多少 gas?他们是否只需要猜测并为最昂贵的路径添加足够的燃料?
您可以在 Ethereum yellow paper(第 27 页)中找到与交易可能影响的一些抽象操作的相对成本(以气体计)相对应的所有值。
低级语言中的“if”语句被认为是“JUMP”操作(改变程序计数器)。因此在 gas 成本 table(第 25 页)中表示 JUMPDEST 操作成本为 1 gas 值。
客户端应用程序几乎总是能够计算气体使用量。通过 运行 他们自己的 EVM 模拟器,或者通过查询模拟交易的外部 API 并 return 得到结果。
所有区块链数据都是公开可供阅读的(甚至是私有属性的值——只是不是使用 Solidity,而是使用更底层的方法和查询存储槽),并且每个操作的 gas 成本是预先确定的。
所以客户知道,交易将要
- 从内存中读取一个插槽
- 写入存储槽
- 在内存中声明另一个插槽并return它
而且它还知道一个 MLOAD
花费 3 gas,一个 SSTORE
花费 5,000 gas,等等
它可以使用所有这些数据来计算最终成本。
例外情况是当决策树基于 block.timestamp
等事先未知的块数据时。然后这取决于客户,但我的猜测是大多数人建议最昂贵的组合,这样他们就可以降低由于 gas 不足而导致交易恢复的风险。
示例:
if (block.timestamp % 2 == 0) {
// even second, do operations costing 10 gas
} else {
// odd second, do operations costing 100 gas
}