织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

以太坊柏林硬分叉完成,Gas 费会受到哪些影响?(2)

时间:2021-04-16 12:12来源:未知 作者:admin 点击:
EIP-2929 对上述所有操作码的 gas 消耗都有影响。但在深入这些变化前,我们需要先谈谈这份 EIP 引入的一个重要概念: 访问过的地址 (accessed addresses) 与访问

EIP-2929 对上述所有操作码的 gas 消耗都有影响。但在深入这些变化前,我们需要先谈谈这份 EIP 引入的一个重要概念:访问过的地址 (accessed addresses) 与访问过的存储密钥 (accessed storage keys)。

如果一个地址或一个存储密钥在之前的交易中被「使用」过,那么它们就会被视为「访问过的」。例如,当你 CALL(调用)一个其他合约,该合约的地址就会被标为「 accessed (访问过的)」。同样地,当你 SLOAD(加载)或 SSTORE(存储)一些 slot 的时候,交易的其他部分也会被视为访问过的。哪个操作码执行它并不重要:如果一个 SLOAD 读取了一个 slot,接下来的 SLOADSSTORE 都会被视为访问过的。

这里值得注意的是,存储密钥是「内置于」一些地址的。就如这份 EIP 所解释:

「在执行交易时,维持一组 accessed_addresses: Set[Address]accessed_storage_keys: Set[Tuple[Address, Bytes32]]

也就是说,当我们说一个存储 slot 被访问了,我们实际上说的一对 (address, storageKey) 被访问了。

接下来谈谈新的 gas 消耗。

柏林后的 SLOAD

在柏林硬分叉之前,SLOAD 固定消耗 800 gas。现在,它取决于该存储 slot 是否被访问过。如果它没有被访问过,gas 消耗是 2100;如果被访问过了,则是 100。因此,如果该 slot 是在访问过的存储密钥列表里的,SLOAD 的 gas 消耗会少于 2000。

柏林后的 SSTORE

让我们在 EIP-2929 语境下重温前面的 SSTORE 例子:

如果存储 slot 的值从 0 变成 1 (或任何非 0 的值),gas 消耗量是:

  • 如果存储密钥没有被访问过,22100

  • 如果被访问过了,20000

如果存储 slot 的值从 1 变成 2 (或任何其他非 0 的值),gas 消耗量是:

  • 如果存储密钥没有被访问过,5000

  • 如果被访问过了,2900

如果存储 slot 的值从 1 (或任何非 0 的值) 变成 0,gas 消耗与上一种情况一样,再加上返还。

如果存储 slot 的值在之前相同的交易中被修改了,往后所有 SSTORE 的 gas 消耗量都是 100。

如你所见,如果 SSTORE 正在修改的 slot 是之前被访问过的,第一个 SSTORE 消耗少于 2100 gas。

总结

下表对上述的值进行了比较:

以太坊柏林硬分叉完成,Gas 费会受到哪些影响?

请注意,在最后一行没有必要谈论 slot 是否已经被访问过,因为如果它之前就被写入,那它就被访问过了。

EIP-2930: 可选访问列表交易

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容