Ethereum 使用if语句时如何计算气体使用量

Ethereum 使用if语句时如何计算气体使用量,ethereum,solidity,Ethereum,Solidity,假设我与branch有一个智能合约,其中每个分支都有不同数量的操作 if (someCondition) { // do operations costing 10 gas } else { //do operations costing 100 gas } 当用户从他们的客户机(比如metamask)调用此函数时,他们如何知道他们的交易将花费多少资金?他们是否只需要猜测并包含足够的gas以用于最昂贵的路径?您可以在(第25页)中找到与交易可能影响的许多抽象操作的相对成本(gas)对应

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

if (someCondition) {
  // do operations costing 10 gas
} else {
  //do operations costing 100 gas
}

当用户从他们的客户机(比如metamask)调用此函数时,他们如何知道他们的交易将花费多少资金?他们是否只需要猜测并包含足够的gas以用于最昂贵的路径?

您可以在(第25页)中找到与交易可能影响的许多抽象操作的相对成本(gas)对应的所有值

低级语言中的“IF”状态是一个“跳”操作(改变DE程序计数器)。因此,在天然气成本表(第25页)中,JUMPDEST操作的天然气价值为1


您可以在(第25页)中找到与交易可能影响的许多抽象操作的相对成本相对应的所有值

低级语言中的“IF”状态是一个“跳”操作(改变DE程序计数器)。因此,在天然气成本表(第25页)中,JUMPDEST操作的天然气价值为1


客户端应用程序几乎总是能够计算气体使用量。通过运行他们自己的EVM仿真器,或者通过查询模拟事务并返回结果的外部API

所有区块链数据都可以公开读取(即使是私有财产的价值——只是不具有可靠性,而是使用更低级的方法和查询存储槽),并且每个操作的天然气成本都是预先确定的

因此,客户知道,交易即将结束

  • 从内存中读取一个插槽
  • 写入存储槽
  • 在内存中声明另一个插槽并返回它
  • 而且它还知道一个
    MLOAD
    要花3汽油,一个
    SSTORE
    要花5000汽油,等等

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


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

    例如:

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

    客户端应用程序几乎总是能够计算气体使用量。通过运行他们自己的EVM仿真器,或者通过查询模拟事务并返回结果的外部API

    所有区块链数据都可以公开读取(即使是私有财产的价值——只是不具有可靠性,而是使用更低级的方法和查询存储槽),并且每个操作的天然气成本都是预先确定的

    因此,客户知道,交易即将结束

  • 从内存中读取一个插槽
  • 写入存储槽
  • 在内存中声明另一个插槽并返回它
  • 而且它还知道一个
    MLOAD
    要花3汽油,一个
    SSTORE
    要花5000汽油,等等

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


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

    例如:

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