北大肖臻老师《区块链技术与应用》系列课程学习笔记[26]以太坊-TheDao

目录

一、TheDao

        1.提出背景

        2.The DAO的工作原理

        3.拆分

        4.暴露问题

        5.讨论阶段

        6.补救措施

二、思考

一、TheDao

1.提出背景

        重入攻击在现实中真的发生过,这个事件发生在2016年,在以太坊历史上赫赫有名,造成了以太坊的分裂,可以说以太坊的历史都被它改写。

        比特币实现了去中心化的货币,以太坊实现了去中心化的合约,既然去中心化这么好,为什么不把所有的都改成去中心化,所以有人提出一个口号:decentralized everthing,DAO(Decentralized Automous Organization,去中心化的自治组织)就是在这个背景下产生的。
传统社会当中,组织是建立在某种法律文件基础上的,如需要有一个书面的章程,规范组织的行为,有时候还需要到政府进行登记注册。在区块链上,DAO这个组织就是建立在代码基础上的,组织的规章制度是写在代码里的,通过区块链的共识协议维护这种规章制度的正常执行。

2.The DAO的工作原理

        在2016年出现了一个致力于众筹投资的DAO——The DAO,类似于一个众筹的投资基金(用来投资项目的),只不过投资的钱是在区块链上众筹得到的,其本质是一个运行在以太坊上的智能合约。如果想要参与The DAO,可以把以太币发给这个智能合约,然后换回The DAO的代币。需要决定投资哪个项目的时候是大家投票决定的,手里的代币越多,投票权中就越大。投资后如果有了收益,也是按照智能合约中的规章制度进行收益分配的。

        The DAO工作原理有点像DAC(Decentralized Automous Corporation,去中心化的自治公司)。DAC和DAO的区别是:DAC是处于盈利目的的,DAO可以是处于非盈利性目的,如公益事业。虽然是Corporation,但是现实中不具有公司应有的法人地位,也就是董事长之类的职务。

        The DAO,从2016年5月开始众筹,受到瞩目,因为以前没有这么民主的投资资金,在当时被称为是一种伟大的尝试,引起互联网社区里很大的兴奋,从5月开始众筹,一个月众筹到了1.5亿美元的以太币。遗憾的是The DAO只存活了3个月,问题在哪呢?假如投资者需要用钱了,想把以前投资的以太币换回来,在The DAO的基金里,以拆分的方法实现。

3.拆分

        拆分过程,就是split DAO(拆分DAO),这个拆分的方法并不仅仅是取回收益,还是建立子资金(chlid DAO)的方法。如果有一小部分人和其他人的投资理念不一样,这种情况下,这一小部分人可以用拆分的方法成立自己的子资金,拆分的时候手中的代币是要被收回的,换成相应数量的以太币,然后就可以投想投的项目。极端情况下,单个投资者成立一个子资金,在子资金里就能把所有的钱投给自己,这是投资者取回投资和收益的唯一途经。并没有withdraw()函数,竞拍不成直接取回,这里不行,只能用拆分的方法。

        拆分的时候有7天的讨论期,大家可以讨论这个拆分好不好,拆分之后有28天锁定期,拆分后,把钱打入子资金里面,但是只有28天后才能取出来,就是这28天给了以太坊一个缓冲期。拆分的理念没有错,而且可以说是民主制度的进一步体现,问题出现在splitDao实现上,如下图1-1所示,他是先转账后扣除总资金,然后把账户清零,正确的操作顺序是先清零后转账,黑客就用这个漏洞进行重入攻击。

4.暴露问题

图1-1

         The DAO,从2016年5月开始众筹,一个月众筹到了1.5亿美元的以太币,然后黑客就在这里利用重入攻击从里面转走了5千万美元的以太币,这件事当时在以太坊社区引起了很大的恐慌,大家本来认为前途无量的The DAO,去中心化这么美好的理念,在现实中被证明是不堪一击的。这个事件也引起了以太币价格的大跳水。

5.讨论阶段

        针对这样的重入攻击,以太坊社区进行了激烈的讨论,社区讨论的补救措施大致分为两类:

(1)回滚交易

        成立的子基金有28天的锁定期,所以黑客暂时还没有办法把钱取走,还有时间可以采取补救措施。通过回滚交易,不让黑客得逞,以此保护广大投资者的利益。(如果出了问题就回滚,就不是去中心化的);

(2)不需要采取补救措施

        因为黑客没有做错,没有违反法律。Code is law,规则由代码决定,代码中的漏洞也是规则的一部分。这个事情发生之后,网上流传着一封据说是黑客写给以太坊社区的公开信,公开信中黑客就说:“我没有做错任何事情,我只是利用了你代码中的一个feature,是代码写的让人可以重复多次取钱,并没有违反任何法律。”

        以太坊有一部分人认为,尤其不应该回滚交易,因为区块链最重要的特性是不可篡改性,如果出了问题就会滚,怎么能叫不可篡改呢?而且这次出问题的只是以太坊上的一个应用而已,The DAO是以太坊上的一个智能合约,以太坊没有问题,是智能合约存在一个安全漏洞。但是以太坊有那么多的智能合约,如果每个合约出了问题都回滚的话那不就乱套了。

6.补救措施

        Vitalik Buterin团队认为因为该事件影响非常大,The DAO又占据了超过10%的以太币,too big to fail,所以还是决定回滚了交易。如果就是一个小的智能合约出了问题,或者转账转错了,以太坊社区是不管的,开发团队也是不管的。

        如果使用分叉攻击,从黑客最开始重入攻击的区块开始分叉,是不行的,因为还存在一些其他交易,如果要回滚必须精确定位到黑客盗取以太币的交易,其他发布的正常交易不能受到影响,这是采取补救措施的一个原则。

        具体的补救措施

        以太坊团队对此制定两步走战略:①锁定黑客账户;②清退The DAO基金上的这些钱。

(1)软分叉补救

        以太坊团队发布软件升级,在升级的软件里增加了一条规则,凡是跟The DAO这个基金上的账户相关的,不允许做任何交易,发布之后,大多数矿工都做出了升级,这里形成的是软分叉(临时性分叉),因为增加这个规则之后,新矿工挖出的区块旧矿工是认可的,但是旧矿工挖出的区块,新矿工有可能不认可。

        这个软件升级的想法挺好的,也得到了大多数矿工的支持,但是升级后的软件有Bug:不予执行的非法交易用不用收取汽油费?汽油费的收取是为了防止Denial of Service(拒绝服务),如果不收取汽油费,就会有恶意的攻击者一直发送非法交易,浪费矿工资源,矿工也得不到交易费,反正对他们来说成本很低。以太坊发布的这个软件升级,恰恰就是在这种情况下,没有收取汽油费(检查到地址错误的时候没有收汽油费)。结果导致网上有大量的Denial of Service,非法交易进行攻击,于是后来就很多人恢复了原来的版本。

        软分叉的方案就失败了。这个时候,情况就比较严峻了,子基金成立之后有28天的锁定期,然后黑客就可以把钱取走了,软分叉的方案失败之后,剩下的时间就不多了。

(2)硬分叉补救

        后来新的措施,以太坊团队采取硬分叉方案:通过软件升级的方法,把The DAO账户上的所有资金,强行转到新的智能合约上去。这个新的智能合约只有一个功能:退钱,把代币退回成以太币。这种做法的本质是:用软件升级的方法强行重新记账,本来转账需要合法签名,现在的做法是,凡是The DAO上面的资金,不管本人同不同意,都要强行转入一个新的智能合约。升级的软件里规定了强制执行的具体日期:升级了软件的矿工,挖到第192W个区块的时候,自动执行转账交易,不用合不合法签名。这是在升级的软件里写死的规则,旧矿工是不会认可这些区块的,因为没有合法签名,属于非法交易,所以这是硬分叉。

        硬分叉的方案一经提出,在以太坊社区内引起了激烈的辩论,那些曾经认为不应该进行补救措施的人,认为这种强行记账的方式是不能接受的。支持硬分叉和反对硬分叉的人分成两派,以太坊团队实现了一个用智能合约投票的功能:把手里的以太币发到智能合约里进行投票,最后投票的结果是大部分人支持硬分叉,于是大多数矿工升级了这个硬分叉之后的版本。大家就平心静气等着挖到第192W个区块,最后,硬分叉成功了,黑客还是没能盗走以太币。

(3)后续

        当时那些反对硬分叉的人,并没有因为这个投票结果而改变立场。因为投票时是有两个智能合约,一个代表支持硬分叉,一个代表反对硬分叉,需要的是把以太币发送到代表自己意见的智能合约里,然后这些以太币会锁在相应的智能合约里面,直到投票结束再退回。

        实际上,有很多以太币根本就没有参加投票;更重要的是:投票能说明问题吗?大多数人的意见一定是对的吗?这样做真的公平吗?硬分叉之后,旧的那条链并没有消亡,还是有一部分矿工留在上面继续挖,只不过算力大幅度下降了,不到原来的1/10,但是相应的挖矿难度也降低了。过了一段时间,有一些交易所开始上市交易旧链上的以太币。以太币ETH,硬分叉后新链继承了这个符号,仍叫ETH,旧链则为ETC(Ethereum Classic)。

        在旧链上挖矿的矿工有些是为了投机,也有一些是为了信仰,他们坚持着纯粹的去中心化理念,认为旧链才是正宗的以太坊,那些搞硬分叉的是在搞修正主义。一开始大家认为ETC的前途非常迷茫,但是一直到现在,仍然是新链和旧链并存。旧链和新链并存,这会导致重放攻击,在新链上的也可以在旧链上执行,旧链上的合法交易在新链上也可以执行,于是增加一个chainID区分它们。

二、思考

无论是软分叉的解决方案还是硬分叉的解决方案,都是为了锁定黑客盗币的账户,但是解决方案中都是将The DAO的所有账户作为目标,软分叉的时候The DAO的所有账户都不准交易,硬分叉的时候,The DAO的所有账户都要转入新智能合约,为什么不能只针对黑客账户?

        如果只冻结黑客账户,那么其他账户该如何处理,其他账户还能正常运行吗?如果智能合约有BUG,发布到区块链上之后是修改不了的。The DAO这些智能合约是有BUG的,光冻结黑客账户,剩下账户继续运行的话,下一次其他人又可以成为黑客,再用同样的方法偷以太币,所以智能合约出现这种致命性BUG就作废了。硬分叉之后,The DAO的生命周期就结束了。

猜你喜欢

转载自blog.csdn.net/YSL_Lsy_/article/details/126622982