我在《The DAO攻击(上)》这篇文章中提到了 The DAO 被黑客攻击后在以太坊社区造成了巨大恐慌,如果不及时解决,将会对整个以太坊系统产生不可想象的冲击。下面我们一起来看看黑客发动攻击后发生了一些什么?
激烈争论
黑客攻击The DAO ,拿走了5000万美金的以太币;这个事件发生之后,所有人都大吃一惊。随后,以太坊社区对此进行了非常激烈地讨论,讨论的核心就是一个问题:
该怎么办?
在整个以太坊社区中,主要有两派不同的观点:
1、进行补救,需要回滚交易
2、不进行补救,因为黑客并没有做任何非法的事情
支持进行补救的人认为,黑客的行为在事实上已经对The DAO造成了巨大伤害,甚至会威胁到以太坊系统本身。关键在于,在The DAO 这个智能合约中规定了最终拿出以太币是有28天锁定期的,现在进行补救还来得及。把The DAO 上的交易及时进行回滚,能够保护所有投资者的利益。
支持不进行补救的人认为,黑客的行为并没有违法。为什么这么说呢?
区块链领域中有这样一种说法:
code is low. (代码就是法律)
既然规则已经在代码中写好并且是不可篡改的,而黑客又确实是按照这个规则行事的。即使黑客的行为给The DAO 带来了巨大伤害,归根结底,从一开始The DAO的规则设定就是有问题的,这个有问题的规则也是代码的一部分。黑客又做错了什么呢?
据说,当时互联网上流传着一封黑客写给以太坊社区的公开信。大概意思是说,我并没有做错什么事儿,我只是利用了The DAO 中Split DAO的一个feature;既然代码有这样可以让我重复取钱的feature,我只是这么干了而已,我并没有违反任何法律。
所以,有一个派人就认为不应该进行篡改。不支持进行补救,还有一个更为重要的原因,交易回滚意味着违背了区块链技术体现出来的一个及其重要的特性,不可篡改性。现在连交易都可以回滚了,那和中心化的系统又有什么分别呢?
更为关键的是,The DAO只是运行在以太坊系统上的一个智能合约。实际上,这次的问题并不是以太坊系统本身的问题,而是这个智能合约有问题。系统上的一个智能合约出现了问题就进行回滚,那以太坊上那么多的智能合约,如果一出现问题就进行回滚,还不全乱套了。
好了,两派的观点,我都分别阐述了一下。大家其实可以设身处地思考一下,如果你是当时以太坊社区中的一员,你是支持进行补救呢?还是支持不进行补救呢?
ETH核心团队的态度
以太坊创始人团队是支持进行补救的,主要原因是The DAO攻击产生地对于整个以太坊系统的影响太大了。如果放任不管,难道就眼睁睁看着那么多的以太币落入黑客手中吗?那么多的投资者的利益损失又怎么办呢?
还有一点,The DAO已经到了too big to fail的地步了,不进行补救必然会对以太坊本身产生无法估量的伤害。
too big to fail指的是2008年金融危机爆发,有两家占据全美50%的房地产公司濒临破产,美国政府随即进行了补救。因为美国政府认为,这两家公司太大了,如果破产,将会对整个美国经济造成巨大影响。
值得提醒地是,The DAO是个特例,ETH核心团队进行补救也是为了大局考虑。我们不要认为ETH核心团队会随便介入一般的智能合约地纠纷中,也就是说,以太坊社区不会对那些无关痛痒的智能合约干预。如果只是转账转账转错了,或者是小规模的智能合约出现了问题,ETH核心团队是不会管的。
如何补救?
下面看图:
图中标红的区块就是黑客开始进行攻击的位置,那么我们从这个区块开始全部回滚后面的区块交易,用下面那条新链作为最长合法链,是不是就可以解决问题了?
很显然并不是,因为这些区块中并不仅仅只是包含了黑客攻击的交易,还包含了很多合法的交易,这些交易是不能回滚的。进行补救的原则是不能干扰到已经产生地合法的交易,那么要进行补救,就需要精确定位黑客进行攻击的那些交易。
所以,ETH核心团队制定了两步走的计划:
1、精确定位黑客进行攻击的交易
2、将这些交易涉及到的所有以太币全部退回去
以太坊核心团队发布了一个软件升级,在升级的软件中,增加了一条规则:
凡事是和The DAO这个智能合约相关的账户,都不允许进行任何交易。
版本发布之后,大多数矿工都升级了软件。这是软分叉实现的一个方案,因为升级之后新矿工产生地区块。旧节点是认可的。而旧矿工挖出来地区块,新矿工有可能是不认可的,因为旧矿工挖出的区块中仍有可能包含了和The DAO账户相关的交易。
通过软分叉的方式进行补救是成本相对比较低的,所以这个方案得到了大部分矿工地支持。遗憾地是,这个升级后的软件有个bug,这个bug是和gas相关的。我们设想一下,假设你作为一个升级了软件的矿工,那么你收到一个涉及到The DAO账户的交易时,你是需要拒绝执行这笔交易的。问题来了,拒绝执行,交易的gas费是不是要收取呢?
我们需要知道gas费存在的意义就在于说要防止出现大量的非法交易,因为这些交易会极大浪费广大矿工的资源。而这个软件升级之后,就没有对涉及到The DAO账户的交易收取gas费用,这就导致出现了大量类似的非法交易。那些升级了软件的矿工实在受不了,又退回到了原来的版本。最终,ETH核心团队采用地软分叉的方案还是失败了。
那软分叉的方案失败之后,很快,ETH核心团队又提出来使用硬分叉的方案来解决问题。换句话说,软的不行来硬的。有关软硬分叉的内容,大家可以回顾一下我写的《好好聊聊区块链分叉》这篇文章。
这一次,经过投票,大部分矿工仍然接受了这个方案。当然了,这次的硬分叉方案有些矿工是无论如何也不会接受的。
硬分叉方案,实际上就是将原来用以太币换成The DAO 代币的交易全部强行又换回以太币。这次是ETH核心团队重新拉了一个智能合约,这个智能合约只有一个功能,就是转账。并且,这次是不管你作为The DAO用户,是否接受?他们可以在不用签名的情况下,将你的The DAO 代币换成以太币。非常时期用非常办法,大家应该可以理解。
硬分叉地升级软件是这么规定的,挖到第1920000个区块时就自动执行这个转账交易。这会导致什么情况呢?
旧矿工是不会认可这样的交易的,因为这些交易没有合法的签名;而新矿工对旧矿工挖出来的区块也是不认可的,因为旧矿工挖出来的区块并没有自动执行这个强制的转账交易。
最终结局
硬分叉方案还是赶在了The DAO 规定地28天锁定期内解决了黑客攻击的问题,所有投资者的钱都保住了,The DAO 这个智能合约也就此落幕。
硬分叉之后,产生地两条链在最初的一段时间还是会互相影响的,因为大家的代码几乎是一模一样的,只是升级后的版本增加了一条规则而已。ETH核心团队发现这个问题之后,就对新链分别了一个Chain ID,解决了互相影响的问题。
然而,硬分叉使得社区分裂变得不可避免,大约有1/10的矿工仍然抱着去中心化的理想坚持不接受硬分叉的方案。所以,这部分矿工仍然按照原链继续挖矿,这条链就是我们现在看到的ETC,新链才是现在的ETH。
到此,The DAO 攻击事件就彻底结束了。