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

我的网站

当前位置: 主页 > 竞争币

柏林硬分叉对 Gas 影响几何?

时间:2021-04-16 19:02来源:未知 作者:admin 点击:
柏林硬分叉已于4月14日在主网上线,引入了四份EIP。其中的两份(EIP-2929和EIP-2930)对交易的gas成本有影响。本文将解释部分gas成本在柏林前是如何计算的,加入了EIP-2929后会如何变化,以

柏林硬分叉已于4月14日在主网上线,引入了四份EIP。其中的两份(EIP-2929和EIP-2930)对交易的gas成本有影响。本文将解释部分gas成本在柏林前是如何计算的,加入了EIP-2929后会如何变化,以及如何使用EIP-2930引入的访问列表。

要点速览

这篇文章很长,这是它的概要:

柏林硬分叉改变一些操作码的gas成本。如果在一个dapp或一个智能合约里gas费的值是硬编码的,它们可能会中止运行。如果这种情况发生了,且智能合约是不可更新的,消费者将需要用EIP-2930的访问列表才能使用那部分的操作码。

访问列表可以用作减少少量的gas成本,但实际上它们在一些情况下是会增加总gas消耗量的。

geth增加了一个叫eth_createAccessList的新RPC方法,用以简化访问列表的创建。

柏林硬分叉前的gas成本

EVM执行的每个操作码都有一笔相关的gas成本。它们大多数的成本是固定的:PUSH1总是消耗3个单位的gas,MUL消耗5个,等等。其他一些是会变化的:比如SHA3的操作码成本依赖于它的输入大小。

我们主要讨论操作码SLOAD和SSTORE,因为它们是最受柏林硬分叉影响的。我们以后会讨论针对地址的操作码,比如所有的EXT*和CALL*,因为它们的gas成本也改变了。

柏林前SLOAD的gas成本

在没有EIP-2929之前,SLOAD的gas消耗很简单:它总是消耗800 gas。所以(目前)没有什么可说的。

柏林前SSTORE的gas成本

在gas消耗方面,SSTORE可能是最复杂的操作码了,因为它的成本取决于像存储slot的当前值、新值、以及它是否之前被修改过。我们仅对一些情况进行分析以获得一个基本理解;如果你想了解更多,请阅读文末的EIP链接。

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

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

如果存储slot的值从1(或任何非0的值)变成0,gas消耗量也是5000,但在交易的最后你会获得1笔gas费返还。本文不会讨论gas费返还,因为它们在柏林硬分叉中不受影响。

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

这部分的细节并不有趣,重要的是SSTORE很贵,而它的消耗取决于几个因素。

EIP-2929后的gas消耗

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

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

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