假设我与分支有一个智能合约,其中每个分支都有不同数量的操作。
if (someCondition) {
// do operations costing 10 gas
} else {
//do operations costing 100 gas
}
Run Code Online (Sandbox Code Playgroud)
当用户从他们的客户端(例如元掩码)调用此函数时,他们如何知道他们的交易将花费多少天然气?他们是否只需要猜测并为最昂贵的路径添加足够的汽油?
您可以在以太坊黄皮书(第 27 页)中找到与交易可能影响的许多抽象操作的相对成本(以天然气为单位)相对应的所有值。
低级语言中的“if”语句被视为“JUMP”操作(改变程序计数器)。因此,在 Gas 成本表(第 27 页)中,JUMPDEST 操作成本为 1 Gas 值。
客户端应用程序几乎总是能够计算气体使用量。要么通过运行自己的 EVM 模拟器,要么通过查询模拟交易并返回结果的外部 API。
所有区块链数据都是公开可供读取的(甚至是私有属性的值 - 只是不是使用 Solidity,而是使用更底层的方法并查询存储槽),并且每个操作的 Gas 成本都是预先确定的。
这样客户就知道交易将进行
它还知道 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)
归档时间: |
|
查看次数: |
1728 次 |
最近记录: |