EIP-6190: 兼容 Verkle 的 SELFDESTRUCT
更改 SELFDESTRUCT 以仅引起有限数量的状态更改
Authors | Gavin John (@Pandapip1) |
---|---|
Created | 2022-12-20 |
Discussion Link | https://ethereum-magicians.org/t/eip-6190-functional-selfdestruct/12232 |
Requires | EIP-2929, EIP-6188, EIP-6189 |
Table of Contents
摘要
更改 SELFDESTRUCT
以仅引起有限数量的状态更改。
动机
SELFDESTRUCT
指令具有固定的价格,但在存储/帐户更改方面是无限制的(它需要删除所有密钥)。 这已经是一段时间以来一直存在的问题。
此外,使用 Verkle trees,帐户的组织方式将有所不同。 帐户属性(包括存储)将具有单独的密钥。 将无法遍历并找到所有已使用的密钥。 这使得在 Verkle trees 中支持 SELFDESTRUCT
变得非常具有挑战性。 此 EIP 是朝着在 Verkle trees 中支持 SELFDESTRUCT
迈出的一步。
规范
本文档中使用的关键词“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY”和“OPTIONAL”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
先决条件
必须使用 EIP-6188 和 EIP-6189 才能使此 EIP 正常工作。
SELFDESTRUCT
行为
不是在事务结束时销毁合约,而是在调用它的事务结束时发生以下情况:
- 合约的代码设置为
0x1
,其 nonce 设置为2^64-1
。 - 合约的第
0
个存储槽设置为如果合约使用CREATE
操作码 (keccak256(contractAddress, nonce)
) 将发出的地址。 请注意,nonce 始终为2^64-1
。 - 如果合约在被一个或多个别名合约转发的调用之后被自毁,则别名合约的第
0
个存储槽设置为在步骤 2 中计算出的地址。 - 合约的余额将全部转移到堆栈顶部的地址。
- 堆栈顶部弹出。
SELFDESTRUCT
的 Gas 成本
SELFDESTRUCT
的基本 gas 成本设置为 5000
。 对于每个转发到正在自毁的合约的别名合约,SELFDESTRUCT
的 gas 成本将增加 5000
。 最后,应用 EIP-2929 的 gas 成本增加。
理由
此 EIP 旨在成为在 Verkle trees 中支持 SELFDESTRUCT
的一步,同时尽可能减少更改量。
5000
的基本 gas 成本和额外的别名合约代表了设置帐户 nonce 和第一个存储槽的成本。 出于所述 EIP 的理由中提到的原因,保留了 EIP-2929 的 gas 成本增加。
选择 2^64-1
的 nonce 是因为它是由 EIP-6188 保护的 nonce。 选择 0x1
的帐户代码是因为它是 EIP-6189 中指定的代码。
地址与 CREATE
创建的地址相同,旨在通过不引入一种新的机制,通过该机制可以在特定地址创建帐户来减少可能的攻击媒介。
向后兼容性
此 EIP 需要协议升级,因为它修改了共识规则。
安全考虑
需要讨论。
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Gavin John (@Pandapip1), "EIP-6190: 兼容 Verkle 的 SELFDESTRUCT [DRAFT]," Ethereum Improvement Proposals, no. 6190, December 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6190.