Standards Track: Core
EIP-170: 合约代码大小限制
EIP-170: 合约代码大小限制
Authors | Vitalik Buterin (@vbuterin) |
---|---|
Created | 2016-11-04 |
硬分叉
参数
MAX_CODE_SIZE
:0x6000
(2**14 + 2**13
)FORK_BLKNUM
: 2,675,000CHAIN_ID
: 1 (主网)
规范
如果 block.number >= FORK_BLKNUM
,那么如果合约创建初始化返回的数据长度 大于 MAX_CODE_SIZE
字节,合约创建将失败并显示 gas 不足错误。
理由
目前,以太坊中仍然存在一个轻微的二次方漏洞:当调用一个合约时,即使这个调用消耗了固定数量的 gas,这个调用也可能触发 O(n) 的成本,包括从磁盘读取代码、为 VM 执行预处理代码,以及向区块有效性证明的 Merkle 证明中添加 O(n) 数据。在当前的 gas 水平下,即使并非最佳,这也是可以接受的。在未来可能由于动态 gas 限制规则而触发的更高 gas 水平下,这将成为一个更大的问题 —— 虽然远不如最近的拒绝服务攻击那么严重,但对于未来验证有效或无效证明的轻客户端来说仍然是不方便的。 解决方案是对可以保存到区块链的对象的大小设置一个硬性上限,并通过将上限设置在略高于当前 gas 限制可行的值来无中断地实现这一点。
参考
- EIP-170 问题和讨论:https://github.com/ethereum/EIPs/issues/170
- pyethereum 实现:https://github.com/ethereum/pyethereum/blob/5217294871283d8dc4fb3ca9d8a78c7d416490e8/ethereum/messages.py#L397
Citation
Please cite this document as:
Vitalik Buterin (@vbuterin), "EIP-170: 合约代码大小限制," Ethereum Improvement Proposals, no. 170, November 2016. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-170.