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_size为max_initcode_sizeCREATE/CREATE2/tx create,其中initcode_size为max_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.