概述

由于智能合约代码存储在区块链上,所以一旦其有漏洞也极难修复。TheDAO 是运行在 ETH 区块链平台上的一个智能合约,但是其代码存在漏洞,于是黑客发起了 Re-entrancy Attack 盗走了大量的以太币,最终导致了以太坊分裂为 ETH(Ethereum) 和 ETC(Ethereum Classic)。

本系列的文章不会着重于细节讲解,对于本次攻击的详情可以参考这篇文章:Analysis of the DAO exploit

将介绍下列内容:

  • TheDAO
  • 补救措施
  • 以太坊的分裂

TheDAO

DAO 是 Decentralized Autonomous Organization(分布式自治组织)的简称,TheDAO 是一个基于 ETH 区块链平台的众筹项目。其目的是让持有 TheDAO 代币的参与者通过投票的方式共同决定被投资项目,整个社区完全自制,其功能通过智能合约实现。众筹完成时共募集 1150 万以太币,在当时的价值达到 1.49 亿美元。

Child DAO

允许 TheDAO 代币的持有者调用 TheDAO 合约中的 split 函数,创建一个子合约,持有者在原有 TheDAO 智能合约中的 TheDAO 代币被销毁,存储在原 TheDAO 智能合约中对应的以太币被转移到新的 TheDAO 智能合约中。

Child DAO 是为了保护处于弱势地位了 TheDAO 代币持有者,使他们也可以有一个可以投票和分红的 DAO。

补救措施

Child DAO 创建后有 28 天的锁定期,这段时间无法将以太币转走,就是段时间给了以太坊社区补救的机会。

以太坊团队设计了两步走方案:

  1. 锁定黑客账户。
  2. 设法将盗取的以太币退还。

以太坊首先发布了一个软分叉方案,新的软件升级中加入了一条规则:凡是和 TheDAO 相关的账户一律不允许交易。升级发布后大多数矿工都升级的软件。但是新的软件有一个 bug。

当新的软件执行某个交易与 TheDAO 相关时,这个交易失败,但是没有收取汽油费。这就导致了整个系统中充斥着大量的与 TheDAO 相关的交易,消耗了大量的资源,因此大多数矿工又将软件版本退回了更新前。

软分叉的措施失败了,此时距离 28 天的锁定期结束已经很近了。于是以太坊团队发布了一个硬分叉方案,所有 TheDAO 账户中的以太币都被强制转到另一个账户,事后再想办法将其退还。

这次没有出现意外,最终被盗取的以太币都退还了。

以太坊的分裂

在攻击发生后,以太坊社区有两个观点,双方进行了激烈讨论,最终没能达成一致,导致了分裂。

应该采取措施

这一派认为应该采取措施方式黑客将以太币盗走,原因是 TheDAO 是太大而不能倒的合约,TheDAO 筹集的以太币大概占有当时总流通量的 10% 左右。以太坊开发团队也持有这种观点。

但是不要认为合约出了问题以太坊团队就会介入,主要还是因为这个合约的影响太大了。

不应采取措施

这一派认为黑客的行为并没有违反任何规则,因为智能合约的代码就是规则,按照规则行事何谈违反?

更重要的观点是,如果出了问题就要回滚,那么还谈什么去中心化的不可篡改的账本?开发团队一句话就能强行更改账本,这和中心化有何区别?

分裂

两派的矿工都没能说服对方,最终导致以太坊分裂成了两条链,一条就是采取了措施的链,称为 ETH(Ethereum),另一条是没有采取任何补救措施的链,称为 ETC(Ethereum Classic)。直到现在这两条链依旧存在,只是 ETH 上的算力更强。

在 ETC 上挖矿人一部分是出于投机目的,因为这条链算力更少,更容易挖出区块。另一部分人是纯粹出于信仰,这些坚持十分纯正的去中心化理念,认为 ETC 才是正宗的以太坊,而 ETH 已经偏离的去中心化的初衷。