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

搞懂 “柏林” 之后的合约 Gas 开销

作者:

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

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

摘要

这篇文章很长,你要是只想知道结论,看完这部分就可以把网页关掉了:

柏林硬分叉改变了某些操作码的Gas开销。如果你在自己的应用中硬编码了一些操作可使用的Gas数量,这些操作可能会卡死。如果真的出现了这种情况,而你的智能合约又是没法升级的,用户就需要使用“访问清单”功能来使用你的应用。

访问清单功能可略微减少Gas开销,但有些时候也可能会提高总的Gas消耗量。

geth客户端引入了一种新的RPC方法,叫做?eth_createAccessList?来简化访问清单的生成。

“柏林”升级以前的Gas开销

EVM所执行的每一个操作码都有一个对应的Gas消耗量。大部分操作码的消耗量都是固定的:PUSH1?总是消耗3gas,而?MUL?消耗5gas,等等。有一些操作码的消耗量是可变的:举个例子,SHA3?操作码的开销由输入值的长度决定。

我们先了解?SLOAD?和?SSTORE?操作码,因为这两个操作码受“柏林”影响最大。后面我们会再谈谈那些以地址为目标的操作,比如所有的?EXT*?类操作码和?CALL*?类操作码,因为它们的Gas开销也被改变了。

摩根大通:超七成华尔街交易员今年不打算碰加密货币:金色财经报道,摩根大通的一项调查显示,尽管加密货币近期走强,但72%的交易员表示,他们在2023年没有任何交易加密货币或者数字资产的计划。而在2022年,仅25%的交易员表达了这样的想法。这项调查是在今年1月份进行,此前加密货币经历了惨淡的2022年,比特币在去年暴跌了近七成。

调查显示,仅8%的交易员表示,他们目前在交易加密货币,14%的交易员表示计划在五年内进行交易。同时,6%的受访者表示,他们目前没有打算交易加密货币,但计划在12个月内进行买卖。进入2023年,尽管比特币狂飙39%,但这似乎无法吸引到华尔街投资者们更多的押注,尤其是考虑美联储加息进程尚未结束。[2023/2/2 11:43:26]

“柏林”以前的?SLOAD

在EIP-2929实施前,SLOAD?开销的计算方式很简单:总是消耗800gas。所以,也没啥可展开的。

“柏林”以前的?SSTORE

要讲到Gas消耗量的计算,SSTORE?操作码可能是最复杂的了。因为消耗多少取决于该存储项槽当前的值、要写入的新值、该存储项是否已经修改过。我们只会分析少数几种场景,了解个大概。如果你想了解更多,请阅读本文末尾所附的EIP链接。

如果存储项的值从0改为1,Gas消耗量是20000

如果存储项的值从1改为2,Gas消耗量是5000

如果存储项的值从1改为0,消耗量也是5000,但你会在事务执行结束后获得gas补贴。我们这里也不讨论gas返还机制,因为它不会受到柏林的影响

孙宇晨:Huobi已响应CZ关于暂停FTT存款的建议:11月13日消息,孙宇晨在社交媒体发文表示,Huobi Global已经响应CZ关于暂停FTT存款的建议并将密切关注情况。

据此前报道,CZ发推称,币安已停止FTT充值,以防止可疑的额外供应可能影响市场,币安将密切关注事态发展。CZ建议其他交易所也这样做,为了安全起见,以避免出现GALA类似的情况。CZ补充说,目前FTT合约部署者转移所有剩余价值4亿美元的FTT供应量,这些FTT本应分批解锁。[2022/11/13 12:58:27]

在一笔事务中,如果存储项已不是第一次修改,则后续每一次?SSTORE?都消耗800gas

细节在这里并不重要,重要的是,SSTORE?是昂贵的,具体消耗多少gas则依赖于多个因素。

EIP-2929之后的Gas消耗量

EIP-2929改变了所有这些数值。但在展开之前,我们要先谈谈该EIP引入的一个重要概念:被访问过的地址和被访问过的存储项的键。

当一个地址或者一个存储项的键,在一笔事务中被“使用过”之后,在该笔交易余下的执行过程中,这个地址都会被当成“已被访问过的”。举个例子,如果你在一笔事务中?CALL?另一个合约,那么该合约的地址就会被标记为“访问过的”。类似地,如果你?SLOAD?或者?SSTORE?过一些存储项槽,在该笔事务余下的执行过程里,这些槽也会被当成已经访问过的。到底用的哪个操作码是没有关系的,即使你只?SLOAD?过某个槽,接下来使用?SSTORE?时该槽也会被当成已访问过的。

法国授权协会Sacem公布区块链音乐知识产权保护:金色财经报道,法国音乐版权协会Sacem的子公司URights推出了Musicstart,使音乐家能够使用区块链保护自己的权利。这项服务是2017年推出的在线音乐平台URights的一部分,该平台是Sacem与IBM合作开发的,签订了10年的共同管理协议。(ledgerinsights)[2022/10/18 17:31:13]

注意:存储项的键是“内在于”某些地址中的,一如该EIP所解释的:

执行事务时,保持一个集合:accessed_addresses:Set?以及?accessed_storage_keys:Set]

也就是说,当我们说某个存储槽已被访问过了,我们的实际意思是:(address,storageKey)?已被访问过了。

搞清楚了这个概念,我们来谈谈新的Gas消耗量计算模式。

“柏林”以后的?SLOAD

升级前,SLOAD?的Gas消耗量是固定的800。但升级后,Gas消耗量要看这个存储槽是否已经被访问过。还没访问过的,消耗量就是2100gas;访问过的,就是100gas。所以,如果某个存储项槽已经在“已访问过的存储项键`的集合里了,就可以省掉2000gas。

“柏林”以后的?SSTORE

我们逐个逐个对比下,在EIP-2929实施后,上面的几个例子会发生什么样的变化:

如果存储项的值从0改为1,Gas消耗量是20000

Cowen数字资产部门Cowen Digital成立后六个月已吸引数十家客户:金色财经报道,投资银行Cowen的数字资产部门Cowen Digital在成立六个月的时间里已经吸引数十家机构客户。

据悉,Cowen Digital已经建立一个核心团队,预计团队规模最终将扩大到100多人。这还不包括Cowen内部支持该项目的大约40人。

Cowen Digital董事总经理兼负责人Drew Forman在接受采访时表示,“大型资产管理公司可能需要3到12个月才能真正推出加密策略。机构需求是存在的,我认为其兴趣是当前需求的10倍。”

Forman透露,Cowen Digital的下一步将是在未来几周内推出利用其Digital Prime投资的贷款产品,公司还计划在第四季度推出其掉期和衍生产品。

据此前报道,投行Cowen正在扩大其数字资产团队,聘请Jackie Rose为其Cowen Digital团队的机构销售总监,聘请Chase Campbell担任数字资产销售副总裁。(The Block)[2022/9/7 13:12:46]

如果该存储项键还未访问过,消耗22100gas

若已访问过,消耗20000gas

如果存储项的值从1改为2,Gas消耗量是5000

如果该存储项键还未访问过,消耗5000gas

若已访问过,消耗2900gas

如果存储项的值从1改为0,消耗量保持不变,gas返还机制也不变

Cosmos社区提案:建议提供15万枚ATOM资助转移至Cosmos的蓝筹项目:6月27日消息,Cosmos社区发布新提案,该提案建议提供15万枚ATOM资助转移至Cosmos的、将基于CosmWasm建立的蓝筹项目以及consumer chain的启动。该提案表示,将重点关注可以从流动性质押以及链间安全性(Interchain Security)中受益的项目,使得Cosmos Hub巩固作为Cosmos生态流动性质押资产主导的地位。此外,该资金还将用于资助验证节点“P2P”启动consumer chain,并将其作为托管Lido Finance流动性质押的链。[2022/6/27 1:34:09]

在一笔事务中,如果存储项已不是第一次修改,则后续每一次?SSTORE?都消耗100gas

由此可见,如果某个槽此前已访问过,则对它的第一次?SSTORE?操作会节约2100gas。

汇总一下

上面的文字实在啰嗦,我们就直接做一张表,把上面提到的值都汇总一下:

注意看最后一行:此时已不再需要区分它到底有没有被访问过,因为,如果此前已写入,则必定已被访问过。

EIP-2930:可选“访问清单”的事务类型

另一个“柏林”升级包含的EIP是2930。该EIP加入了一种新的类型的事务,可以在事务的负载中包含一个“访问清单”,意思是,你可以在事务执行前就声明哪些地址和存储槽应被认为是“访问过的”。举个例子,对一个未访问过的槽执行?SLOAD?需要耗费2100gas,但如果该存储槽被包含在了事务的“访问清单”中,则操作的消耗量机会降为100gas。

但如果只要地址和槽被当成“已访问过的”就可以降低操作的Gas消耗量;而访问清单可以把地址和槽标记为“已访问过的”;那岂不是说我们可以把这些东西都放在访问清单中,来获得Gas消耗量的减免?真棒,天赐Gas!

额,并不完全如此,因为你每添加一个地址或存储项键,都要支付额外的Gas。

举个例子。假如我们要向合约?A?发送了一条事务。我们编写了一条这样的访问清单:

这是不是说,每次使用访问清单我们都能节省gas呢?很遗憾,也不是,因为在访问清单中填入地址也需要支付gas。

访问过的地址

迄今为止,我们只讨论了?SLOAD?和?SSTORE?操作码,但“柏林”升级还改变了别的操作码。举个例子,CALL?操作码原来的Gas消耗量为固定的700,但2929实施后,如果所调用的地址不在访问清单中,消耗量将提高到2600;如果在,则降低为100。而且,就像访问过的存储键一样,到底哪个操作码访问过那个地址并不重要(比如,如果用户最先调用的是?EXTCODESIZE,这一个操作的消耗量是2600,但后续的调用,只要是对同一个地址的,无论是?EXTCODESIZE、CALL?还是?STATICCALL?,都只消耗100gas。

那个这个设计对带有访问清单的事务有何影响?假设我们向合约A发送一条交易,而合约A调用了合约B,而我们在访问清单中写入这样的内容:

我们首先需要为在这条事务的访问清单中加入这个地址支付2400gas,但对B使用的第一个操作码就只需要消耗100gas而不是2600gas,这就剩下了100gas。如果B也需要使用其存储项,我们又知道它将使用哪个键,我们也可以把这些键包含在访问列表中,然后为每个键的操作省下100或200gas。

但为啥我们要加多一个合约来举例子?我们不是可以这样写吗?

你当然可以这样做,但不值得,因为EIP-2929指明了你一开始调用的合约必定会被包含在?accessed_addresses?列表中,所以你就是额外花了2400gas,什么好处都没得到。

所以,回头看我们上面举的例子:

这样做其实是浪费,除非你在里面加多几个存储项键。如果我们假设所有的存储项键的第一个操作都是?SLOAD,那你要至少24个键,才能赚回来。

而且,如你所见,自己一五一十地分析这些因素、手动生成访问清单,显然是极其繁琐而令人崩溃的事。好在,还有更好的办法。

eth_createAccessList?RPC方法

Geth客户端开始将包含一个新的?eth_createAccessList?RPC方法,你可以用它来生成访问清单,就像使用?eth_estimateGas?一样,只不过返回的不是Gas消耗量估计,而是形如这样的数据:

我估计随着时间推移,我们会越来越知道怎么利用这个功能,但我个人估计,方法的伪代码形式会像这样:

防止合约变砖

值得提醒,访问清单功能的主要目的不是节省Gas。如该EIP自身所述:

缓解由EIP-2929带来的合约变砖风险,因为事务可以预先指定、预先支付自身尝试范文的账户和存储槽,因此,在实际的执行中,SLOAD和EXT*操作码都只会消耗100gas:这个值低到既足以防止2929打破某些合约,也可以“解封”被EIP-1884封印的合约。

原本,只要一个合约预设了执行的Gas开销,操作码的Gas消耗量变动就有可能导致它变砖。比如,如果一个合约预设另一个合约的?someFunction?只会用到34500gas,因此总是用?someOtherContract.someFunction{gas:34500}()?调用那个合约,这个合约就有可能变砖。但只要你在事务中添加合适的访问清单,这个合约就还能工作。

自己验证

如果你想自己测试一下,克隆这个仓库,这里面有很多例子,可以使用Hardhat和Geth客户端来运行。请仔细阅读README。

标签:GASSTORSTOTORugas币最新进展HistoryDAOSTON币TORONTO价格

芝麻开门交易所热门资讯
Newland品牌升级支持多链挖矿 打造Defi挖矿最强入口

近日Newland官方发布消息,宣布正式开启多链生态的DeFi挖矿,持续支持更多生态的优质挖矿项目,打造行业的一站式挖矿入口。此消息一出便引起社区的广泛讨论,这个由火币矿池运营的项目究竟收益如何,将如何影响行业格局,我们一起来看一下.

1900/1/1 0:00:00
AFintech宣布与Xangle.io 建立战略合作

全球知名的区块链服务平台AFintech宣布与Xangle建立战略合作伙伴关系。Xangle是数字资产洞察和加密披露的主要目的地,正在将区块链行业的信息披露和分销实践制度化,在不久的将来,AFintech将帮助更多的加密项目在东南亚主.

1900/1/1 0:00:00
CoinList创始人是如何投资项目的?

睡后收入,即被动收入,一般指不需要花费多少时间和精力就可自动获得的收入。「睡后收入」曾于2018年风靡中文互联网,然而大多数用户并不知道这一概念是由美国知名投资人NavalRavikant所提出.

1900/1/1 0:00:00
?狂人说:当大型机构再次买入时候 本轮回调就会结束

.new_summary,blockquote{position:relative;font-size:16px;letter-spacing:1px;line-height:28px;margin-bottom:40px;paddi.

1900/1/1 0:00:00
如何理解 DeFi?(上):稳定币和去中心化借贷

2020年度热词之一是DeFi,你可能听过社群中不少人在谈论他们通过DeFi获取的惊人收益,那么DeFi到底是什么呢?DeFi是DecentralizedFinance去中心化金融的简称,也叫开放式金融,指的是搭建在公有链上的应用.

1900/1/1 0:00:00
法律分析:参与USDT跑分,小心涉嫌帮信罪与掩隐罪

最近,USDT在稳定币中可谓名声大噪,USDT的储存功能与高流动性深得用户喜爱,就连散户投资者都纷纷跑步入场。但有人却将USDT作为牟取非法所得的网络犯罪工具.

1900/1/1 0:00:00