http://www.7klian.com

概念 | 务实地打消 SELFDESTRUCT

观念 | 务实地撤销 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不只没什么用,,还会发生危害。它粉碎了一些重要的恒常性质,这些性质原来是很好的,可是仅仅因为这一个操纵码,我们就失去了这些性质。


SELFDESTRUCT是独一一个能在单个区块中改观无限个状态工具的操纵码

其他所有的操纵码都只能操纵账户中的单个值可能存储树上的单个 key,所以它们能改观几多牢靠巨细的工具是有限制的(凡是,挪用一个操纵码只能改观一个工具)。可是,SELFDESTRUCT 可以删除整棵存储树。

在今朝的状态树布局中,这是可以容忍的。可是,思量一种非凡的环境:当挪用 SELFDESTRUCT 删除很多存储插槽后,下一个事务又在同一个地点上建设一个合约并会见同一些存储槽。为了处理惩罚这种环境,需要特别设计巨大的缓存机制。另外,SELFDESTRUCT 还阻碍了我们改观状态存储名目。

以 SELFDESTRUCT 会阻碍的两类状态存储名目为例:

任意的 “单层” 方案(利用单棵树可能单个hashmap来存储所有合约账户的数据,以此取代今朝的每个合约账户都有一棵存储树的设计)存储槽可以存储在一些地点 “四周”,而不是存储在合约里的方案(这大概对优化见证巨细(witness size)有用,好比在 ERC20 转账或 Uniswap 生意业务的场景下)请留意,这不是在梦想,从基础上改观状态存储名目(如回收二进制树、Verkle 树等)的接头已经开始了,假如状态存储的数据布局可以或许靠近单一的的键/值存储布局,而且单个区块中可以改观的状态数量有一个较低的上限,那将大大扩展我们的选择空间。


SELFDESTRUCT是独一一个会导致合约代码变换的操纵码

假如在一个特定的地点上存储了一段代码,那么这段代码就会永远保存在链上。这样的恒常性质是有用的,因为在构建应用时不需要担忧这些代码会呈现变换。账户抽象化(Account abstraction)很是依赖该恒常性质用以支持库挪用。因为代码存在变换的大概,还会导致应用的安详性变得巨大许多:2017 年 Parity 的多签钱包就曾因为其引用的库代码合约被偶尔删除而彻底瘫痪。而独一粉碎代码稳定性的操纵码就是SELFDESTRUCT(是造成 Parity 多签猝死的祸首罪魁)。


郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。