伦敦升级的EIP-3529将如何通过修改gas返还来优化 EVM

EIP-3529:减少gas返还

简单总结

移除 SELFDESTRUCT 的 gas 返还,减少 SSTORE 的 gas 返还到一个较低水平,使得返还的量仍然相当大,但不会像现在高到可以被利用的地步。


原因

最初引入 SSTORE 和 SELFDESTRUCT 的 gas 返还是为了鼓励应用开发者写应用时能践行“良好的状态卫生”,清理不再需要的存储槽与合约。但是,结果证明这项技术带来的效率远低于预期,gas 返还还带来多项未预料到的有害后果:

  • gas 返还导致 GASToken 的出现。GasToken 有益于把 gas 空间从低费用阶段转移到高费用阶段,但它也对网络有坏处,尤其是加剧状态大小膨胀 (由于状态槽被有效用作“电池”来积攒 gas) 和低效地堵塞区块链 gas 使用。

  • gas 返还加剧区块大小变化。一个区块实际消耗的 gas 量的理论最大值是接近名义上的 gas limit (因为返还会增加同一区块里后面交易的 gas 空间,尽管返还的 gas 最多是该笔交易消耗 gas 的50%)。这一点不是致命的,但影响还是相当不好,特别是返还可以被用来维持比 EIP-1559 使用两倍 gas limit 更长的峰期。

规范

参数

对于存在 block.number >= FORK_BLOCK 的区块,需要作下列变更。

1. 移除 SELFDESTRUCT 的返还

2. 用 SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST (EIP-2929 + EIP-2930 合力下的 4,800 gas) 取代 SSTORE_CLEARS_SCHEDULE ( EIP-2200 定义的)

3. 把交易后的最大返还 gas 量减少到 gas_used // NEW_MAX_REFUND_QUOTIENT

原理阐释

EIP-2200 引入了返还的三种情况:

1. 如果原始值是非零,新值是零,添加 SSTORE_CLEARS_SCHEDULE (当前是15,000)的 gas 量到返还计算器

2. 如果原始值是零,当前值是非零,新值为零,添加 SSTORE_SET_GAS - SLOAD_GAS (当前是 19,900) 的 gas 量到返还计算器

3. 如果原始值是非零,当前值是一个不一样的非零值,新值等于原始值,添加 SSTORE_RESET_GAS - SLOAD_GAS (当前是 4,900)的 gas 到返还计算器

在这三种情况里,只有 (1) 会启动 gastoken 且允许区块在执行上消耗超过区块 gas limit 的 gas。(2) 不具有这个特点,因为要获得 19,900 的 gas 返还,同一个存储槽必须在之前从零改为非零,这需要消耗 20,000 gas。无法从一个存储槽获得 gas 并用它来编辑另一个存储槽,意味着它不能被用作 gas token。另外,获得返还需要恢复存储的写入和扩展,使得返还的 gas 不会增加客户端处理区块的工作量。(3) 是相似的:只有当同一个存储槽在之前已经消耗了 5,000 gas 的时候才能获得 4,900 gas 返还。

此 EIP 处理第一种情况。我们可以通过使用一个相似的“配对” 变元来确定在何种条件下 gastoken 是不可用的 (例如,你不可以在一个存储槽里获得比你的输入更多的 gas) ,将每一笔返还映射到同一笔交易的同一个存储槽的前一笔支出。当一个存储槽的原始值是非零值,如果它被改为 0 时,有两个可能性:

1. 这可能是存储槽第一次被设置为零。在这种情况下,我们可以把这个时间与 SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST 第一次读取和编辑存储槽的最小开销进行配对。

2. 这可能是存储槽第二次被设置为零或被设置为零后的情况。在这种情况下,我们可以把这个事件与最近一次数值从零改为其他值,且 SSTORE_CLEARS_SCHEDULE 的 gas 从返还中被移除的变元进行配对。

对于第二次或之后的情况,SSTORE_CLEARS_SCHEDULE  的值是什么并不重要,因为那个 gas 大小的返还是与相同大小的清除返还相匹配的。这就只剩下第一种情况了。为了确保存储槽上消耗的 gas 总量为正,我们需要 SSTORE_CLEARS_SCHEDULE <= SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST。因此,此 EIP 只把 SSTORE_CLEARS_SCHEDULE 减少到那两项开销的总和。

此 EIP 的另一个原因是,清除还未被读取的数据 (通常是“无用”数据) 是不会有净返还的,但清除被读取过的数据 (通常是“有用”数据) 还继续会有净返还。

向后兼容性

返还当前仅在交易执行后应用,因此无法对执行中任何特定可用的调用框架造成影响。因此,清除它们将不会破坏任何代码的执行,尽管它将使得一些应用变得经济上不可行。

Gas token 会变得没有价值。DeFi 套利机器人今天经常不是使用已有的 gas token 方案就是一个定制的,以减少链上的开销,这得益于重写它们的代码以清除对那些不再有用的 gas 存储机制的调用。

然而,完全保留在 new = original = 0 != current  里的返还,以及保留在其他 nonzero -> zero 情况里的一些返还能确保一些接收 (和值得) 更好的 gas 开销待遇的关键用例能持续获益。例如,zero -> nonzero -> zero 的存储设置模式保持只需消耗大约 100 gas。这些模式包括两个重要实例:

➤ 反重入锁 (通常在一个子调用开始前从 0 变为 1,当子调用结束时再变回 0)

➤ ERC20 授权与发送 (当代币转移得到授权,"授权值"会从零变成非零,然后在代币转移过程中恢复到零)

对清除存储激励的影响

对之前关于移除返还的 EIP (EIP-3298 和 EIP-3403) 的批评是这些 EIP 完全消除了把一个值设为零的激励,相当于鼓励用户不要完全清除一个存储槽 (即使他们想这么做),哪怕他们想再次使用该存储槽的几率是最小的。

举一个例子,如果你有一个单位的 ERC20 代币,且你要送出或卖出你的所有余额,你可以只给出 0.999999 个单位,把剩余的留下。如果你想在未来重新放入更多该种代币到同一个账户,你仅需要为 SSTORE 支付 5,000 gas (2,100用于读取 + 2,900用于非零变为非零的设置) 而不是22,100 (20,000 用于零到非零值的设置)。今天,这部分的 gas 会被清除存储获得的 15,000 gas 返还所抵消,因此,如果你有超过 15000 / 17100 = 87.7% 的把握会再使用这个存储槽,你才会有动力这样做;按照 EIP 3298 或 EIP 3403 的设定,抵消激励这部分是不存在的,因此,如果你再次使用该存储槽的可能性是大于 0 的,设为非零值会更好。

对于剩下的 4,800 gas 返还,如果你觉得再次使用某个存储槽的几率大于 4800 / 17100 = 28.1% ,你才有保持该存储槽为非零的动力。这并不是完美的,但它可能高于一般人在清除了他们的全部余额后在同一个地址重新获得同一代币的几率。

gas 返还的上限是所消耗 gas 量的1/5,这意味着这种返还仅够用于增加处理一个区块所需的存储写入操作量最多为25%,限制了利用这个机制进行以存储写入为重点的拒绝服务攻击。

测试用例

EIP-2929 的 gas 开销

注意,“热”和“冷”存储槽之间是有区别的。这个表展示了 EIP-2929 下的值,假定所有变动过的存储槽都已经是“热”状态 (区别是一次性消耗 2,100 gas)。

减少了的返还后

如果通过把 SSTORE_CLEARS_SCHEDULE 从 15,000 变为 4,800 (以及去除 selfdestruct 的返还) ,减少了部分的返还,下面是是一个对比表。

安全考虑

返还对于事务执行时不可见的,因此这不会对事务执行逻辑产生任何影响。

如果我们不计算后来重置回零的零到非零的 SSTORE,在一个区块里执行的最大 gas 消耗量受到 gas limit 的限制。不计算这些事可以的,因为如果这样的 SSTORE 被重置了,存储不会被扩展,客户端实际上不需要调整默克尔树;gas 消耗是可以返还的,但客户端对这些操作码的处理通常也会被取消。如果 new_value = original_value,客户端应该保证不会进行存储写入;这是自以太坊创世以来的一次谨慎优化,但它现在变得更重要了。

来源 | eips.ethereum.org

作者 | Vitalik Buterin & Martin Swende

24小时热点

投资者寻找 2025 年牛市前爆升10大潜力币 8月最佳百倍币

随着 2024 年进入下半年,全球投资者的目光正紧紧聚焦于能 ...

115307

非小号

元宇宙原力币是什么?有什么用?

随着科技的不断进步,元宇宙的概念已经逐渐从科幻小说中走入现实 ...

178886

区块链圈小菜鸡

元宇宙入口是什么?原力元宇宙官方网站入口及注册流程

原力元宇宙官方网站入口是 https://meta-forc ...

104764

树图链

被朋友骗去弄数字货币

  有一次,一个朋友突然给我说他有一种可以赚钱的新方法,他说 ...

446050

DigiFinex

链圈百科:韩国政府机构组织图

一、行政院 韩国行政院是一个由政府的行政机构组成的中央政府 ...

1045804

BitKeep钱包

中国十大庞氏骗局之RUNE币 THORChain

RUNE- 简介详情 THOR ...

146951

非小号

国家版本数据中心

国家版本数据中心(National Data Version ...

439370

元视觉

元宇宙平台合法吗

现在,元宇宙平台备受热捧,但有人质疑其合法性。在此,我们将对 ...

989208

T网

盘点目前最火的区块链游戏项目排名

随着区块链技术的不断成熟和普及,其在游戏行业的应用也逐渐兴起 ...

153476

波场区块链浏览器

2024年以太坊会恢复挖矿吗?后续有什么调整?

以太坊在2022年完成了从工作量证明(PoW)到权益证明(P ...

87534

波场区块链浏览器

热点专题

NFT艺术品到底是什么?

Beeple,“EVERYDAYS: THE FIRST 5 ...

2318557

Opera House

最全的NFT发展史

当我们理解一个新生事物,必须要首先了解其起源,通过对其源头以 ...

1752801

iBox

“华英会”诈骗圈钱5000亿!崩盘后将会凄惨无比

“华英会”崩盘的预警已多次发出,尽管尚未正式宣布崩盘,但大家 ...

1328854

Magic Eden

什么是IDO?这种模式会带来怎样的影响?

要理解IDO(Initial DeFi Offering)初 ...

1158056

Bitstamp交易所

链圈百科:韩国政府机构组织图

一、行政院 韩国行政院是一个由政府的行政机构组成的中央政府 ...

1045720

BitKeep钱包

有黑客采取新型 USDT 假充值手法

根据慢雾区情报,有黑客采取新型 USDT 假充值手法,黑客采 ...

1015812

区块链博客

元宇宙平台合法吗

现在,元宇宙平台备受热捧,但有人质疑其合法性。在此,我们将对 ...

988901

T网

4种利用永续合约资金费率套利的策略

下文将介绍在保持市场中立的条件下,如何从永续掉期资金费率中套 ...

948964

DCG区块链孵化器

国内NFT平台是怎么赚钱的?

2021年被称为NFT的“元年”,互联网巨头、各大企业、艺术 ...

813235

CoinBene满币网

宝二爷郭宏才的乘风破浪之旅

10年后的比特币会涨到10万美元吗?宝二爷说过:“先吹吹牛B ...

727516

QuillAudits