EIP-2936: 用于 SELFDESTRUCT 合约的 EXTCLEAR 操作码
Authors | William Morriss (@wjmelements) |
---|---|
Created | 2020-09-03 |
Discussion Link | https://ethereum-magicians.org/t/eip-2936-extclear-for-selfdestruct/4569 |
简单总结
启用新的操作码来清除 SELFDESTRUCTED
合约的存储。
摘要
更改 SELFDESTRUCT
(0xff
) 为不清除任何存储,并添加一个新的 EXTCLEAR
(0x5c
) 操作码,该操作码将清除先前已自毁的合约的特定存储槽。
动机
SELFDESTRUCT
(0xFF
) 是不必要的复杂,因为它清除无限量的合约存储。
对于节点来说,跟踪每个合约中使用的所有存储在合约 SELFDESTRUCT
时的情况,在计算上是昂贵的。
此外,合约可以使用 CREATE2
(0xF5
) 重新初始化,然后 SLOAD
(0x54
) 先前的存储。
因此,一些以太坊客户端根本不清除存储,而只是检查自 SSTORE
(0x55
) 以来是否初始化了合约。
CREATE2
的目的不是使 SLOAD
复杂化,此更改会恢复该复杂性。
此外,此实现中的错误可能会分裂网络。
相反,这会延迟存储清理的时间,并将存储保留在原位,从而降低了 SLOAD
和 SELFDESTRUCT
的复杂性。
这通过在升级期间保留存储来增强 CREATE2
转世代理模式,否则必须再次重置存储。
原子转世升级可以在升级期间清除存储的子集,同时合约被销毁,然后再恢复它。
规范
在 FORK_BLOCK_NUM
之后,一个新的操作码 EXTCLEAR
在 0x5C
处启用,以清除 SELFDESTRUCT
合约的存储。
EXTCLEAR
:
- 不会将任何字推送到堆栈上
- 从堆栈中弹出两个字:已销毁的合约地址和存储地址
- 如果合约存在,则收取与
EXTCODEHASH
(0x3F
) 相同的 gas 成本 - 否则,如果存储为零,则收取与
EXTCODEHASH
加上SLOAD
相同的 gas 成本 - 否则,已销毁合约的插槽将重置为 0,收取与重置存储时
EXTCODEHASH
和SSTORE
相同的 gas 成本,同时退还SSTORE
中指定的金额。
修改 SELFDESTRUCT
以不清除合约存储。
此更改也具有追溯效力:可以清理所有先前销毁的合约。
原理
0x5C
在与 SSTORE
和 SLOAD
相同的范围内可用。
向后兼容性
期望所有内部存储都被清除的转世升级机制可能会中断,但这种升级机制将允许适应这种新行为。
测试用例
待办
实现
所有主要客户端都需要实现以添加操作码。
安全考虑
不希望其状态被恶意行为者清除的转世合约应该重新初始化自身以避免对抗性的 EXTCLEAR
。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
William Morriss (@wjmelements), "EIP-2936: 用于 SELFDESTRUCT 合约的 EXTCLEAR 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 2936, September 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2936.