gpt4 book ai didi

ethereum - 在以太坊中分配给 `uint` 如何节省 "storage read"成本?

转载 作者:行者123 更新时间:2023-12-03 08:11:59 25 4
gpt4 key购买 nike

我正在看uniswapv2教程walkthrough .

以下内容引用此函数in the github repo教程说明如下:

    uint _kLast = kLast; // gas savings

The kLast state variable is located in storage, so it will have avalue between different calls to the contract. Access to storage is alot more expensive than access to the volatile memory that is releasedwhen the function call to the contract ends, so we use an internalvariable to save on gas.

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

  • 如果他们仅使用 kLast 作为变量,而不将其分配给 uint,那么每次 kLast 执行时是否会花费一次存储读取用过吗?
  • 如果情况并非如此,那么我真的不明白他们是如何节省汽油的,有人可以解释一下吗?

最佳答案

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

每次内存写入(操作码mstore)和每次内存读取(操作码mload)都会花费3个gas。


So in traditional programming, _kLast would be a reference to kLast

在此特定的 Solidity 代码段中,_kLast 不是指向存储的引用。它是一个内存变量,具有从存储变量分配的值。

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

但由于代码创建了内存变量,因此它执行一次存储读取 (2,100 Gas)、一次内存写入 (3 Gas) 和 3 次内存读取 (3 x 3 Gas) - 总计 2,112 Gas。这是一个更便宜的选择。


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

关于ethereum - 在以太坊中分配给 `uint` 如何节省 "storage read"成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70571700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com