【问题标题】:How does assigning to `uint` save "storage read" costs in Ethereum?分配给 `uint` 如何在以太坊中节省“存储读取”成本?
【发布时间】:2022-01-03 21:35:30
【问题描述】:

我正在看 uniswapv2 教程walkthrough

以下是引用此函数in the github repo 并且教程声明如下:

    uint _kLast = kLast; // gas savings

kLast 状态变量位于 storage 中,所以它会有一个 对合约的不同调用之间的值。访问存储是一种 比访问释放的易失性内存要贵得多 当对合约的函数调用结束时,我们使用内部 变量以节省气体。

所以在传统编程中,_kLast 将是对kLast 的引用。 _kLast 在实例化后又被引用了 3 次。

  • 如果他们只使用 kLast 作为变量,而不是将其分配给 uint,那么每次使用 kLast 时是否需要读取存储空间?
  • 如果不是这样,那我真的不明白他们是如何节省汽油的,谁能解释一下?

【问题讨论】:

    标签: ethereum solidity


    【解决方案1】:

    同一个槽的每次存储读取(操作码sload)在交易期间第一次需要花费 2,100 gas,然后在同一交易期间相互花费 100 gas。 (在柏林硬分叉中实现EIP-2929 之后。在此之前,无论您执行多少次读取,每次读取都是800。)

    每次内存写入(操作码 mstore)和每次内存读取(操作码 mload)需要 3 个气体。


    所以在传统编程中,_kLast 将是对kLast 的引用

    在这个特定的 Solidity sn-p 中,_kLast 不是指向存储的引用。它是一个内存变量,其值是从存储变量分配的。

    因此 3 次存储读取 - 不创建内存变量 - 将花费 2,300 gas (= 2,100 + 100 + 100)。

    但由于代码创建了内存变量,它执行了一次存储读取(2,100 gas)、一次内存写入(3 gas)和三次内存读取(3 x 3 gas) - 总共 2,112 gas。哪个更便宜。


    其他一些与 EVM 兼容的网络,例如 BSC,可能仍使用每个 sload 的原始气体计算 800。这将产生更大的差异 - 未优化的 2,400 gas (3 x 800) 和优化的 812 gas (800 + 3 + 3x3)。

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 2018-11-22
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多