原文来源:《Fork it》播客
编辑:白丁,极客web3
摘要:TheDAO是一个旨在创建去中心化自主投资基金的智能合约项目,于2016年由Slock.it团队开发并在以太坊上部署。TheDAO的设计愿景是通过智能合约实现资金管理和投票决策,以社区自治的方式管理资金和项目本身。该项目吸收了大量的ETH投资,成为了当时以太坊上最大的智能合约项目之一。
然而,TheDAO的合约在推出后不久就被发现了安全漏洞,黑客利用这些漏洞进行攻击并窃取了大量ETH。这一事件引发了整个区块链社区的轰动,促使以太坊社区就如何解决这一问题进行了广泛讨论和投票。
最终,以太坊社区通过硬分叉的方式来解决TheDAO事件,以拿回被盗取的资金,解除了黑客对资金的控制。这一事件成为区块链社区讨论和思考智能合约安全性、去中心化治理和社区共识等问题的重要案例。
本文为播客节目《Forkit》于2018年12月6日以TheDAO事件为主题的讨论纪要,在原文基础上有所删减。该期节目的主持人是Daniel,嘉宾是Jan,二人皆为CKB/Nervos公链的联创。
双方以参与者的视角,对TheDAO事件的来龙去脉进行了梳理,并据此对硬分叉、社区治理以及CodeisLaw等热门问题展开了深入讨论,时至今日仍然值得大家学习。

正文:


Danial:我们来聊聊大家比较熟悉的以太坊史上最大的一次分叉,即“TheDAO事件”。关于TheDAO事件,其实我们两个人都是亲历者。Jan能不能简单回顾一下你对TheDAO事件的感受?在你讲之前,我要先简单介绍一下TheDAO事件。首先的话是德国有一家当时非常知名的区块链公司,叫Slock.it。


2016年,那个时候区块链行业的环境跟现在有巨大差异,当时一家区块链初创公司是很难得到传统资本的支持,很难进行融资,因为你不是股份制公司,没有办法在现行的法律架构、监管机制下去监督和管理你的商业行为和收益,这些在当时都没有形成逻辑和框架。


当时虽然已经有了IC0这个概念,但还特别早期。IC0的热潮发生在2017年的年中,那么在IC0热潮一年之前的区块链公司该怎么去做早期融资?Slock.it提出了一个想法,就是用区块链的智能合约技术,做一个链上版VC,由大家用加密货币为这家公司众筹,再去投资区块链上的一些项目,share共享收益。这种利用智能合约即时清算的能力来共享分红的做法显然是非常棒的idea。


在当时,全世界超过15%的可流通以太坊,都投入到了TheDAO这个合约中。


然而,TheDAO的合约有一个bug被黑客发现并加以利用了。这个bug其实非常简单,是技术的大牛的话,如果看过代码,可以发现有一个可被循环攻击的bug,黑客可以利用bug,无限次地从TheDAO的合约中提款。比如黑客本来只能提10个ETH,但提款的行为可以循环一千次,那么他就可以提出一万个ETH。 


就是这样一个问题导致TheDAO合约里面超过30%的ETH流到了黑客控制的一个TheDAO子合约里,虽然不能立刻提走,要锁定28天。


当时整个社区一片哗然,我们都是这件事的亲历者。那一天,我记得我在imtoken的办公室里,还在做imtoken的手机钱包开发。当天下午,整个办公室里是一种凝固的气氛,因为TheDAO是我们每个人都特别看好且或多或少参与的项目,所以当时大家都特别紧张。Vitalik领导的以太坊核心团队,把全部的力量全部都集中在处理TheDAO黑客事件中。

Vitalik当时做了一个判断,说大致上有三条路可以解决这个问题:
第一条路就是认输,这些钱到时间就被黑客提走,然后我们想办法把TheDAO给停掉,把所有剩下的钱全部还给投资人;
第二条路就是完成一次软分叉,锁定黑客的钱不让他把这些钱全部拿走,但软分叉只是保证黑客不会获益,不能找回投资人的损失;
第三条路就是在软分差之后再执行一次硬分差,可以把黑客盗走的钱全部还给投资人。第三条路从经济角度来说显然是最好的,但问题是,这次硬分叉不是为了技术上的协议升级,而是为了解决黑客攻击,并不“名正言顺”。
对于这个分叉的正确性,当时整个社区展开了一次非常激烈的讨论,持续了很长一段时间。我记得我们每个人都是那场讨论的参与者,Jan你还有印象吗?
Jan:是的。TheDAO这个事情发生的时候,我记得我是在路上走着,然后印象中应该是少平来找我,因为那个时候我们在做EthFans,
Danial:对,少平当时是EthFans的运营负责人。
Jan:对,他当时微信告诉我说,好像是TheDAO出事了,然后我就去看,随后意识到这是一个很严重的安全事故。我马上就跟少平讲要拉个群,把大家社区里的人,至少中国社区这边给集中起来,方便商讨,也方便整个中国社区跟以太坊基金会的进一步沟通。这个事情既然是一个安全事件,就一定会有后续的措施,社区的沟通是必要的。 
我们当时和大家讨论,说这个攻击到底怎么回事?因为那个时候大家只知道出事了,但黑客是怎么把TheDAO合约里面的币弄走的,还不知道。全世界所有人都在分析,没人知道到底怎么回事。最后说是黑客连续发现了两个漏洞。第一个应该是SplitDAO的一个Proposal。但是这是不够的,因为这个漏洞只能被利用一次,只能偷走100万美元,那要怎么样做才能把所有钱都偷走?
这个时候就需要用到第二个漏洞,也就是最著名的那个重用攻击漏洞。把这两个漏洞组合起来的话,黑客就可以把所有的钱都偷走。所以说黑客实际上盗走了非常多的钱。
Danial:你可能对第二个漏洞的具体细节有点记不清了,但是我还记得另外一个事情,就是你当时是第一个在中文社区,我不知道是不是在全球,发现了两个漏洞组合用法的人,你马上就对此写了一篇文章。
你的文章写出来之后,我把它编辑到社区里面去的。我对这篇文章做了一个小小的贡献,就是起了一个叫“古尔丹之手”的名字,这篇文章特别有学习价值,包括你完整的分析过程,都特别好。
我觉得TheDAO事件特别跌宕起伏。之前我们公司有一个内部访谈,讨论TheDAO发生的这个攻击和最后为了硬分叉,怎么达成社区共识。我在里面还扮演了一个小小的、相对重要的角色,就是受到币乎创始人咕噜当时给我的一个idea的启发,做了一个投票网站叫CarbonVote。
然后我们用这个网站去搜集了所有TheDAO中还没被盗走ETH的投资者,用他们手上持有的ETH来去做一次安全的投票,决定要不要做这次硬分叉。
然后比较幸运的是,以太坊官方团队看到了我做的这个网站,他们认为我这个idea具有可操作性,最后把这个网站作为了决定要不要去硬分叉的投票主网站。这个是对我来讲深入参与到这个事件当中的有趣经历。我们后面其实有一篇文章《历史上第一次「虚拟国家的全民公投」》,写了整个故事。
Jan:对,我觉得这个是当时中国的以太坊社区做的一个比较有意义的事情。我记得当时咕噜和Vitalik,关于这个CarbonVote也是交流了很多,最后由你亲手把它实现出来。确实当时整个社区都在看这个,因为最后(以太坊)基金会那边就说这里有个投票网站,大家如果有什么意见我们可以投票来试试。
我觉得这个东西非常有意义,因为它其实显示了很多问题,一个是很多人来投票,可以看到社区一个大致的意见,但是也凸显了区块链上投票,甚至可以说是区块链治理一个很明显的问题——参与投票的人太少。
Danial:现在我想表达一下TheDAO事件之后,我的两个感触。第一个感触就是在TheDAO事件之前,我们做区块链开发,不管是底层还是应用,缺少那一根“安全神经”。TheDAO事件之前我们对安全这个事是没有sense的,但是TheDAO事件之后,我们每个人都把安全放在了一个举足轻重的地位。
我们知道每一步都可能产生无法挽回的损失,必须把安全放到一个非常重要的位置,任何时候都要有安全的sense。这是TheDAO事件前后,大家在做区块链的技术开发当中最大的改变。TheDAO之前,我们没有真正重视安全,TheDAO之后,我们觉得安全太重要了。
Jan:没错。我觉得TheDAO事件之前,写智能合约的程序员可能心理状态就是:不就是一个程序嘛。TheDAO之后才意识到:我们现在在写智能合约,这里面存着钱呢!
这其实是非常有教育意义的事情。你也可以认为TheDAO事件的发生是必然的,因为即使最后被偷钱的不是TheDAO这个合约,一定也会有另外一个ADAO或BDAO出来,因为大家的安全意识没有跟上。所以必须通过这种血的教训让大家建立安全观念。虽然很遗憾,TheDAO事件后面还是发生了无数的安全事件。 
我记TheDAO后面就是在上海举行的Devcon2,那届Devcon就冒出来非常非常多的关于形式化证明,还有智能合约安全的talk,大家对安全的关注度非常高。
我记得当时有一个很有意思的事情,应该是TheDAO事件发生之前,我在某一个群里面说,其实智能合约是非常需要形式化证明的。但是那个时候大家对形式化证明的前景非常非常的悲观,有一些人就是研究形式化证明的,他们在群里面说形式化证明好像能用到的地方很少,有很多事情不能做,可能还要很久形式化证明才能跟智能合约结合上,或者被广泛应用。 
但很神奇的就是,就过了半年时间,对于形式化证明的研究就已经遍地开花,有非常多做形式化证明的人立刻进入了这个领域,就像区块链把很多做密码学的人带到了这个领域,TheDAO事件把很多做形式化(证明)的人带到了Crypto里。从这个角度看,TheDAO事件对于学术研究其实是非常有推动意义的。
Danial:因为TheDAO事件之后,他们更容易拿到一些资源去支持他们在这条路上去研究,这会产生更好的进展。我觉得每过一段时间,在形式化证明领域就会有一些有趣的新东西出现,这是在安全这个角度上TheDAO事件给我们带来的最大意义。
另外我还想说的就是“难”,这个难指的是达成共识真难。在当时大家已经都是受害者,15%这么大量的token都已经被锁定,一片哀鸿遍野的情况下,依然很难达成硬分叉的共识。而且到最后即使我们认为通过投票网站都已经达成了一致,基本上没有什么争议了,但实际上并不尽然。 
我可以给大家讲一下,就是投票后大家都知道TheDAO事件最后还是决定去做硬分叉,但是硬分叉之前吵了很久。大家都非常理性,但双方各执一词,因为这件事牵扯到了“CodeisLaw”这个这条“法规”,在区块链里面到底是结果争议还是过程争议这种形而上的讨论,它本身就很难产生最终一致的结果。
虽然投票来说,大家还是理性地选择拿回损失,而且投票结果是一边倒,绝大多数的人赞成分叉而很少的人反对分叉。但即使这样,最后艰难达成共识之后还是多数人选择朝往左走,少数人选择往右走,也就是ETC的出现。
以太坊最后在TheDAO事件之后完成了分叉,形成了两条链,依然有很多人没有放弃“原来的以太坊”。
Jan:哎对了,那我其实想问你一个问题:你觉得大部分人选择支持分叉,是不是说明了大部分人可以为了利益放弃信仰,哈哈?
Danial:实际上我觉得其实当时是少部分人选择了支持分叉,而不是大部分。我给你解释一下是为什么。当时在整个以太坊里面,ETH总的流通量是7000万。那么我给你算一笔账,7000万的token里面,15%被TheDAO锁定,实际上只有这15%的持有者是利益相关方,而且我认为他们愿意参与TheDAO这个项目中,本身就属于社区中头部、活跃的一批人。
这些人的token全部被锁了,那只能是剩下的人来投票决定怎么去分叉,因为我当时没有做到让那些把自己的token锁在TheDAO合约里的人也能参与投票,如果做到了才叫公平,他们才是当事人。
所以其实是那些没有被锁的token的人决定了那些被锁掉的token的命运。而没有被锁的token里面,从投票率来看,最终参与的总数量其实占比是非常少的。具体数字我记不太清楚了,感觉也就是百万级别。所以只有少部分人参与了投票,而这少部分人大都是支持分叉的,最后才做了这么一个硬分叉的抉择。
你刚才问我说是不是大家都愿意选择利益而怎么样,我只能说即使这件事情都已经闹得轰轰烈烈了,但是愿意参与政治讨论或者愿意参与民主决策的人永远是人群中的少部分,而不是绝大多数。
Jan:我觉得你刚才的回答很好。其实你刚才正好说明了我的那个观点不是那么站得住脚,因为其实利益相关人的币都被锁住了,参与投票的其实是没有直接利益相关的。我觉得他们投票可能真的是更多地为了以太坊的未来着想。
Danial:我觉得是的,我相信他们是的。假如我们给所有被TheDAO锁ETH的用户分发某种token,让该token也能当做票来投的话,那情况肯定就是一边倒,参与者全部会投赞成分叉。但是当时的条件和技术以及项目的复杂度没有允许我去做这样一次复杂的投票设计。
Jan:但其实另外一方的观点又可以说,那你怎么知道参与了TheDAO的人,他的币全部被锁住了,也许他只投了1/10的币到TheDAO,还有9/10的币可以用来投票。
Danial:是的是的,这就很难说了嘛。但是总而言之,结果就是除掉15%被锁掉的token,剩下的token中,只有少部分参与了这次投票。
Jan:还有一种说法,就是说以太坊的这次分叉显然反映了所谓的CodeisLaw,就是鬼扯,也改变了区块链不可篡改的这个性质。你对这个说法怎么看?
Danial:我特别纠结。这件事情,从理性上来讲的话,我是愿意坚持CodeisLaw的,我不想打破一个像思想钢印一样的铁律。但是从当事人角度来讲,我也很在乎自己的经济损失,而且说实话当时投的还蛮大的。
如果你要是让我站在行业的角度来讲,其实我会理性一点,去恪守CodeisLaw,如果让我重新选择一次的话,我会愿意捍卫或者说遵循CodeisLaw去重新考虑。因为最难的不是提出一个观点或者信仰,而是去坚持一个信仰。
如果我们当时提出了CodeisLaw,但最后没有去坚持,那你以后再提出的任何一个观点或信仰,其分量是都是有待商榷的。
所以现在可以从这个角度去思考,我觉得即使付出再大的代价也要去坚持某种东西,那个坚持本身是非常有价值的。只是当时受限于一些比较狭隘的经济上的考虑,我没有那么坚持,但是现在我会坚持。
Jan:哇,我明白了,我觉得这是一个很有意思的观点。其实我对CodeisLaw一直是有一些怀疑的,因为作为开发者很容易理解,写出没有bug的代码,就是不可能的。尤其是当你的APP越来越大的时候。
所以说如果严格遵循CodeisLaw,那意味着代码写了就不能改,换句话说第一次写代码就不能出bug,这个事情好像没法实现,对吧?所以至少对于这个观点会有一些犹豫。然后从另外一个角度,我也想为以太坊辩护一下,我觉得以太坊并没有打破区块链不可篡改这个性质,为什么这么说呢?
虽然在TheDAO事件里面,以太坊做了硬分叉,但是硬分叉改变的是当前的状态,并没有改变历史。这二者的区别在于什么地方呢?
我们可以认为区块链里面的数据分为两种,一种是积累的历史,一种是当前的状态。拿比特币来说,积累的历史是什么呢?是过去发的所有交易里面被花掉的那些Transaction output,对吧。它们已经被花掉了,不再有效了,但是它们永久地存在于区块链网络里,包含它们的交易也永久地存在于区块链里,这是历史;
还没有被花掉的输出,也就是UTXO,这是当前的状态。那么其实当你去观察区块链的时候,你会发现历史是不会变化的,把交易打包变成区块放在那以后,历史就永远在那,但是当前状态是在不断改变的。
在正常的情况下,我们是通过发起交易的方式改变状态的,比如我去花掉两个UTXO,这两个UTXO就变成历史了,然后产生两个新的UTXO,这两个UTXO是新的状态,那么当前的状态也就随之改变了。 
所以说在区块链里面不可篡改的是历史,状态是在不断改变的。我们从这个角度去审视TheDAO硬分叉这个事件的时候,你会发现其实这次硬分叉是修复当前状态,而不是抹掉历史。
因为历史是指黑客发送的那些偷走TheDAO里面资金的交易,这些交易记录会永远地留在区块链上。这个是我认为的区块链最重要的性质,即所有发生过的事情都会被记下来,所有后面的人可以看见它原来的样子。
Danial:你这个讲法非常makesense,我非常认同。确实是如此,它改变的是状态。而且这次状态也是通过社区的共识去改变的,而不是说被被任意地篡改。
Jan:确实,这次硬分叉与所谓“任意的篡改”区别非常大,因为整个社区共识的过程其实花费了非常大的精力,你甚至可以把它看作是人肉的Pow。
Danial:但是你问我的问题——是否有些人会为了利益而选择分叉或者选择不分叉?我觉得分叉后面的事情就算是给了你一个答案。当社区达成共识,完成了ETH分叉之后,其实很快就出现了一个例外。
大概在两天之后,有一家交易所官方宣布,他们认为两个分叉都有存在的意义,所以决定去维护老的那条链(ETC)。然后你知道发生什么事情吗?交易所规定如果用户拥护交易所的这个决定,那么可以根据当前交易所中ETH的数量得到等额的ETC,即一份钱可以变成两份钱,基于利益的驱使,ETC马上就起来了,而且甚至一度在社区里产生了一个新的大范围讨论:
ETH还是不是应该叫ETH?或者说ETC才是真正的ETH,因为它才是原来的那条链。也就是说因为利益的驱使,该交易所中的用户倾向于认可会给大家送币的,原来的这条链。
Jan:对,不过这样的话,我刚才其实说错了,其实人们第一次意识到一份钱会变成两份钱是在TheDAO这个时候,不是BCH的时候。
Danial:是的,TheDAO其实是在BCH之前。
Jan:对对,没错没错,不过我觉得这个也不完全是利益驱使。因为这里面确实涉及到“你认为谁是对的"这个问题。你如果确实认为ETC是对的,那你可能很自然的就会去做这件事。当然当时也有很多阴谋论,比如说TheDAO事件或者说ETC事件就是这个交易所鼓动的,但是这个无从查证。
Danial:这可能也印证了一开始我在问你分叉的意义时,你提到的:在区块链世界里面,绝大多数人认可了一个方向,比如说向右走时,有一小部分人不认可,他们仍然保留向左走的权利。
Jan:没错。
Danial:所以用户仍能坚持原来的那条路。我们不去讨论动机,只讨论可能性,区块链永远把可能性留给了它的用户。用户愿意的情况下永远都有这样的一种可能性存在,这一点可以杜绝掉那种“民主暴政”。少数一定要服从多数吗?不一定啊。你可以不服从,分叉就可以了。而且说不定,这个分叉的结果到最后会走出一条完全不一样的路。 
严格地说我们每个人也都是ETC的受益者,因为ETC使我们确实多了另一份钱,哈哈哈。ETC发展到现在也很难说它被盖棺定论。但是总体来说,整个以太坊的生态还是集中在分叉后的ETH,包括Vitalik核心团队、基金会,还有所有的工具,周边社区等等。
其实过去的一两年中,我很少听到ETC相关的事情,只知道它还存在,而且似乎还受到了蛮广泛的支持,但是其发展并不让我觉得会走出一条完全独立的,并且非常promise的路。
Jan:其实我觉得ETC发展还不错。甚至是好于BCH。因为不管怎么样,ETC有一个社区,然后也确实在做一些开发以及其他很多的事情。而且当你考虑到以太坊未来要做PoS的时候,ETC想要坚持PoW,那么这两种完全不同的观念其实会吸引不同的人群。
还有一点,我觉得Vitalik一直对ETC非常友好,这是我非常喜欢以太坊社区的一点。相较来说,比特币社区对于这种分叉的事情是有一定攻击性的,比如说用算力去碾压你。但是ETC分叉的时候,Vitalik是非常包容的。
我记得当时社区里也有人说因为大家用的Pow算法都一样,我们是不是可以去攻击ETC?我们要51%攻击,把ETC搞跨,印象中Vitalik说过一些话,表示没有必要这样做。从那个时候到现在这么长的时间内,Vitalik也好,整个社区也好,对于ETC还是挺友好的。
大家觉得就是观念不同的两群人,你们发展你们的,我们发展我们的,双方还可以相互交流技术观点。都是在搞区块链,而且都是EVM生态中的区块链,相得益彰也是一件挺好的事情。我对此非常欣赏。
Danial:嗯,非常非常有趣,ETH对ETC的态度大家有目共睹,没有主动去攻击过,甚至没有在言语上表达过对立,这是非常难能可贵的一件事情,在比特币社区这很难想象,哈哈,其他我就不说了。我相信还有很多比特币的Holder和用户,所以我就不表达自己的政治倾向了。
Jan:哈哈,我觉得其实都挺有意思的吧。比特币社区可能因为中本聪很早就退出了,导致竞争的激烈程度会更甚一些;ETH这边因为有一个比较核心的团队在,所以能够更加友好一些。这算是不同的流派吧。但是我认为从长远来看,最后成功的L1的区块链一定会走向没有核心的状态,包括以太坊。
以太坊现在有基金会,有Vitalik,这些可以认为是以太坊作为一个处于追赶位的区块链网络,为了加快自己的发展,必须存在的设置。但未来如果以太坊真的成功了,做到很好了,不需要更多的、太大的改动时,我觉得Vitalik会慢慢的淡出,包括基金会也是如此。
Danial:我特别认同你的想法。而且我觉得你这个想法应该是在这个行业里面很久,经历过各种各样思想的洗礼,并且观察到很多的现象之后,真正意识到去中心化的本质和意义时,才会发自内心地去认同的一点。