宇宙链 宇宙链
Ctrl+D收藏宇宙链

以太坊柏林硬分叉完成 Gas费会受到什么影响?

作者:

时间:1900/1/1 0:00:00

柏林硬分叉已于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消耗很简单:它总是消耗800gas。所以没有什么可说的。

柏林前SSTORE的gas成本

以太坊Layer2上总锁仓量为53.2亿美元:金色财经报道,L2BEAT数据显示,截至目前,以太坊Layer2上总锁仓量为53.2亿美元,近7日跌0.71%。其中锁仓量最高的为扩容方案ArbitrumOne,约26.8亿美元,占比50.47%,其次是Optimism,锁仓量16.8亿美元,占比31.57%。[2023/1/29 11:34:41]

在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引入的一个重要概念:访问过的地址(accessedaddresses)与访问过的存储密钥(accessedstoragekeys)。

Unchained主理人:TenX 创始人疑似为2016年盗取360万枚以太坊的黑客:2月22日消息,前福布斯记者,《 Unchained》主理人Laura Shin在最新播客中表示她发现了以太坊 2016年 The?DAO?事件中黑客的身份,疑似为Toby Hoenisch,一位 36 岁的奥地利程序员,TenX 的联合创始人兼首席执行官。其主要依托对嫌疑人的数据追踪以及区块链分析公司 Chainalysis?的链上分析,锁定了TenX 位于新加坡的的节点地址。

2016年4月30日,The DAO 项目在以太坊中进行代币众筹,到 5 月 28 日,这个项目筹集了 1150 万个以太坊,以当时以太坊的价格计算价值超过1.5亿美元,是当时最大金额的众筹。6 月 17 日,黑客利用漏洞向一个匿名的地址转移走了项目众筹来的 360 万枚以太币,占到总数的 1/3,该事件也导致以太坊的分叉。[2022/2/22 10:08:53]

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

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

「在执行交易时,维持一组accessed_addresses:Set和accessed_storage_keys:Set]」

古根海姆创始人:以太坊实用性远高于比特币:古根海姆投资公司创始人Todd Morley在接受彭博电视台采访时表示,以太坊的实用性比比特币“高得多”。他认为,任何没有数字化技术战略的行业都将“破产”。Todd Morley表示,区块链技术正以非常快的速度进入世界其他地区。他说,以太坊的应用程序开发人员连续六年以20倍的速度增长。Morley表示,以太坊的实用功能和资产访问的大规模部署“还没有发生,所以希望成为这方面的领导者”。Morley还谈到了加密货币市场的价格波动,并表示这仍然是一个非常小的市场,所以缺乏流动性,这只是一个“典型的年轻市场”。(The Block)[2021/5/25 22:42:14]

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

接下来谈谈新的gas消耗。

柏林后的SLOAD

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

柏林后的SSTORE

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

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

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

如果被访问过了,20000

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

动态 | 莫斯科政府将利用以太坊促进周末农贸市场分配交易透明度:据Coindesk消息,莫斯科政府将利用以太坊促进周末农贸市场分配交易系统交易透明度。该系统将记录农民提交的商业地块申请。政府称,整个系统的数据集是公开可见的,透明的,可供下载。在这种情况下,可以确认提交时间,而一旦提交了申请人就不能删除或更改申请。据悉该农贸市场约有1.5万个交易场所可供争夺,市场从4月20日至11月25日开放,还有来自俄罗斯、亚美尼亚、白俄罗斯、哈萨克斯坦和吉尔吉斯斯坦的农民参与。[2018/8/29]

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

如果被访问过了,2900

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

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

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

总结

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

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

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

我们一开始提及的其他EIP就是EIP-2930。这份EIP增加了一种新的交易类型,它可以在交易里加入一个访问列表。这意味着你可以在交易执行开始前,事先声明哪些地址和slot应被视为访问过的。例如,一个未被访问过的slot的一个SLOAD需要消耗2100gas,但如果该slot被加入到交易访问列表里,同一个操作码只需消耗100gas。

3.4万份以太坊智能合约存在安全漏洞:新加坡和英国几位研究员指出,包含440万个以太币的3.4万多份以太坊智能合约可能存在容易被攻击的漏洞。他们的技术报告目前还在同行评审中,指出由于智能合约编码不完善,存在数个漏洞,导致数百万美元的以太币暴露在风险中。报告作者宣称,已经用工具分析几乎一百万份智能合约,发现其中34,200存在漏洞,2,365属于著名项目。[2018/2/24]

但如果已经被访问过的地址或存储密钥会消耗更少gas,这是否意味着我们可以把所有东西都添加到交易访问列表来降低gas消耗了?棒!不用给gas费了!然而,不尽然是这样,因为你每次添加地址和存储密钥的时候还是需要支付gas费的。

我们来看一个例子。假如我们正在向合约A发送一笔交易,访问列表可能如下:

accessList:?}]

如果我们发送一笔附有这个访问列表的交易,使用slot0x0的第一个操作码是SLOAD,它消耗的是100而不是2100gas。这减少了2000gas。但每次把存储密钥添加到交易的访问列表中都需要消耗1900gas。因此我们只省了100gas。(如果访问该slot的第一个操作码是SSTORE而不是SLOAD,我们可以省2100gas,也就是说如果我们考虑的是存储密钥的消耗的话,我们总共节省200gas。)

这是否代表只要我们使用交易访问列表就能节省gas?不是的,因为我们还需要支付添加地址到访问列表(即我们的例子中的"")的gas。

访问过的地址

到目前为止,我们只讨论了操作码SLOAD和SSTORE,但柏林升级后不是只有这些操作码有变化。例如,操作码CALL之前的固定消耗量是700。但EIP-2929后,如果地址不在访问列表里,它的消耗量变成了2600,如果在,则是100。还有,像访问过的存储密钥,无论之前访问的是什么操作码(例如,如果EXTCODESIZE是第一次被调用,那么该操作码将消耗2600gas,而往后任何使用同一个地址的EXTCODESIZE、CALL还是STATICCALL都只消耗100gas)。

这是如何影响有访问列表的交易的呢?例如,假如我们给合约A发送一笔交易,而该合约调用另一个合约B,那么我们可以加入这样一个列表:

accessList:}]

我们将需要支付2400gas以把这个访问列表加入到交易里,但之后使用B地址的第一个操作码只消耗100gas,而不是2600。因此,我们通过这样做节省了100gas。如果B以某种方式使用它的存储,且我们知道使用的是哪个密钥,那么我们也可以把它们加入到访问列表里,这样可以为每个密钥节省100~200gas(取决于你的第一个操作码是SLOAD还是SSTORE)。

但是为什么我们要谈论另一个合约?我们正在调用的合约呢?为什么不对这个合约进行这些操作?

accessList:[

?{address:"",storageKeys:},

?{address:"",storageKeys:},

]

我们可以这样做,但这样不划算,因为EIP-2929明确规定正在被调用的合约(即tx.to)地址会默认加入到accessed_addresses列表里。因此我们无须支付多余的2400gas。

让我们再对之前的例子进行分析:

accessList:[{

?address:"",

?storageKeys:[

??"0x0000000000000000000000000000000000000000000000000000000000000000"

?]

}]

除非我们要加入多几个存储密钥,否则这其实很浪费。如果我们预设SLOAD总是首先使用存储密钥,那么我们起码需要24个存储密钥能保本。

你可以想象一下,做分析与手动创建一个访问列表并不那么有趣。幸运的是,其实有更好的方法。

eth_createAccessListRPC方法

Geth(从1.10.2版本开始)加入了一个新的eth_createAccessListRPC方法,你可以用它来生成访问列表。它的使用与eth_estimateGas相似,但它返回的不是gas估值,而是像下面这样的结果:

{

?"accessList":[

??{

???"address":"0xb0ee076d7779a6ce152283f009f4c32b5f88756c",

???"storageKeys":[

????"0x0000000000000000000000000000000000000000000000000000000000000000",

????"0x0000000000000000000000000000000000000000000000000000000000000001"

???]

??}

?],

?"gasUsed":"0x8496"

}

也就是它给你该交易会用到的地址与存储密钥的列表,加上访问列表被加入情况下所消耗的gas。但,这并不代表gas消耗量会低于在没有访问列表情况下发送同一笔交易所消耗的!

我想我们会随着时间推移发现使用它的正确方法,但我猜的伪代码如下:

letgasEstimation=estimateGas(tx)

let{accessList,gasUsed}=createAccessList(tx)

if(gasUsed>gasEstimation){

?deleteaccessList

}

tx.accessList=accessList;

ransaction(tx)

给合约松绑

值得一提的是,访问列表的主要目的不在于使用gas。如EIP所解释:

「减轻由EIP-2929引入的合约断裂风险,因为交易可以提前指定交易计划访问的账户和存储slot并提前支付;最终在实际执行中,操作码SLOAD和EXT*只消耗100gas:这个低gas消耗不仅可以防止由该EIP引起的断裂,还可以「松开」任何因EIP-1884而受限的合约。」

这意味着如果一个合约对执行某事务的成本做了假设,gas成本的增加就可能使它停止运作。例如,一个合约调用另一个合约,像这样someOtherContract.someFunction{gas:34500}(),因为它假设someFunction会准确消耗34500gas,这样它会出问题。但如果你添加了一个合理的访问列表,那么合约会再次运作。

自己做检验

如果你像自己去测试,复制这个代码库,里面由多个可以用Hardhat和geth执行的实例。在README查看说明。

原文标题:《柏林硬分叉对Gas影响几何?》

撰文:FrancoVictorio

翻译:ETH中文站

标签:GASESSTORSTOUGAS币LosslessTORISTORY

比特币交易热门资讯
老崔说币:比特币处于风口,上方能看到十万?

大家好,我是来自CKcoin平台首席分析师老崔说币,也是你们的朋友老崔说币lcsb18888,老崔说币公众号同步专注数字货币行情分析,争取为广大币友传递最有价值的币市信息,欢迎广大币友的关注与点赞.

1900/1/1 0:00:00
Coinbase上市三大影响:牛市拉长、上市潮与项目合规化

数周前,关于牛市能持续多久的讨论,神鱼对我回复的第一条是:取决于Coinbase能否成功上市。而这个问题的答案,如今大家都看到了。Coinbase上市绝非一帆风顺.

1900/1/1 0:00:00
关于CFG首发上线COINBIG公告

COINBIG数字资产平台即将上线CFG,并开放CFG/USDT交易对,具体详情如下:充值时间:2021年5月24日15:00交易时间:2021年5月25日15:00 币种全称:CFGame 币种简称:CFG SafeDAO关于“开放.

1900/1/1 0:00:00
关于合约交易对DOGE/USDT维护的公告

公告编号2021041605各位关心ZBG的投资者们和项目方:因DOGE价格波动剧烈,为控制风险,平台将暂停DOGE合约开仓交易,原有持仓不受影响。我们将持续跟踪DOGE价格波动情况,交易恢复时间待定,请持续留意后续公告.

1900/1/1 0:00:00
搞懂 “柏林” 之后的合约 Gas 开销

“柏林”硬分叉将在4月15日激活,该硬分叉所包含EIP中的两个都会影响事务的Gas开销。本文会解释“柏林”激活之前,一些操作码的Gas消耗量是如何计算的,而EIP-2929对此有何影响,以及,2930引入的访问清单功能应如何使用.

1900/1/1 0:00:00
Cyclone Protocol:匿名跨链机池V3.0上线

4月14日,Cointelegraph中文举办线上访谈对话栏目HUB,本期主题为《CycloneProtocol:全网匿名跨链机池V3.0重磅上线》,邀请到了Cyclone旋风协议中国社区核心贡献者Samwell作为本期活动嘉宾.

1900/1/1 0:00:00