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.