EIP-6046: 将 SELFDESTRUCT 替换为 DEACTIVATE
更改 SELFDESTRUCT,使其不删除存储键,并在帐户 nonce 中使用特殊值来表示停用
Authors | Alex Beregszaszi (@axic) |
---|---|
Created | 2022-11-25 |
Discussion Link | https://ethereum-magicians.org/t/almost-self-destructing-selfdestruct-deactivate/11886 |
Requires | EIP-2681, EIP-2929, EIP-3529 |
摘要
更改 SELFDESTRUCT
,使其不删除所有存储键,并在帐户 nonce 中使用特殊值来表示已停用帐户。由于恢复的语义发生变化(存储键可能存在),我们还将指令重命名为 DEACTIVATE
。
动机
SELFDESTRUCT
指令目前具有固定的价格,但在其执行的存储/帐户更改数量方面是无限制的(它需要删除所有键)。 这已经存在一段时间了。
此外,使用 Verkle 树,帐户的组织方式将有所不同:帐户属性(包括存储)将具有单独的键。 将无法遍历和查找所有已使用的键。 这使得在 Verkle 树中支持 SELFDESTRUCT
非常具有挑战性。
规范
-
更改 EIP-2681 引入的规则,使常规 nonce 增加受限于
2^64-2
而不是2^64-1
。 这从创世开始应用。 -
SELFDESTRUCT
的行为已更改,如下所示:
- 不删除任何存储键,并将帐户保留在原处。
- 将帐户余额转移到目标并且将帐户余额设置为
0.
- 将帐户 nonce 设置为
2^64-1
。 - 请注意,由于 EIP-3529,不提供任何退款。
- 请注意,关于
SELFDESTRUCT
的 EIP-2929 的规则保持不变。
- 修改帐户执行(通过外部事务或 CALL* 指令触发),以便如果 nonce 等于
2^64-1
,则执行成功并返回一个空缓冲区。
- 请注意,该帐户仍然可以接收不可执行的值转移(例如 coinbase 事务或其他
SELFDESTRUCT
)。
- 修改
CREATE2
,以便如果 nonce 等于2^64-1
,则允许创建帐户。
- 请注意,在
CREATE2
之前,帐户(尤其是代码和存储)可能不是空的。 - 请注意,成功的
CREATE2
将更改帐户代码、nonce 并可能更改余额。
- 将
SELFDESTRUCT
指令重命名为DEACTIVATE
,因为“帐户恢复”的语义已更改:旧的存储项将保留,并且新部署的代码必须知道这一点。
理由
已经有各种关于删除 SELFDESTRUCT
的提案,许多提案会直接删除删除功能。 这会破坏某些使用模式,而停用选项可以完整地保留这些模式,但略有更改。 这只会影响新部署的代码,而不影响现有代码。
所有提案都会将数据留在状态中,但该提案提供了灵活性,如果恢复的合约选择这样做,它可以逐个重用或删除存储槽。
向后兼容性
由于此 EIP 修改了共识规则,因此需要协议升级。 对 nonce 的进一步限制不应对帐户产生影响,因为 2^64-2
是一个不可行的高限制。
使用恢复模式的合约仍然可以工作,但在恢复期间部署的代码可能需要意识到存储键可能已经存在于帐户中。
安全注意事项
保留存储的新行为可能会对安全性产生潜在影响。 合约作者必须了解并相应地设计合约。 这可能会对执行自主销毁和恢复的现有已部署代码产生影响。
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Alex Beregszaszi (@axic), "EIP-6046: 将 SELFDESTRUCT 替换为 DEACTIVATE [DRAFT]," Ethereum Improvement Proposals, no. 6046, November 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6046.