The DAO

Decentralized Autonomous Organization

比特币实现了去中心化的货币,以太坊实现了去中心化的合约,有人想既然去中心化这么好,为什么不把所有的东西都改成去中心化呢?有人提出口号:let’s decentralize everything。

DAODecentralized 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 2016年5月份开始众筹的时候在当时受到了很大的关注度,因为以前从来没有这样民主的投资基金,一个月的时间筹集到了当时价值1.5亿美元的以太币。当时媒体都在预测,未来几年The DAO的影响里会有多么多么的大,有的人甚至说在3到5年以后The DAO的影响力甚至会超过以太坊本身。遗憾的是,The DAO一共只存活了3个月。

THE DAO的问题

如果你是The DAO的投资者,你怎么取回自己的收益,比如你参与The DAO,投了一笔以太币过去,换回一些The DAO的代币,过一段时间你需要用钱了,想把以前投资的以太币换回来,怎么办?

这个在The DAO的基金里是通过拆分的方式实现的,叫做:split DAO。拆分的做法不止是取回自己的收益,也是一种建立子基金的方式,拆分完之后得到一个child DAO。

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

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

问题就出在split DAO的实现上

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

这件事情在以太坊社区引起了很大的恐慌,引起了币价的大跳水。以太坊社区对此进行了激烈的讨论,该怎么办?

社区的意见分裂为两派:

一派认为,要回滚交易,成立的子基金有28天的锁定期,所以黑客暂时还没有办法取走以太币,还有时间可以采取补救措施

另一派认为,不需要做任何补救措施,因为黑客的行为没有违法,code is law。在疑似黑客的公开信中,黑客声称自己没有做错任何事情,只是利用了代码中的feature,既然代码里写的可以让我重复多次取钱,我就没有违反任何法律。这方认为,不应该回滚交易,区块链最重要的特性是不可篡改性,如果出了问题就回滚,怎么能叫不可篡改呢。而且这次出问题的只是以太坊上的一个应用而已,以太坊本身的代码没有问题,如果每个智能合约出了问题都回滚的话,不就乱套了吗!

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

(1)比如说从黑客盗取以太币的区块的前一个区块开始分叉,让分叉链更长,这样行不行?

如果这样,不光是黑客的交易回滚了,区块上所有的交易都回滚了,这里有很多合法的交易会影响大量正常交易的人,所以这样做是不行的。

(2)以太坊的团队制度了两步走的方案。第一步,首先要锁定黑客的账户。第二步,把盗取的以太币设法退回去,清退The DAO基金上的这些钱。

第一步,怎么锁定这些账户。以太坊团队发布了一个软件升级,增加了一条规则,凡是和The DAO这个基金上的账户相关的,不能做任何的交易。许多矿工都升级了软件。这个是软分叉,软件升级是增加了一条判断的规则,新矿工挖出来的区块,旧矿工是认可的,旧矿工可以继续在这个区块后来开始挖,旧矿工挖出来的区块,新矿工有可能不认可,如果这个区块里包含了The DAO账户的交易,新账户就不认可,这样对系统只会造成临时性的分叉。

遗憾的是,升级的软件有个问题,那就是判断是否和The DAO相关的交易这个步骤还要不要收取汽油费,如果不收取的话,可能有恶意的攻击者不断的发放非法的交易,拒绝服务(deny of service),浪费矿工的资源,反正对攻击者来说成本很低。以太坊的这个升级没有收汽油费,受到了deny of service,矿工之后就受不了了,纷纷重新使用升级前的软件。于是软分叉的方案失败了。

这个时候形式严峻了,子基金成立之后有28天的锁定期,然后黑客就可以把钱取走了,软分叉的方案失败了,剩余的时间不多了。以太坊团队想软的既然不行,那就来硬的了,设计了一个硬分叉的方案,通过软件升级的方法,把The DAO账户上的所有资金强行转到另外一个新的智能合约上去,新的智能合约就只有一个功能,那就是退钱,当初是用以太币买的The DAO的代币,现在可以把代币退回成以太币。

这个为什么是硬分叉?这种做法的本质是用软件升级的方法强行重新记账,本来的转账是要有合法的签名,比如说我要把你账上的钱转走,需要有你的签名才行,而这个升级的转账是没有合法的签名的,凡是The DAO上面的资金不管本人是否同意都要强行转到新的智能合约上去,挖到第192万个区块的时候,自动执行这条交易。新矿工挖出来的区块,旧矿工是不认可的,所以是个硬分叉

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

ETH和ETC 

但故事没有结束,反对者认为,参与投票的人并不是很多,此外,投票的结果就一定是正确的吗?比如中国有很多看不起病的穷人,也有很多超级富豪,如果发起一个投票决定是否要把富豪的钱分给急需救命钱的人,这样可行吗?

旧的那条链并没有消亡,还有矿工在上继续挖,算力大幅度下降,不到原来的 十分之一,挖矿难度大幅度下调。旧链上挖出来的币叫做ETCEthereum Classic,经典以太坊),并在交易所上市交易了。一部分人挖是由于投机,一部分人挖则是出于信仰,坚持这种纯而又纯的去中心化理念,认为旧链才是正宗的以太坊,根正苗红,那些搞硬分叉的是在搞修正主义。

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

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

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

参考资料

北京大学肖臻老师《区块链技术与应用》公开课

猜你喜欢

转载自blog.csdn.net/LDDlove_java/article/details/127480573
DAO