Alert Source Discuss
🚧 Stagnant Standards Track: Core

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 复杂化,此更改会恢复该复杂性。 此外,此实现中的错误可能会分裂网络。

相反,这会延迟存储清理的时间,并将存储保留在原位,从而降低了 SLOADSELFDESTRUCT 的复杂性。

这通过在升级期间保留存储来增强 CREATE2 转世代理模式,否则必须再次重置存储。 原子转世升级可以在升级期间清除存储的子集,同时合约被销毁,然后再恢复它。

规范

FORK_BLOCK_NUM 之后,一个新的操作码 EXTCLEAR0x5C 处启用,以清除 SELFDESTRUCT 合约的存储。 EXTCLEAR:

  • 不会将任何字推送到堆栈上
  • 从堆栈中弹出两个字:已销毁的合约地址和存储地址
  • 如果合约存在,则收取与 EXTCODEHASH (0x3F) 相同的 gas 成本
  • 否则,如果存储为零,则收取与 EXTCODEHASH 加上 SLOAD 相同的 gas 成本
  • 否则,已销毁合约的插槽将重置为 0,收取与重置存储时 EXTCODEHASHSSTORE 相同的 gas 成本,同时退还 SSTORE 中指定的金额。

修改 SELFDESTRUCT 以不清除合约存储。 此更改也具有追溯效力:可以清理所有先前销毁的合约。

原理

0x5C 在与 SSTORESLOAD 相同的范围内可用。

向后兼容性

期望所有内部存储都被清除的转世升级机制可能会中断,但这种升级机制将允许适应这种新行为。

测试用例

待办

实现

所有主要客户端都需要实现以添加操作码。

安全考虑

不希望其状态被恶意行为者清除的转世合约应该重新初始化自身以避免对抗性的 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.