宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > BNB价格 > 正文

柏林硬分叉对 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。所以没有什么可说的。

以太坊开发者Tim Beiko解释为何柏林升级没有纳入EIP-2537:以太坊开发者Tim Beiko解释为何柏林升级没有纳入EIP-2537表示,其在柏林升级需要更多测试,团队总体都同意,但是当我们讨论将它包含在伦敦升级时,有人提出了一个我们应该使用的新库,并可能修改gas成本,这需要更多的测试,因为它没有削减gas。此外,它从一个非常好的拥有(预存款合约启动以验证存款)变成了“我们在分片之前需要这个”,因此紧迫性大大降低。[2021/6/8 23:21:36]

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

以太坊开发人员更新柏林硬分叉草案:包含五个EIP,剔除EIP-2537:以太坊开发人员James Hancock在推特发布更新后的柏林硬分叉草案和议程,草案的最终版本中列出了五个EIP:EIP-2565、EIP-2315、EIP-2929、EIP-2718和EIP-2930。EIP-2565和EIP-2929将重新考虑某些操作的Gas价格,而EIP-2315引入了三个新的操作码来支持“子程序”,这是一种特殊的编程机制。EIP-2718和EIP-2930引入了新的交易类型,最新版本允许创建交易计划访问的合同“白名单”。 EIP-2537则被排除,EIP-2537原本将引入新的操作类型(BLS曲线)。[2021/1/20 16:33:24]

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

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

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

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

接下来谈谈新的gas消耗。

柏林区块链公司Madana电子数据保护专利获批:金色财经独家获悉,柏林区块链公司Madana此前提交的“支持透明且不间断报酬的第三方数据处理电子数据自动保护流程”专利已经获批,并于3月2日正式激活,预计专利到期时间为2038年3月23日。根据介绍,每个人都是数据创建者,尤其是使用数字服务(比如应用程序、浏览器)或使用社交网络(比如Facebook、Twitter)的时候,另外,温度传感器、铣床、脉冲计数器之类对人有帮助的电子设备也会生成可以评估的电子数据,因此非常有价值。但是,数据生成方通常不能自由地确定其数据,通常必须同意服务提供者的非透明条款和条件才能使用其服务,从而将数据权利移交给服务提供者。金色财经了解到,Madana的专利提供了一种用于保护电子数据的方法和系统,在第三方进行数据处理之后,允许数据接收者在不知道数据生成者身份的情况下为他们提供补偿。

此外,Madana也是Lisk上首个侧链项目,在遵守《通用数据保护条例》“Privacy-by-Design隐私设计”要求的基础上为跨行业数据共享和数据分析提供透明平台,让用户自己掌握自己的“数据主权”。[2020/3/3]

柏林后的SLOAD

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

柏林后的SSTORE

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

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

动态 | 德国电信旗下实验室与柏林州立大学就区块链技术展开合作:6月12日,德国电信宣布,其旗下和T-Labs创新实验室已开始与柏林州立CBOE应用科技大学合作,专注于区块链技术。[2019/6/14]

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

如果被访问过了,20000

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

如果存储密钥没有被访问过,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。

动态 | EOS 都柏林宣布支持WORBLI:据IMEOS报道,自EOS纽约宣布与WORBLI展开合作后,EOS都柏林发公告称将成为WORBLI区块链的首批BP之一。[2018/9/1]

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

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

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

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

访问过的地址

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

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

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

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

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

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

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

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

eth_createAccessListRPC方法

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

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

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

给合约松绑

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

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

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

自己做检验

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

参考文献

EIP-2929?和?EIP-2930?是与本文相关的两个柏林硬分叉EIP。

EIP-2930依赖于柏林硬分叉的另一部分:?EIP-2718,它又叫类型交易。

EIP-2929参考了很多?EIP-2200,因此如果你想深入了解gas成本,你可以从那里开始。

标签:GASLOTSLOTSTORugas币怎么找不到了PLOT币Slothi TokenDDS Store

BNB价格热门资讯
一文尽览DFINITY生态项目

本周,去中心化计算平台DFINITY宣布将于北京时间5月8日凌晨1时上线Beta主网。经历多次延迟,“鸽王”DFINITY终于要来了,目前DFINITY生态已经有哪些项目?本文将为你一一梳理.

1900/1/1 0:00:00
金色观察丨谁能在去中心化借贷赛道上脱颖而出?

金色财经区块链4月17日讯??距离去年夏天的“DeFi热潮”已经过去将近一年,但该领域持续创新的脚步并没有停止下来,如今有不少全新的去中心化金融借贷协议出现,都试图为贷款提供者和贷款接受者提供更具竞争力的价格.

1900/1/1 0:00:00
MOV即日起开放超导自治权

即日起,MOV将“开放超导自治权”,超导自治权开放使得新流动性池具备较有竞争力的流动性,让MOV生态的持续发展变得更为便捷。同时SUP作为生态内的价值交换枢纽,开启社区超导自治也为SUP提供新的价值捕获机制.

1900/1/1 0:00:00
财联社:美元的两面“镜子”:欧元和加密货币

近期美元指数走势引发市场分歧。今年4月以来,美元指数由涨转跌:截至4月16日,美元指数收于91.5,相较3月30日的93.3已下跌约2%.

1900/1/1 0:00:00
券商中国:太猴急?!刚上市就集体减持,4000亿数字货币巨头怎么了?CFO清仓、董事长套现19亿,币圈信仰要崩

来源:券商中国 记者:巫乐定 刚上市就套现,币圈不香了?刚刚上市的加密数字货币交易所Coinbase遭到一轮凶猛的减持潮.

1900/1/1 0:00:00
2021Q1永续合约市场交易数据分析报告(BMEX篇)

前言 数字资产市场于2017年牛市爆发以来,逐步形成明显的头部效应,期货合约市场同样不例外,Binance、Huobi、OKEx三家交易所承担了全市场一半的交易额。截止至今,BTC连破历史新高的背景下,三家交易所的龙头地位仍未改变.

1900/1/1 0:00:00