北京大学肖臻老师《区块链技术与应用》ETH笔记 - 11.0 The DAO 事件

11.0 The DAO 事件

以太坊实现了去中心化的合约,有人想既然去中心化这么好,为什么不把所有的东西都改成去中心化呢?有人提出口号:decentralized everthing。DAO(Decentralized Autonomous Organization)去中心化的自治组织就是在这个背景下诞生的。传统社会下,组织都是建立在某种法律文件下的,比如说可以有个章程规范组织的行为,有时候还可能到政府登记注册。那DAO就是把组织的规章制度写在代码里,通过区块链的共识协议来维护这种组织的正常执行。

在2016年5月,出现了一个致力于众筹投资的DAO,它的名字为The DAO。DAO是一个通用的概念,凡是去中心化的自治组织都可以叫做DAO,The DAO 只是指具体的这个DAO,它的工作原理有点像众筹的投资基金,本质是允许在以太坊上的一个智能合约。如果你想参与The DAO,那你可以把以太币发给智能合约,然后可以换回The DAO的代币。需要决定投资哪个项目的时候,是大家投票决定的,手里的代币越多,投票的权重越大,最后有了收益也是按照智能合约中规定的规章制度进行的。

工作原理有点像DAC(Decentralized Autonomous Corporation)去中心化的自治公司,一般来说,DAC是出于盈利目的,DAO的话可以是出于非盈利性目的,比如某种公益事业。DAC虽然有公司这个词,但是在现实社会中,他没有公司应有的法人地位,一般来说也没有像董事长、CEO这样的职务。

The DAO出现的时候很风靡,因为从来没有如此民主的众筹方式,一个月的时间筹集到了当时价值1.5亿美元的以太币。当时媒体都在预测,未来几年The DAO的影响里会有多么多么的大,有的人甚至说The DAO在3到5年后的影响力甚至会超过以太坊本身。遗憾的是,The DAO一共只存活了3个月。

如果你是The DAO的投资者,你怎么取回的The DAO的收益,比如你已经换回了The DAO的代币,过一段时间你需要用钱了,想把以前投资的以太币换回来,怎么办?这个在The DAO的基金里是通过拆分的方式解决的。叫做:split DAO。拆分这个做法不止是取回自己的收益也是一种建立子基金的方式。拆分完之后得到个child DAO。设计理念是这样的,The DAO投资项目是靠大家手里的代币去投票,如果有一小部分人他的投资理念和其他人不一样怎么办。这一小部分人可以用拆分的办法从The DAO独立出来,成立一个自己的子基金,叫做child DAO。拆分的时候,他们手中的代币会被收回,换成相应数量的以太币,把相应的以太币打到子基金里,然后他们就可以投自己想投的项目了。拆分的极端例子就是单个的投资者成立一个子基金,然后在子基金里就可以把所有的钱投给他自己,这是投资者取回投资和收益的唯一途径,它没有像之前所说的withdraw函数。拆分前有7天的辩论期,拆分完之后有28的锁定期。就是这28天的锁定期给了后面事故中的补救时间。

拆分的理念并没有错,而且是民主制度的进一步体现,民主制度并不是绝对的少数服从多数,而是说也要尊重少数人选择的权力。拆分的理念没有错,那问题出在哪里呢?问题就出在split DAO的实现上。

从withdrawRewardFor这个语句开始,首先把钱还给调用这个函数的人,然后把The DAO中的总金额减少相应的数量,再把调用者的账户清0。在上一节讲过,正确的操作是先把账户清0,然后再转账。黑客就是利用这个漏洞进行的重入攻击,转走了5千万美元的以太币,差不多1/3。

引起了以太坊社区的大恐慌,币价的大跳水。一派认为,需要回滚交易,成立的子基金有28天的锁定期,所以黑客还没有办法取走以太币,还有时间可以采取补救措施;另一派认为,不需要做任何补救措施,因为黑客的行为没有违法,code is law。在疑似黑客的公开信中,黑客声称自己没有做错任何事情,既然代码里写的可以让我重复多次取钱,我就没有违反任何法律。这方认为,不应该回滚交易,区块链最重要的特性是不可篡改性,如果出了问题就回滚,怎么能叫不可篡改呢。而且这次出问题的只是以太坊上的一个应用而已,以太坊本身的代码没有问题,如果每个智能合约出了问题都回滚的话,不就乱套了吗。

以太坊的开发团队是支持采取补救措施的,主要是这个事情的影响太大了,占总以太币流通量的百分之十几。too big too fail,太大了以至于不能倒。那现在怎么补救呢?

比如说从黑客盗取以太坊的区块的前一个区块开始分叉,让分叉链更长,这样行不行。如果这样,不光是黑客的交易回滚了,区块上所有的交易都回滚了,会影响大量正常交易的人,所以这样做是不行的。要回滚的话只能是精确定位,只能是针对黑客盗取以太币的那些交易。怎么操作呢?以太坊的团队制度了两步走的方案。第一步,首先要锁定黑客的账户。第二步,把盗取的以太币设法退回去,清退The DAO基金上的这些钱。

第一步,怎么锁定这些账户。以太坊团队发布了一条软件升级,增加了一条规则,凡是和The DAO这个基金上的账户相关的,不能做任何的交易。许多矿工都升级了软件。这个是软分叉,软件升级是增加了一条判断的规则,新矿工挖出来的区块,旧矿工是认可的,旧矿工可以继续在这个区块后来开始挖,旧矿工挖出来的区块,新矿工有可能不认可,这样对系统只会造成临时性的分叉。遗憾的是,升级的软件有个问题,那就是判断是否和The DAO相关的交易这个步骤还要不要收取汽油费,如果不收取的话,可能有恶意的攻击者不断的发放非法的交易,拒绝服务(Deny of service),浪费矿工的资源,反正对攻击者来说成本很低。以太坊的这个升级没有收汽油费,受到了Deny of service,矿工之后就受不了了,纷纷重新使用升级前的软件。于是软分叉的方案失败了。

这个时候形式严峻了,软分叉的方案失败了,剩余时间不多了,以太坊团队想软的既然不行,那就来硬的了,设计了一个硬分叉的方案,通过软件升级的方法,把The DAO账户上的所有资金强行转到另外一个新的智能合约上去,新的智能合约就只有一个功能,那就是退钱!退回以太币。这个为什么是硬分叉?本来的转账是要有合法的签名,而这个升级的转账是没有合法的签名的,所以新矿工挖出来的区块,旧矿工是不认可的。挖到第192万个区块的时候,自动执行这条交易。

由此,社区彻底分成了两派,以太坊团队还写了一个合约来进行投票,用手中的以太币去投票,结果显示大多数人支持硬分叉,于是绝大数矿工升级了软件。最后硬分叉没有出现意外,成功了。但故事没有结束。

反对的认为,参与投票的人并不是很多,此外,投票的结果就一定是正确的吗。旧的那条链并没有消亡,还有矿工在上继续挖,挖出来的币叫做ETC经典以太坊(Ethereum classic),并在交易所上市交易了。一部分人挖是由于投机,一部分人挖则是出于信仰,坚持这种纯而又纯的去中心化理念,认为旧链才是正宗的以太坊,根正苗红,那些搞硬分叉的是在搞修正主义。

刚开始硬分叉的时候带来了一些问题,比如重放攻击,在新链上的合法交易放到旧链上去同样是合法的,反过来旧链上的合法交易放在新链上也是可以执行的。后来给两条链增加了chainID来解决。

为什么都是针对的都是所有的账户,而不只是对应黑客的账户?

如果只冻结黑客的账户,由于合约的bug修不了,那人人都可以成为黑客去继续盗取,所以必须把与DAO相关的所有账户都冻结了。

猜你喜欢

转载自blog.csdn.net/qq_40503872/article/details/124244957
今日推荐