主页 > 最新imtoken官方下载链接 > 以太坊退回pow 意见 | 务实地撤消 SELFDESTRUCT

以太坊退回pow 意见 | 务实地撤消 SELFDESTRUCT

最新imtoken官方下载链接 2023-04-28 07:09:58

本文将描述 SELFDESTRUCT 对以太坊生态系统弊大于利的一些原因,正是由于这些原因,我们应该以某种方式删除 SELFDESTRUCT。 鉴于一些合约已经使用 SELFDESTRUCT,我提出了一些方法来以最小的努力消除 SELFDESTRUCT 的危害。

一段历史:不再需要 SELFDESTRUCT

SELFDESTRUCT(最初称为 SUICIDE)是在以太坊的早期引入的。 事实上,它出现在 2013 年 12 月的以太坊协议“规范”预览版中。 当时,很少有人仔细思考国家规模管理的长期问题。 不过有一个想法我大概还有印象,为了防止无用的垃圾状态无限制的膨胀,我们需要让任何创建的对象都可以被销毁。 具体思路是当External-owned accounts(EOAs)余额为零时触发自毁,合约没用后可以通过在代码中调用一行自毁语句来触发自毁。 还有gas返还机制,激励大家销毁无用状态。

2014年1月,Andrew Miller指出了一个非常严重的问题:在2013年12月的规范设计中,EOA容易受到重放攻击。 如果我有 100 个币,我在一次交易中发送给你 10 个币,你可以简单地在链上重播交易十次并转移我的全部余额。 这个问题很快就解决了,我们为此添加了 nonce 字段。 然而,nonce字段的引入让删除EOA的愿望彻底破灭:nonce不能归零(译者注:由于以太坊的状态树是根据账户地址计算的前缀树,EOA的nonce fall back to 0) 一旦账户再次被使用,nonce 将再次从零开始,并且会被重播)。

以太坊经典和以太坊_以太坊和以太币有什么区别_以太坊退回pow

2015年,一些方案被提出来试图规避这个问题,这样零余额的账户就可以被安全地删除。 然而,当时很明显很少有合约开发人员真正使用自毁功能:很难确定何时自毁,而且奖励太少。

到 2019-21 年,很明显我们需要的是其他形式的状态管理,例如长期不活动状态的租金机制或“到期”(即“部分无状态”)。 statelessness)")。而如果我们采用这两种方案中的任何一种,只要有效,合约是否具有主动删除自身的能力就完全无关紧要。

SELFDESTRUCT 是唯一破坏重要不变量的操作码

SELFDESTRUCT 不仅无用,而且有害。 它破坏了一些本来不错的重要常量属性,但我们仅仅因为这个操作码就失去了它们。

以太坊经典和以太坊_以太坊退回pow_以太坊和以太币有什么区别

SELFDESTRUCT 是唯一可以在单个块中改变无限数量的状态对象的操作码

所有其他操作码只能对帐户中的单个值或存储树中的单个键进行操作,因此它们可以改变多少个固定大小的对象是有限制的(通常,每次操作码调用只能改变一个对象) . 但是,SELFDESTRUCT 可以删除整个存储树。

在当前的状态树结构中,这是可以容忍的。 但是,考虑一种特殊情况:在调用 SELFDESTRUCT 删除多个存储槽后,下一笔交易在同一地址创建合约并访问相同的存储槽。 为了处理这种情况,需要设计额外的复杂缓存机制。 此外,SELFDESTRUCT 会阻止我们更改状态存储格式。

以 SELFDESTRUCT 阻塞的两种状态存储格式为例:

以太坊经典和以太坊_以太坊退回pow_以太坊和以太币有什么区别

请注意,这不是幻想。 从根本上改变状态存储格式(如使用二叉树、Verkle 树等)的讨论已经开始。 如果状态存储的数据结构可以接近于单一的key/value存储结构,并且单个块中可以改变的状态数量有一个下限上限,这就大大扩展了我们的选择范围。

SELFDESTRUCT 是唯一会导致合约代码更改的操作码。 如果一段代码存储在一个特定的地址,那么这段代码将永远留在链上。 这种不变性很有用,因为您无需担心在构建应用程序时更改代码。 帐户抽象在很大程度上依赖于这种恒定性属性来支持库调用。 因为代码可能会发生变化,也会让应用的安全性变得更加复杂:2017年,Parity的多重签名钱包因为引用的库代码合约被意外删除而彻底瘫痪。 唯一破坏代码不变性的操作码是SELFDESTRUCT(导致Parity多重签名猝死的罪魁祸首)。

SELFDESTRUCT是唯一可以不经账户同意修改账户余额的操作代码。 SELFDESTRUCT 内置了“转账”功能,它不遵循正常的转账流程,因此可以绕过阻止合约地址接收 Ether 的守卫功能。 和记录传输事件。 这给智能合约钱包埋下了隐患,使得一些潜在有用的技术无法使用,增加了开发者和审计者的精神负担(需要考虑更多的例外情况)。

SELFDESTRUCT 的当前用例

以太坊和以太币有什么区别_以太坊退回pow_以太坊经典和以太坊

如今,SELFDESTRUCT 有两个重要的应用: GasToken:当 gas 价格低时,通过创建合约使用 gas,当 gas 价格高时,通过调用 SELFDESTRUCT 获得 gas 返还(对于占用几乎没有空间,可以返还创作费的60%左右)。 使用 SELFDESTRUCT 动态代码更改:这可用于 dApp 或 DAO 和其他类似用例的“升级”。 (1) 可以安全销毁。 GasToken 的开发者已发出警告,“虽然以太坊网络的变化将使 GasToken 无法使用、不可兑换、不可替代和/或毫无价值,但 GasToken 的开发者很可能会支持这种变化。” 删除自毁退款只会使某些操作更加昂贵(2 倍以上)。 从长远来看,(2)是不必要的,还有其他广泛使用的范例可以用来支持动态代码更改。 最容易实施的是 DELEGATECALL 转发器。 合约从存储槽中获取代码地址,然后调用对应地址的代码; 可以通过修改存储槽来更新代码。 不过,在短期内,一些应用程序使用了 (2)。

建议 1:完全删除 SELFDESTRUCT

从某个区块(用FLAG_BLOCK表示,比如PoW链与信标链合并的区块)开始,SELFDESTRUCT被完全禁用。 在这块和后面的block中,如果EVM在执行过程中遇到0xff的opcode,直接抛出异常直接退出,就像EVM在执行过程中遇到不存在的opcode一样。 为了在完全停用之前警告用户避免使用 SELFDESTRUCT以太坊退回pow,我们可以逐渐增加它的 gas 成本:如果 block.number + 10**6 >= FLAG_BLOCK以太坊退回pow,那么 SELFDESTRUCT 的 gas 成本将增加到 10**10 // ( FLAG_BLOCK - 区块编号)。

提案2:SELFDESTRUCT的阉割

以太坊经典和以太坊_以太坊和以太币有什么区别_以太坊退回pow

我们也可以保留这个操作码,但是改变它的行为,一方面,消除它对状态树的破坏,另一方面,增加一个新的特性,让合约可以被标记为不可自毁的(un-self-destructible),从而保证代码不可变。 暂时提出的新行为包括: 注意 A_offset 需要从 EIP-2929 的角度“访问”。 如果账户不在reachable account set中,则需要额外支付2600 gas加入reachable set。 另一种选择是通过将 sha3(storage_key) 替换为 sha3(storage_key + contract_nonce // 2**40) 来调整将存储密钥转换为树密钥的哈希函数。 请注意,无论如何都需要进行一些类似的调整,以促进合同级扩展键空间无状态。 合约可以指定 0xA8 作为代码中的第一个字节,EVM 会将其识别为空操作,但使用它来打开一个标志,在执行期间完全禁用 SELFDESTRUCT 功能(注意:这与 SET_INDESTRUCTIBLE 提案相同). 这两种解决方案也可以结合使用:现在立即阉割,将来完全切除。 或者,这个操作码永远无法完全删除,但最后只剩下一个功能,就是将合约当前的全部 ETH 余额发送到目标地址。 我们可以将此操作码重命名为 CLEAR。

(结束)

原文链接:

@HWeNw8hNRimMm2m2GH56Cw/自毁