Alert Source Discuss
🛑 Withdrawn Standards Track: Core

EIP-2677: 限制 `initcode` 的大小

Authors Martin Holst Swende (@holiman), Paweł Bylica (@chfast), Alex Beregszaszi (@axic)
Created 2020-05-18
Discussion Link https://ethereum-magicians.org/t/eip-2677-limit-size-of-initcode/4550

简单总结

initcode 强制执行最大尺寸限制 (max_initcode_size) 49152 (0xc000)。

摘要

initcode 强制执行最大尺寸限制 (max_initcode_size)。如果 initcode 的大小超过 max_initcode_size,则合约创建将因 gas 不足错误而失败。

自从 EIP-170 实施以来,合约代码的大小限制为 24576 (0x6000)。我们建议也将可执行代码的大小限制为上述限制的 2x,即 49152 (0xc000)。

这也带来了两个很好的特性:

  • 代码中的指令偏移量适合 16 位值,
  • 代码大小适合 16 位值。

动机

当客户端执行 initcode 时,客户端必须执行 jumpdest 分析。在某些情况下,客户端还会执行代码的 hash 操作:

  • 用作包含 jumpdest 分析结果的映射中的键
  • 用于 CREATE2 中的地址计算。

jumpdest 分析期间执行的工作与代码大小成线性比例。目前,一个交易可以扩展内存一次,并重复使用相同的内存段(进行少量修改),以强制客户端执行大量分析/哈希操作,从而导致区块处理缓慢。

历史上,这在 2017 年 6 月被利用,促成了 geth 的 1.6.5 版本补丁。

CREATE2 中的地址计算期间执行的工作与代码大小成比例收费。

规范

以下三种情况适用:

  • CREATE
  • CREATE2
  • 使用空接收者的交易进行创建。

在所有这些(以及未来的)情况下,如果代码长度超过 max_initcode_size,EVM 应该会因 Gas 不足错误而失败。

理由

待定

向后兼容性

此 EIP 需要“网络升级”,因为它修改了共识规则。

安全考虑

对于客户端实现,此 EIP 使基于 jumpdest 分析或代码哈希的攻击不再那么成问题,因此应该提高客户端的稳健性。

对于第 2 层,此 EIP 引入了以前不存在的故障模式。可能存在部署多级合约层次结构的工厂合约,使得多个合约的代码包含在第一个合约的 initcode 中。此 EIP 的作者不知道任何此类合约。

测试用例

测试用例应包括以下情况:

  • CREATE/CREATE2/tx create,其中 initcode_sizemax_initcode_size
  • CREATE/CREATE2/tx create,其中 initcode_sizemax_initcode_size+1

实现

待定

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Martin Holst Swende (@holiman), Paweł Bylica (@chfast), Alex Beregszaszi (@axic), "EIP-2677: 限制 `initcode` 的大小 [DRAFT]," Ethereum Improvement Proposals, no. 2677, May 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2677.