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_addresses
和 accessed_storage_keys
。
当事务执行开始时,accessed_code_in_addresses
将包括 tx.sender
,tx.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.