Alert Source Discuss
Standards Track: Core

EIP-170: 合约代码大小限制

Authors Vitalik Buterin (@vbuterin)
Created 2016-11-04

Table of Contents

硬分叉

Spurious Dragon

参数

  • MAX_CODE_SIZE: 0x6000 (2**14 + 2**13)
  • FORK_BLKNUM: 2,675,000
  • CHAIN_ID: 1 (主网)

规范

如果 block.number >= FORK_BLKNUM,那么如果合约创建初始化返回的数据长度 大于 MAX_CODE_SIZE 字节,合约创建将失败并显示 gas 不足错误。

理由

目前,以太坊中仍然存在一个轻微的二次方漏洞:当调用一个合约时,即使这个调用消耗了固定数量的 gas,这个调用也可能触发 O(n) 的成本,包括从磁盘读取代码、为 VM 执行预处理代码,以及向区块有效性证明的 Merkle 证明中添加 O(n) 数据。在当前的 gas 水平下,即使并非最佳,这也是可以接受的。在未来可能由于动态 gas 限制规则而触发的更高 gas 水平下,这将成为一个更大的问题 —— 虽然远不如最近的拒绝服务攻击那么严重,但对于未来验证有效或无效证明的轻客户端来说仍然是不方便的。 解决方案是对可以保存到区块链的对象的大小设置一个硬性上限,并通过将上限设置在略高于当前 gas 限制可行的值来无中断地实现这一点。

参考

  1. EIP-170 问题和讨论:https://github.com/ethereum/EIPs/issues/170
  2. 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.