Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-5027: 移除合约代码大小的限制

将合约大小的限制从 24576 更改为无限

Authors Qi Zhou (@qizhou)
Created 2022-04-21
Discussion Link https://ethereum-magicians.org/t/eip-5027-unlimit-contract-code-size/9010
Requires EIP-170, EIP-2929, EIP-2930

摘要

移除合约代码大小的限制,即仅通过区块 gas 限制合约代码大小,并对现有代码进行最小的更改,并进行适当的 gas 计量调整,以避免可能的攻击。

动机

动机是移除代码大小的限制,以便用户可以部署大型代码合约,而无需担心将合约拆分为多个子合约。

随着 dApplications 的急剧增长,智能合约的功能变得越来越复杂,因此,新开发的合约的大小也在稳步增加。因此,我们面临越来越多的 24576 字节合约大小限制的问题。尽管诸如将大型合约拆分为多个子合约之类的多种技术可以缓解该问题,但是这些技术不可避免地增加了开发/部署/维护智能合约的负担。

该提案实施了一种解决方案,以消除现有代码大小的 24576 字节限制。此外,该提案旨在最大程度地减少客户端实现(例如,Geth)的更改,并具有

  • 适当的 gas 计量,以避免滥用节点资源用于与合约相关的操作码,即CODESIZE (0x38)/CODECOPY (0x39)/EXTCODESIZE (0x3B)/EXTCODECOPY (0x3C)/EXTCODEHASH (0x3F)/DELEGATECALL (0xF4)/CALL (0xF1)/CALLCODE (0xF2)/STATICCALL (0xFA)/CREATE (0xF0)/CREATE2 (0xF5);和
  • 不更改以太坊状态的现有结构。

规范

参数

常量
FORK_BLKNUM 待定
CODE_SIZE_UNIT 24576
COLD_ACCOUNT_CODE_ACCESS_COST_PER_UNIT 2600
CREATE_DATA_GAS 200

如果 block.number >= FORK_BLKNUM,则合约创建初始化可以返回任意长度的数据,但是与合约相关的操作码将占用额外的 gas,如下定义:

  • 对于CODESIZE/CODECOPY/EXTCODESIZE/EXTCODEHASH,gas 不变。

  • 对于 CREATE/CREATE2,如果新创建的合约大小 > CODE_SIZE_UNIT,则操作码将占用额外的写入 gas,如

(CODE_SIZE - CODE_SIZE_UNIT) * CREATE_DATA_GAS

  • 对于EXTCODECOPY/CALL/CALLCODE/DELEGATECALL/STATICCALL,如果合约代码大小 > CODE_SIZE_UNIT,则操作码将占用额外的 gas,如
(CODE_SIZE - 1) // CODE_SIZE_UNIT * COLD_ACCOUNT_CODE_ACCESS_COST_PER_UNIT

如果合约不在 accessed_code_in_addresses 中,如果在 accessed_code_in_addresses 中则为 0,其中 // 是整数除法运算符,而 accessed_code_in_addresses: Set[Address] 是一个事务上下文范围的集合,类似于 access_addressesaccessed_storage_keys

当事务执行开始时,accessed_code_in_addresses 将包括 tx.sendertx.to 和所有预编译合约。

当调用 CREATE/CREATE2/EXTCODECOPY/CALL/CALLCODE/DELEGATECALL/STATICCALL 时,立即将地址添加到 accessed_code_in_addresses

原理

Gas 计量

目标是测量合约读取/写入操作的 CPU/IO 成本,并重用现有的 gas 计量,以避免滥用资源。

  • 对于与代码大小相关的操作码(CODESIZE/EXTCODESIZE),我们希望客户端实现从代码哈希到大小的映射,因此读取大型合约的代码大小仍应为 O(1)。

  • 对于CODECOPY,数据已加载到内存中(作为CALL/CALLCODE/DELEGATECALL/STATICCALL的一部分),因此我们不收取额外的 gas。

  • 对于EXTCODEHASH,该值已在帐户中,因此我们不收取额外的 gas。

  • 对于EXTCODECOPY/CALL/CALLCODE/DELEGATECALL/STATICCALL,由于它将从数据库中读取额外的数据,因此我们将为每个额外的CODE_SIZE_UNIT额外收取COLD_ACCOUNT_CODE_ACCESS_COST_PER_UNIT

  • 对于CREATE/CREATE2,由于它将在数据库中创建额外的数据,因此我们将为每个额外的字节额外收取CREATE_DATA_GAS

向后兼容性

所有现有合约都不会受到该提案的影响。

只有在 EIP-170 之前部署的合约才可能比当前最大代码大小长,并且参考实现能够成功导入该分叉之前的所有区块。

参考实现

Geth 上的参考实现位于 0001-unlimit-code-size.patch

安全注意事项

待定

版权

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

Citation

Please cite this document as:

Qi Zhou (@qizhou), "EIP-5027: 移除合约代码大小的限制 [DRAFT]," Ethereum Improvement Proposals, no. 5027, April 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5027.