区块链学习笔记(13)[ ETH-TheDAO事件 ]
TheDAO事件是以太坊历史上赫赫有名的事件,造成了以太坊的分裂,也改写了整个以太坊的历史。大家知道比特币是去中心化的货币,以太坊是去中心化合约,既然去中心化这么好,为啥不一切都去中心化呢,于是在这个背景下产生了DAO这个组织。DAO:Decentralized Autonomous Organization 去中心化自治组织传统社会中,组织是建立在某种法律文件基础上的,或许要到政府登记注册。而DAO是建立在代码基础上的,规章制度写在代码里,通过区块链的共识协议来维护规章制度的正常执行。2016年5月份出现了一个致力于众筹投资的DAO,它的名字就叫做The DAO,这个名字起得有些奇怪,并不是说The DAO代表所有的DAO,它仅指这一个DAO。The DAO的本质是运行在以太坊上的智能合约,它是众筹投资的基金,只不过资金是在区块链上用众筹的方法得到的。The DAO工作原理:如果你想参与The DAO,你可以把以太币发给The DAO智能合约,换回The DAO的代币,具体投资什么项目,也是大家投票决定的,代币越多投票权重越大,投资收益的分配也按照智能合约中规定的来分配。这在当时被称为伟大的尝试,它不同于传统的投资基金,甚至有人认为3-5年后The DAO的影响力将超过以太坊本身。当时仅用一个月的时间The DAO就筹集到了价值1.5亿美元的以太币,这还是在当时以太币价格挺便宜的情况下,2016年ETH全年高点18美元,今天2000+。可惜,The DAO只存活了三个月,问题出在哪里呢?具体来看,如果投资者想投资其它的项目或取回以太币时,当时是采用拆分的方式来实现的(split DAO),拆分产生子基金(child DAO),就是收回代币,释放相应的以太币到对应的子基金里面去,这些投资者就可以去投自己想投资的项目。拆分的极端例子就是单个投资者成立一个子基金,然后就可以把所有的钱投资给自己。这是投资者取回投资和收益的唯一途径。 拆分之前有7天的讨论期,拆分之后有28天的锁定期。[关键的28天,后文会讲到]拆分的理念没有问题,且体现了民主。但是问题出现在split DAO的实现上。来看具体代码:红框中:先把钱转给调用函数的人,然后把The DAO中的总金额减少相应的数量,再把调用者的账户清零。有黑客利用先转账再清零的漏洞进行了重入攻击。[重入攻击可自行问AI,大致意思就是转账操作执行完还没来得及改余额,趁合约还没改完状态,反复调用函数再执行转账]。黑客从里面转走了价值五千万美元的以太币。这件事造成了以太币社区很大的恐慌,因为原本大家以为前途无量的 The DAO、以及去中心化这么美好的理念在现实中不堪一击。这件事也导致以太币价格大跳水。一派认为应该采取补救措施,回滚交易。因为前面说过,子基金有28天锁定期,所以黑客在这个时间里没法把钱取走。另一派认为不需要采取措施,因为黑客的行为本身没有违法,黑客只是利用了你代码中的漏洞。而且code is law,代码漏洞也是规则的一部分。区块链最重要的特点是不可篡改性,如果出了问题就回滚,怎么能叫不可篡改呢。而且,这次出问题的只是以太坊上的一个智能合约而已,以太坊本身的代码并没有问题,只是The DAO的智能合约里存在一个安全漏洞。以太坊系统上有那么多的智能合约,如果每个智能合约出了问题都来回滚的话,那以太坊凭什么叫不可篡改的去中心化账本。以太坊的开发团队是支持回滚的,因为这个事件影响太大了。因为The DAO筹集到的以太币数量占到了当时以太币流通量的10%以上,这已经很大了,如果放任不管,这些筹集的以太币中大约1/3要被黑客拿走,会造成大量的投资者利益受损。而且很多人认为The DAO已经到了too big to fail的程度了,类似于金融危机中某些大型机构已经到了大到不能倒的地步,否则会摧毁整个金融系统。例如2008年金融危机中美国政府拯救房地美和房利美。顺便说一句,普通人别指望这个,对于小的智能合约出了问题,或者是用户转账转错了的情况,以太坊社区是不管的,别指望人家来拯救你。方法一,在黑客盗取的区块之前一个区块开始分叉。也就是原来的链大家不认了,从出事区块的前一个区块开始重新挖区块,直到这条新链成为最长合法链。其实这就是常见的分叉攻击。但是这会导致原来链上在黑客盗取区块之后的所有智能合约都回滚了,这里面有大量的正常交易。The DAO只是以太坊中大量的智能合约之一而已。所以如果这样回滚,以太坊就乱套了。那么只能回滚黑客盗取的那些交易,而不能影响其它正常的交易。那怎么办呢?以太坊团队制定了两步走方案,1、锁定黑客的账户。2、设法退回被盗的以太币。第一步:以太坊团队发布一个软件升级,升级软件里增加一条规则:凡是跟The DAO基金相关的账户不允许做任何交易。大多数矿工升级了这个软件。还记得第四篇笔记中的分叉吗?这是一个软分叉(因为最后能合在一起)。链接在这里:区块链学习笔记(4)[ 脚本与分叉 ]遗憾的是,升级后的软件有一个bug,是一个跟汽油费相关的bug。对于跟The DAO相关的交易出现且被矿工不予执行后,要不要收取汽油费?还记得之前说过,汽油费的设计在于防止恶意攻击的人不断发布非法交易,浪费矿工资源。而以太团队的这次升级,就是规定在这种情况下不收汽油费。这导致之后网络上出现了大量的这种攻击,反正又不收费,导致矿工们精疲力尽。于是大量矿工回滚软件升级,回到了原来的版本,导致这次软分叉方案失败。还记得28天锁定期吗,软分叉方案失败后,剩下的时间已经不多了,一旦28天期满,黑客就可以把钱取走。既然软分叉不行,以太坊团队于是设计了一个硬分叉方案:通过软件升级的方法,把The DAO账户上的所有资金强行转到一个新的智能合约上去,新的智能合约只有一个功能,就是退钱!通过软件升级的方法强行重新记账,原本转账必须有合法签名才行,而现在凡是The DAO账户上面的资金,不管本人是否同意,都强行转到一个新的合约上面。升级软件中规定,所有升级软件的矿工,在挖到第192万个区块时,自动执行这个转账交易,不需要合法签名。之所以叫硬分叉,是因为没升级的旧矿工不认这些交易,因为没有签名的交易在他们看来是非法的。于是两条链永远合不到一起。这个硬分叉方案引起以太坊社区轩然大波,原本社区关于这个事件就分成了两派,两派争论的已经非常激烈。最后采用投票表决(以以太币数量为权重)的方式决定,投票结果是大部分矿工同意硬分叉。最后,大部分矿工升级了软件,这一次软件升级没出现意外,在挖到第192万个区块后,硬分叉成功,黑客最终没能盗走以太币。当初反对硬分叉的人并没有因为这个投票结果改变立场,他们认为这次投票参与的人没那么多,而且更重要的是,他们认为投票并不一定就公平,大部分人的意见就一定是正确的吗,难道不会发生大多数人的暴政吗,这样一定公平吗?分叉之后,新链挖的以太币继承了ETH符号,旧链上继续挖出的以太币叫ETC(Ethereum Classic),之后,有一些交易所开始上市交易旧链上的以太币。硬分叉之后,旧的那条链并没有消亡,还是有矿工留下继续挖,只是算力大大下降了,意外之喜是算力下降了,挖矿难度也变得容易了,所以还有有一些矿工留在了旧链继续挖。这里面有部分矿工是因为难度下降有利可图,还有部分矿工在坚守信仰、坚持绝对纯粹的去中心化理念。于是新链和旧链依旧并存,但是两条链并存会导致重放攻击(由于两条链的代码几乎完全一样,黑客攻击之前的区块链完全一样,所以可以把一笔交易在两条链上分别发一遍,系统都认为是合法的),这给管理带来难度。之后,又给这两条链增加了chainID,把两条链区分开来。时至今日,ETH和ETC在各大主流交易所都可以交易。