Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-2937: SET_INDESTRUCTIBLE 操作码

Authors Vitalik Buterin (@vbuterin)
Created 2020-09-04
Discussion Link https://ethereum-magicians.org/t/eip-2937-set-indestructible/4571

简单总结

添加一个 SET_INDESTRUCTIBLE (0xA8) 操作码,以防止合约调用 SELFDESTRUCT (0xFF)

摘要

动机

此操作码的预期用例是,如果合约希望作为库,向用户保证其代码将永远以未修改的形式存在,则可以将合约的代码的第一个字节设置为 SET_INDESTRUCTIBLE 操作码。这在账户抽象和其他上下文中非常有用。

与完全禁用 SELFDESTRUCT 操作码的 EIP 不同,此 EIP 不会修改任何现有合约的行为。

规范

添加一个交易范围内的全局变量 globals.indestructible: Set[Address](即,一个以与 selfdestructs 集合相同的方式运行的变量),并将其初始化为空集。

0xA8 处添加一个 SET_INDESTRUCTIBLE 操作码,其 gas 成本为 G_base,该操作码将当前的 callee 添加到 globals.indestructible 集合中。如果在当前执行上下文中,callee 位于 globals.indestructible 中,则 SELFDESTRUCT 操作码会抛出一个异常。

理由

对此的替代方案包括:

  • 直接完全禁止 SELFDESTRUCT。这将是理想的,但具有更大的向后兼容性问题。
  • 使用局部变量而不是全局变量。这是有问题的,因为它会被 DELEGATECALL 打破。

向后兼容性

待定

安全考虑

这打破了与_某些_形式的状态租金的前向兼容性,状态租金会简单地删除那些太旧而未支付维护费用的合约。但是,并非所有状态大小控制方案都是如此;例如,如果使用 ReGenesis,则这不是问题。

如果将来删除了 SELFDESTRUCT,则此 EIP 将简单地变成一个空操作。

版权

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

Citation

Please cite this document as:

Vitalik Buterin (@vbuterin), "EIP-2937: SET_INDESTRUCTIBLE 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 2937, September 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2937.