原文链接: https://hackmd.io/@HWeNw8hNRimMm2m2GH56Cw/selfdestruct 作者: Vitalik 翻译&校对: 戡乱 & 阿剑 原标题:《Vitalik:务实地取消SELFDESTRUCT》 本文将介绍 SELFDESTRUCT 对以太坊生态弊大于利的一些理由,正是因为这些理由,我们应该以某种方式移除 SELFDESTRUCT 。鉴于有些合约已经使用了 SELFDESTRUCT ,我提出了一些只需要付出最小的代价就能消除 SELFDESTRUCT 危害的方法。 一段历史: SELFDESTRUCT 已经没有必要了 SELFDESTRUCT (最初叫作 SUICIDE )早在以太坊的极早期便已引入。实际上,它在 2013 年 12 月发布的以太坊协议 “规范” 预告中就已经出现了。那时候,几乎没人仔细考虑过状态规模管理的长远问题。但是,有个想法我大概还有些印象,为了防止没用的垃圾状态不受限制地膨胀,我们需要让任何创建出来的对象都可以被销毁。具体的思路是,当外部账户(Externally-owned accounts, EOAs)的余额为零时触发自毁,而合约在没用后可以调用代码里的一行自毁语句触发自毁。还有一个 gas 退款机制用于激励大家销毁没用的状态。 2014 年 1 月,Andrew Miller 指出了一个非常严重的问题:在 2013 年 12 月的规范设计中,EOA 很容易被重放攻击。如果我有 100 个币,我通过一笔交易发给你 10 个币,你可以简单地在链上重放这笔交易十次,从而转走我的全部余额。这个问题很快就修复了,为此我们增加了 nonce 字段。然而,nonce 字段的引入让删除 EOA 的愿望彻底破灭了:nonce 是不能被重置为零的(译者注:因为以太坊的状态树是根据账户地址计算的一种前缀树,(如果仍然允许 EOA 的 nonce 回退为 0)一旦该账户被再次使用,nonce 又要从零开始,就会被重放攻击)。 2015 年,有人提出了一些方案试图绕过这个问题,使余额为零的账户可以被安全地删除(译者注:nonce 重置时与区块高度关联,而非从零开始)。然而,当时很明显,几乎没有合约开发者真正使用自毁功能:因为要弄清楚什么时候自毁太难了,而奖励也太少了。 到 2019-21 年,事情已经变得很明显了,我们需要的是其他形式的状态管理,比如租金机制或者是长期未动的状态 “到期作废(expiring)” (即 “部分无状态(partial statelessness)”)。而如果我们采用这两个方案中的任何一个,只要它是有效的,那么合约是否有能力主动删除自己就一点儿也不重要了。 SELFDESTRUCT 是唯一一个破坏重要恒常性质(invariant)的操作码 SELFDESTRUCT 不仅没什么用,还会产生危害。它破坏了一些重要的恒常性质,这些性质本来是很好的,但是仅仅因为这一个操作码,我们就失去了这些性质。 (责任编辑:admin) |