10.ETH-The DAO

The DAO 是历史上第一个尝试以“去中心化自治组织(Decentralized Autonomous Organization)”形式运作的风险投资基金。它完全由代码(以太坊智能合约)来管理。全世界的任何人都可以通过购买 DAO 代币来向这个基金注资(用ETH兑换)。持有 DAO 代币的投资者可以对投资提案进行投票。例如,一个初创项目可以向 The DAO 申请资金,所有代币持有者共同投票决定是否批准这笔投资。如果提案通过,智能合约会自动将资金划拨给该项目。

在2016年,这个概念极具革命性,吸引了大量的关注和资金。

起因

在2016年5月,The DAO 进行了为期28天的众筹。结果是惊人的:

它筹集了超过 1270 万个以太币(ETH),在当时价值约 1.5 亿美元。这笔资金占据了当时以太坊供应总量的约 14%。

The DAO 成为了人类历史上规模最大的一次众筹项目,也使其成为以太坊生态中一个“大到不能倒”的关键角色。然而,巨大的成功背后潜藏着致命的危机。The DAO 的智能合约代码中存在一个严重的安全漏洞。

漏洞

1. splitDAO

splitDAO 是 The DAO 合约中的一个函数,它是一个“退出机制”**。

  • 设计目的:The DAO 是一个集体投资基金,但如果你作为投资者,不同意某个投资决策,或者你就是想拿回你的本金退出,怎么办?splitDAO 函数就是为了这个目的而设计的。它允许代币持有者“分家”。
  • 运作机制
    1. 一个或一群持有 DAO 代币的投资者可以发起一个 "split"(分割)提案。
    2. 如果提案通过,他们持有的 DAO 代币会被销毁。
    3. 作为交换,他们投入的等值 ETH 会从 The DAO 的主资金池中划拨出来,注入到一个新的、更小的 DAO 中。这个新产生的 DAO 就是所谓的 Child DAO

2. Child DAO

  • 定义:通过 splitDAO 功能创建出来的、从主 DAO 分离出去的、规模更小的新 DAO,就是 Child DAO
  • 特点
    • 继承代码:Child DAO 的合约代码与主 DAO 完全相同,也包含那个有漏洞的提款函数。
    • 独立控制:这个 Child DAO 的控制权属于当初发起 "split" 的那群投资者。他们可以在这个小圈子里继续投票、管理这笔分离出来的资金。
    • 锁定期:从 Child DAO 中最终取出 ETH 到个人钱包,需要经过一个 27 天的锁定期。这个设计是为了防止人们恶意利用提案快速套现。然而,正是这个锁定期,给了以太坊社区宝贵的反应时间来应对黑客攻击。

黑客攻击

黑客的攻击流程完美地利用了这两个概念,并结合了“重入攻击”漏洞,导致问题的核心代码是智能合约中一个非常简单的逻辑错误:先转账,后记账

这个有漏洞的逻辑模式存在于 splitDAO 功能的提款部分。

  1. 第一步:创建分家提案 黑客(连同他自己控制的一些地址)发起了一个 splitDAO 提案,要求将他持有的 DAO 代币和他应得的 ETH 分离出去。
  2. 第二步:形成 Child DAO 这个提案通过后,系统为黑客创建了一个 Child DAO,并将相应的 ETH 从主 DAO 的资金池划拨到了这个 Child DAO 中。此时,资金的所有权已经属于这个由黑客控制的 Child DAO。
  3. 第三步:在 Child DAO 中发起重入攻击 现在,黑客开始从他自己的 Child DAO 中提款。因为 Child DAO 继承了主 DAO 的所有代码,所以它也包含了那个**“先付款,后更新余额”**的致命漏洞。
  4. 第四步:递归调用提款 黑客调用 Child DAO 的提款函数。当 Child DAO 将第一笔 ETH 发送到黑客的恶意合约时,恶意合约立即被触发,“重入”并再次调用同一个 Child DAO 的提款函数。由于 Child DAO 还没来得及更新黑客的余额,它就一次又一次地把资金发送给黑客,直到 Child DAO 中该笔提案下的资金被全部抽干。
  • 攻击结果是黑客成功盗取了约 360 万个 ETH,价值约 5000 万美元。

值得庆幸的是,The DAO 的合约设计中有一个“锁定期”,被盗走的资金需要等待27天才能被黑客真正转移。这为以太坊社区留下了宝贵的反应时间。接下来的时间线如下:

社区反应

第一阶段:危机爆发与初步反应 (2016年6月17日 - 6月下旬)

  • 2016年6月17日:攻击发生
    • 事件:一名或多名黑客利用“重入攻击”漏洞开始从 The DAO 合约中持续抽走资金。
    • 社区反应:社区陷入震惊和混乱。以太坊创始人 Vitalik Buterin 和核心开发者迅速发文,分析漏洞并呼吁所有交易所暂停 ETH 和 DAO 代币的充提,以防止黑客套现。
    • 关键信息:社区很快意识到,由于合约的锁定机制,黑客盗取的资金有 27天的锁定期。这个“黄金27天”成为了社区制定和执行救援计划的宝贵窗口期。
    • 大辩论开启:关于是否应该干预的激烈辩论在全社区展开,“代码即法律”派和“干预救助”派的观点激烈碰撞。

第二阶段:进攻性软分叉方案的提出与失败 (2016年6月下旬 - 7月初)

  • 2016年6月20日左右:白帽黑客组织“罗宾汉小组” (Robin Hood Group) 成立
    • 策略:他们决定“以暴制暴”,利用和黑客完全相同的漏洞,去“反向攻击”The DAO,目的是赶在黑客之前将剩余的资金(以及被黑客转移到子DAO的资金)救援到一个安全的新合约里。这是一场黑客之间的竞赛。
  • 2016年6月24日:社区提出“软分叉”方案以支持白帽黑客
    • 策略:为了帮助“罗宾汉小组”赢得比赛,以太坊核心开发者提出了一个特殊的软分叉方案。这个软分叉本质上是一个“黑名单”功能,旨在暂时审查网络,阻止除“罗宾汉小组”以外的任何人与The DAO合约进行交互
  • 2016年6月28日左右:软分叉方案被发现存在致命漏洞而被紧急放弃
    • 事件:社区在审查软分叉代码时,发现了一个全新的、灾难性的漏洞。该漏洞允许任何人通过发送精心构造的、高Gas价格的“垃圾交易”来瘫痪整个以太坊网络,构成一次**“拒绝服务攻击”(DoS Attack)**。
    • 结果:开发者们意识到,这个软分叉方案非但无法救火,反而可能引火烧身,让整个以太坊陷入停滞。因此,该软分叉提案被紧急撤回

第三阶段:硬分叉成为唯一选择并达成共识 (2016年7月初 - 7月中旬)

  • 2016年7月初:形势急转直下
    • 处境:软分叉这条路被彻底堵死。距离27天锁定期结束越来越近,社区面临着一个残酷的二选一:要么接受资金被盗的现实,要么采取更激进、更具争议的硬分叉。
  • 2016年7月15日:硬分叉方案正式提出并进行社区投票
    • 策略:以太坊基金会正式提出了硬分叉方案。方案的核心不是简单的回滚,而是通过一次性的协议修改,将被盗资金强制转移到一个新的“退款合约”中。
    • 社区投票 (Carbon Vote):一个非约束性的社区投票显示,约89%的参与者支持硬分叉。这个结果为核心开发者和矿工提供了强有力的民意支持。

第四阶段:硬分叉执行与区块链分裂 (2016年7月20日)

  • 2016年7月20日:硬分叉在区块高度 1,920,000 处被激活
    • 事件:绝大多数矿工、交易所和用户升级了他们的客户端软件,开始遵循新的协议规则。
    • 新链诞生 (ETH):在这条新的链上,The DAO 的攻击历史被“抹去”,资金被成功转移到退款合约,等待原始投资者赎回。这就是我们今天所知的以太坊(ETH)
    • 旧链延续 (ETC):少数坚持“代码即法律”、拒绝接受硬分叉的社区成员,继续在原始的、未经修改的旧链上挖矿。几天后,当有交易所宣布上线交易这条旧链的代币时,它获得了经济价值和正式名称——以太坊经典(Ethereum Classic, ETC)。以太坊的“大分裂”正式成为事实。

后果

重放攻击

这是分裂后最直接、最紧迫的技术灾难。

  • 在分叉的瞬间,ETH 链和 ETC 链拥有完全相同的历史记录、账户地址和私钥。这意味着,一笔在一个链上合法的交易,在另一条链上同样是合法的。攻击者可以把一笔交易从一条链上“复制”到另一条链上执行。
  • 为了解决这个问题,以太坊(ETH)社区迅速通过了 EIP-155 提案,引入了“链ID”(Chain ID)的概念。从此以后,ETH 交易签名时必须包含其独有的 Chain ID (1),而 ETC 后来也采纳了自己的 Chain ID (61)。这样一来,两条链的交易签名就变得互不兼容,彻底根除了重放攻击。

51%攻击

这个问题主要威胁到了算力较弱的以太坊经典(ETC)

  • 硬分叉后,原来以太坊网络的总算力(矿工的计算能力)被分割了。绝大多数矿工选择了支持新的 ETH 链,因为它的经济价值和社区支持度更高。这导致 ETC 链的总算力非常低
  • 带来的风险: 一条公链的算力越低,发动“51%攻击”的成本就越低。攻击者可以通过租用或集中算力,使其超过全网总算力的50%,从而获得篡改区块链历史的临时权力。
  • 在分叉后的几年里,尤其是在2020年,以太坊经典(ETC)遭受了多次成功的51%攻击,给多个交易所造成了数百万美元的损失,也严重打击了社区和投资者对 ETC 安全性的信心。而 ETH 由于其庞大的算力,发动51%攻击的成本极高,因此始终保持了安全。