关于状态清理的问答

叉叉XX   |     |   1293 次阅读

原文:https://www.reddit.com/r/ethereum/comments/5es5g4/a_state_clearing_faq/
作者:以太坊基金会 Vitalik Buterin
发布时间:2016.11.25
翻译:许昕

为什么状态需要被清理

在十月发生的DoS攻击之中,攻击者利用了一个底层协议缺陷,在以太坊状态中低成本得创造了大量的空账户。攻击者通过循环得利用SUICIDE opcode中的以太币转让功能来“触碰”一个生成新账号,然后一次又一次得在同一个交易中call这个合约直到被删除为止。通过这个方式,生成一个新的账户仅仅需要90的gas,在十月的EIP 150硬分叉阻止他们之前,攻击者生成了总共近1900万个空账户。

什么是空账户?

一个空账户指一个余额、nonce和代码都为0的账户。空账户与不存在的账户之间几乎没有区别,除了他们多了一些gas运算之外。同时,空账户只要被转入任意数额的以太币就可以快速得被转为正常账户。理论上来说,如果矿工们接受0交易费的交易,从空账户或者不存在的账户发起一个交易都是可行的。最现实的区别是,空账户需要被储存在以太坊状态树(Ethereum State Tree)中,而不存在的账户们不是。

在状态树中有1900万个空账户会有什么问题呢?

  1. 他们浪费硬盘空间
  2. . 他们增加同步时间,特别是对于快速和跃迁模式的同步
  3. 他们使得交易处理速度变慢,因为将大量或者所有状态存入内存变得困难,所以会造成更多的硬盘读写

我们打算怎么样删除他们?

伪龙硬分叉加入了一套新的协议规则,通过它:1. 不再有新的空账户能被创造(任意之前可以生成空账户的操作现在都只会保持账户不存在的状态);2. 交易可以通过“触碰”空账户来删除他们。

短期来说,这套协议给了我们一种清除那些账号的方式。中期来说,只要所有的空账户都被删除,这简单化了以太坊协议基础,因为不再有账号“是否存在”的概念,编码也不再需要跟踪这个概念;同时,一个账号是否需要被储存在状态树中可以直接通过账户的余额、nonce和编码来判断。

分叉已经在这周早些时候被部署。现在,我们需要发送约4万个交易到以太坊网络上来通过循环“触碰”那些攻击者生成的空账户,最终删除他们。

这些操作正在让我的节点变慢。一定要用这个方法吗?为什么不直接在协议底层设置直接自动删除那些账户呢?

这些交易让节点变慢的主要原因是他们正在通过一次次“触碰”来删除账户,每次触碰删除一个账户,这需要通过5-10次对硬盘数据库的编写操作。任何能完成这件事情的流程都会造成同样的压力。我们可以想象直接生成全新的状态树这种方式,这听起来效率更高,但是这也会导致更复杂的编码和测试,同事会有更高的风险导致共识失败。

这可以定义为一种DoS攻击吗?会不会未来被攻击者使用?

不会。一旦所有的空账户被删除,未来对账户的“触碰”就不再有意义,只要他们不转移价值。然而,价值转移会消耗额外的9000gas,所以这对于攻击来说十分昂贵。到那时,基本上不可能通过这个技术来制造难以处理的交易。

这个清理流程需要多久

至今,大约400万个空账户已经被清楚,还剩大约1500万个。我们预计还需要一周来完成清理。

我在哪里可以看到整个清理流程的过程?

清理的合约在这里可以被看到:
https://etherscan.io/address/0xe9c9068240d8450da314f60804debfc194b72309.
你可以在ethstats看到交易正在不停进入:https://ethstats.net/ 注意清理流程不是24小时的,有的时候它会因为各种技术原因暂停几分钟或几小时,这很正常,不用特别在意。

这会不会影响到不可篡改性?

不会。因为空账户现在功能性上与不存在的账户相同,区别仅仅是他们被储存在状态树根部,整个账户清除过程除此之外对于以太坊状态中的所有有“意义“的东西不造成任何影响。任何拥有以太币的账户任然拥有那些以太币,任何拥有Maker Coins的账户任然拥有那些Maker Coins,所有的合约运行规则和以前还是一模一样。如果一个账户被删除,那么发送任何额度的以太币到那个账户都会重启那个账户,那个账户中的以太币和其他资产都可以被正常使用。

我们需要做什么?

请保证你的节点已经更新。如果你的电脑不使用固态硬盘,可以考虑试试geth轻客户端,因为传统硬盘的读写十分缓慢。除了这些,对你的影响基本不存在。

 
3 人喜欢