图文攻略

The DAO 事件:把以太坊一分为二的盗案

2016 年 6 月,匿名攻击者利用重入漏洞从 The DAO 卷走约 360 万 ETH;以太坊选择改写历史追回资金,代价是催生出竞争对手链——以太经典(Ethereum Classic)。

9 分钟 • 16 个图解步骤 • 深度史料考证与链上技术复盘

编委会史料考证与链上复盘

本篇归档基于公开密码学文献、历史白皮书与链上交易数据进行独立交叉核实,遵循学术严谨性标准。

同行文献已核查

The DAO 事件是什么?

The DAO 是搭建在以太坊上的众筹型风险基金,共募集 1270 万 ETH(约 1.5 亿美元),是当时人类历史上规模最大的众筹项目。2016 年 6 月 17 日,攻击者利用 splitDAO 函数"先付款、后记账"的重入漏洞,以每小时约 800 万美元的速度反复提款,卷走约 360 万 ETH(约 5500 万美元)。白帽黑客用同样手段抢回 720 万枚 ETH 后,社区以 87% 的支持率在区块 1,920,000 执行硬分叉,把资金转入退款合约;而拒绝回滚的原链延续至今,就是以太经典(Ethereum Classic)。

核心要点

  • The DAO 在 2016 年春天募集了 1270 万 ETH(约 1.5 亿美元),是当时史上最大的众筹项目:一个由代币投票治理、法定人数 20% 的"去中心化对冲基金"。
  • 2016 年 6 月 13 日,一位康奈尔大学的计算机教授在代码第 666 行发现了重入漏洞;Slock.it 在 DAO 1.1 框架里调换了两行代码作为修复——但已部署的合约无法修改,线上的 The DAO 依然裸奔。
  • 6 月 17 日(周五),攻击者递归调用 splitDAO,以每小时约 800 万美元的速度卷走约 5500 万美元,ETH 价格应声从 20 美元闪崩到 15 美元。
  • 自称"罗宾汉"的白帽黑客用同样的漏洞抢先转走了 720 万枚 ETH(占 The DAO 的 55%),所有资金被时间锁锁住:27 天等待期加 14 天表决期,共 41 天。
  • 社区以 1 ETH = 1 票的 Carbonvote 投出 87% 的支持率,在区块 1,920,000 执行硬分叉,把资金转入退款合约——而攻击者公开信上的签名后来被证实是无效的。
  • 未经篡改的原链以"以太经典"(Ethereum Classic)之名存续至今;若分叉从未发生,攻击者手里的 360 万枚 ETH 如今价值超过 70 亿美元。

The DAO 是什么?

在被黑之前,The DAO 是以太坊上最耀眼的实验:一笔众筹、一家风投、一个民主政体,被压缩进同一个智能合约。

  1. 1

    2016 年 6 月 13 日:第 666 行的漏洞

    2016 年 6 月的一个周一,康奈尔大学的一位计算机科学教授正在逐行阅读 The DAO 的代码。几个月来他一直呼吁项目暂停上线;就在这一天,他发现了一个严重的漏洞——第 666 行上的那个 bug,它能让黑客像刷 ATM 一样无限次提款。四天后,这个警告被证明是灾难性的。

    编辑器里的 The DAO 合约源码旁摆着 2016 年 6 月 13 日的日历,正是在这天第 666 行的漏洞浮出水面
    一切始于一位研究者、一段函数。
  2. 2

    DAO,逐字母拆开看

    DAO 是 Decentralized Autonomous Organization(去中心化自治组织)的缩写:组织的规则写在代码里,而不是经理的会议纪要里。The DAO 把众筹逻辑推到极致——不再是为不同项目设不同的基金,而是"一个基金统治一切",完全跑在以太坊上。

    DAO 逐字母展开为 Decentralized Autonomous Organization(去中心化自治组织),The DAO 众筹背后的概念
    没有老板,没有办公室,只有代码。
  3. 3

    每个投资人同时也是投票人

    上线时,投资人每存入 1 ETH 就获得 100 枚 DAO 代币。代币既是份额也是治理权:持有人可以提交提案——比如"投 100 万美元换公司 XYZ 10% 的股份"——由全体投票表决。提案通过初审、并达到全体代币 20% 的法定人数后,The DAO 会自动把 ETH 打给提案合约,产生的利润再回流国库,抬升每一枚 DAO 代币的内在价值。本质上,它就是一只去中心化对冲基金。

    一位持有 300 枚 DAO 代币(价值 3 ETH)的投资人,正在对"向公司 XYZ 投资 100 万美元换 10% 股份"的提案投票
    代币不只是份额,更是选票。
  4. 4

    史上最大的众筹

    发售页上的实时计数器记录了这场疯狂:DAO 代币不断铸造,ETH 源源涌入,截止日定在 5 月 28 日。发售收官时,The DAO 共募集 1270 万 ETH——按当时价格约 1.5 亿美元,是人类历史上最大的众筹项目。合约于 4 月 30 日上线,经过以太坊开发者们一次又一次审计;而一旦部署,别说普通人,就连背后的公司 Slock.it 也改不了协议的一行代码。

    The DAO 代币发售页面上的实时计数器,显示已创造的 DAO 代币、已募集的 ETH 以及 5 月 28 日的截止时间
    刷新所有众筹纪录的计数器。

拆解重入漏洞

这个 bug 并不高深——它只是一次"先付款、后记账"的顺序错误,让提款可以在余额更新前无限重复。

  1. 5

    逃生舱:splitDAO()

    为了保护少数派不被多数派碾压,The DAO 内置了 split(分裂)函数:强烈反对多数意见的人可以调用 splitDAO,把自己的 ETH 移进一个自建的子 DAO。标准操作是一个人单独发起分裂、创建子 DAO、再提交一份把 ETH 打回自己钱包的提案——完全合规,无人起疑。就是这个不起眼的逃生舱,很快会成为攻击的隧道。

    一枚红色 ETH 从绿色投票条中分裂出来,上方是 splitDAO() 函数调用——攻击者滥用的退出机制
    没人想过逃生舱还能当抽水泵。
  2. 6

    留在 GitHub 上的两行修复

    6 月 13 日漏洞披露后,Slock.it 承认漏洞存在,但宣称攻击"不可行",并把修复提交到了 GitHub:调换两行代码,先更新余额、再付款。致命之处在于——4 月 30 日部署的智能合约永远无法修改,这份修复只存在于尚不存在的 DAO 1.1 框架里。线上的 The DAO 继续先付钱、后记账。

    修复重入漏洞的两行 Solidity 代码:先更新 paidOut[_account] 的余额,再调用 rewardAccount.payOut 支付
    两行代码,迟到了四天。
  3. 7

    一台"先吐钱、后扣账"的 ATM

    视频里的类比最直观:想象一台先递现金、后改余额的取款机。你取 10 美元——趁它还没记账,再取 10 美元,再取,直到机器搬空。这就是重入攻击:合约把 ETH 打给外部合约时,对方在收款中途再次发起调用,因为此时余额检查还没写回。一遍又一遍,直到金库见底。

    自动取款机吐出钞票的扁平插画,用来类比"先付款、后更新余额"的智能合约
    趁余额没更新,再问一次——永远可以。
  4. 8

    59 号提案与七天窗口

    那个周五——漏洞披露四天后——陷阱已经就位。一份名为 "lonely, so lonely" 的分裂提案安静地躺在 59 号。分裂提案有标准的七天公示期,而没有任何人加入,因为单独发起分裂本就是常规操作。窗口一关,攻击者调用 splitDAO,抽水开始;盯着 Etherscan 的人看到的,是合约在数百次地递归调用自己。

    红色 DAO 标志带着箭头把 ETH 付给子 DAO,59 号提案正是沿这条路抽走 The DAO 的资金
    一份例行提案,签发者无懈可击。
  5. 9

    每小时 800 万美元,循环播放

    ETH 以每小时约 800 万美元的速度,从主 DAO 流入攻击者的子 DAO——人称"黑暗 DAO"——每一笔提款都在上一笔记录前再次触发。持币人眼睁睁看着 Etherscan 上的递归记录刷屏。市场瞬间反应:ETH 从 20 美元闪崩到 15 美元。头六个小时内,约 30% 的 The DAO 资金被卷走,随后攻击却莫名其妙地失效了。

    Etherscan 内部交易列表上叠加 splitDAO 与循环箭头,标出递归调用抽干 The DAO 的过程
    一个函数,被调用了几百次。

抢在黑客前面搬空 The DAO

大部分资金还在金库里,白帽黑客用同样的漏洞抢注它们——然后,倒计时开始了。

  1. 10

    罗宾汉与白帽反击战

    在里约热内卢,开发者 Alex van de Sande 被 Skype 消息吵醒——"还记得我说过那堆没人偷得走的钱吗?它被偷了。"他和一群自称"罗宾汉"的开发者决定把剩下的资金抽走并归还。第一次行动因巴西运营商断网错过窗口("我们是史上最惨的黑客");第二次,鲸鱼们捐出 600 万枚 DAO 代币,团队打入了 78 号分裂提案,与攻击者赛跑,抢下了 720 万枚 ETH——The DAO 的 55%。

    标题为 What now 的白帽公告:720 万枚 ETH 已锁进子 DAO、托管私钥在手,并计划攻击其余子 DAO 追回资金
    好人只有 30 分钟,和一条断网的宽带。
  2. 11

    距离套现还有 41 天

    所有被抢回和被盗走的 ETH 现在都躺在子 DAO 里——白帽 DAO 与黑暗 DAO——并被多重时间锁锁住:27 天的等待期,加上转出资金所需的 14 天常规提案表决期。加起来,攻击者要等 41 天才能套现这笔相当于以太坊总供应量约 5% 的巨款。这 41 天的倒计时,通向的不是又一个漏洞利用,而是一场远为激进的操作。

    深色背景上的红色 41 days 倒计时,即 The DAO 攻击者套现前必须等待的时间锁
    以太坊历史上最漫长的 41 天。

把以太坊一分为二的分叉

改写历史追回赃款,还是让代码说了算?社区做出了选择——而一条对手链就此诞生。

  1. 12

    "此致,攻击者"

    攻击发生一天后,一封公开信出现在 The DAO 的 Slack 里,附有私钥签名。写信人声称自己是"依法"通过一个白纸黑字写进代码的功能赚取了约 360 万 ETH 的"奖励",并警告任何软分叉或硬分叉"都将永久且不可逆地摧毁"以太坊的全部信心。后来的检查发现,这封信的签名是无效的——真正的攻击者是谁,甚至写信人是不是攻击者,至今成谜。

    署名 The Attacker 的公开信,声称依法领取约 360 万 ETH 的奖励,并警告任何分叉都会摧毁以太坊的信心
    攻击者声称这是奖励,不是盗窃。
  2. 13

    87% 投票改写历史

    争论分成两派。纯粹派主张代码即法律:攻击者更像一个认真读过合同条款的聪明律师,而且以太坊本身从未被黑——被利用的只是一份写得很烂的合约。另一方则反驳:The DAO 握有全部 ETH 的约 15%,大而不能倒,像极了 2008 年的救助。一场 1 ETH = 1 票的 Carbonvote 投出了 87% 的分叉支持率——尽管页面自己也承认,实际参与投票的供应量只是一小部分。

    TheDAO Hard Fork 的 Carbonvote 投票页,在区块 1,894,000 处绿色 YES 占压倒性多数、红色 NO 为少数
    87% 赞成——来自一个很小的、有争议的投票群体。
  3. 14

    区块 1,920,000:硬分叉落地

    在区块 1,920,000,全世界的节点升级了软件,做了一件区块链本不该做的事:改写历史。与黑客攻击相关的每一笔交易被撤销,The DAO 及各子 DAO 的全部资金——包括罗宾汉抢回的那批——被转入一个退款合约,真正的投资人可以按 100 DAO = 1 ETH 取回。没有黑客强迫这次改写,是社区投票让它发生的。

    Forked 与 Original 两条链的对比示意图,展示以太坊在 The DAO 硬分叉(区块 1,920,000)处的分裂
    两条链,同一段历史。
  4. 15

    拒绝遗忘的那条链

    但包含黑客交易的原链仍在继续生长。反对分叉的矿工持续挖矿、交易照常发生,第二天交易所 Poloniex 就把这条旧链的代币挂上了牌,价格约 2 美元。它后来被命名为以太经典(Ethereum Classic)——未经篡改的原始以太坊。分叉前持有 ETH 的人,如今同时拥有 ETH 和 ETC;那些坚信不可篡改就是不可篡改的理想主义者,终于有了一条和他们立场一致的链。

    写着 Build Unstoppable Applications 的 Ethereum Classic 标题卡,代表未经篡改的以太坊原链
    原来的链,有了新的名字。
  5. 16

    攻击者的安慰奖

    分叉成功了——黑客始终没能动用被盗的 ETH。但子 DAO 同时存在于两条链上,于是攻击者带走了约 360 万枚以太经典,在视频制作时价值约 1.5 亿美元。而假如分叉从未发生,这 360 万枚 ETH 到今天价值将超过 70 亿美元。以太坊带着教训继续前行:写智能合约就像造自动驾驶汽车;而自 The DAO 之后,行业再没有过第二次救助。

    绿色网络背景上的 3.6M ETC 与 150,000,000 美元,The DAO 硬分叉后攻击者实际带走的资产
    黑客最终还是拿到了钱——只是在另一条链上。

常见问题

The DAO 是什么?

The DAO 是一个以智能合约形式搭建在以太坊上的风险投资基金,由 Slock.it 团队(Christoph Jentzsch 任首席开发者)开发,2016 年 4 月 30 日上线。投资人每存 1 ETH 获得 100 枚 DAO 代币,以 20% 法定人数对投资提案投票。它共募集 1270 万 ETH(约 1.5 亿美元),是当时史上最大的众筹项目,如今人们又把它称作"创世 DAO"(the Genesis DAO)。

The DAO 被盗了多少 ETH?

攻击者通过递归调用 splitDAO 函数,以每小时约 800 万美元的峰值速度,卷走了约 360 万 ETH——按 2016 年 6 月价格约 5500 万美元。白帽黑客用同样的技术抢先锁定了另外 720 万枚 ETH,约占 The DAO 总量的 55%。

什么是重入攻击(reentrancy attack)?

重入攻击指合约在更新内部余额之前就把资金转给外部合约,让接收方在交易中途再次回调提款——就像一台先吐现金、后记账的 ATM。正确做法是先更新余额、再付款。The DAO 的维护者写出了这个修复,但它随 DAO 1.1 框架发布,而已部署的旧合约永远无法修改。直到今天,重入漏洞仍在周期性击穿 DeFi 协议。

以太坊为什么因 The DAO 事件硬分叉?

因为全部被盗和被救的资金都被时间锁锁定了 41 天,社区有了一个行动窗口——而 The DAO 握有全部 ETH 的约 15%,规模大到无法坐视。在 87% 的支持票后,以太坊在区块 1,920,000 执行硬分叉,撤销黑客交易并把资金转入退款合约。Vitalik Buterin 对推动分叉毫不后悔,并把极端的"代码即法律"立场斥为愚蠢。

以太经典(Ethereum Classic)是什么?

以太经典(ETC)是未经篡改的以太坊原链——上面仍然保留着 The DAO 被黑的记录。反对分叉的矿工让这条链活了下来,交易所第二天就以约 2 美元的价格上线交易。分叉前持有 ETH 的人获得了等量的 ETH 和 ETC。它保留了一批坚持不可篡改理想的社区成员,但始终未能追上以太坊的势头,生态协议数量只是零头。

The DAO 攻击违法吗?

没有定论——也从未走上法庭。攻击者的公开信声称,提款利用的是合约中白纸黑字写明的功能,属于合法主张而非盗窃;不过这封信的签名后来被证实无效。支持分叉的一方则认为该行为在道德上错误、大概率违法。最终没有任何人被起诉,攻击者的真实身份至今仍是加密世界最大的悬案之一。

继续这个故事

参考资料

延伸多媒体文献参考

本专题时序与历史图示交叉参考了 Junion 出品的文献视频 “The DAO Hack: Story of Ethereum Classic”,谨向原研究记录者致谢。

免责声明与学术边界

本图解指南仅供区块链技术史学术研讨与公众科普使用,不构成任何财务、证券、投资或法律建议。文中所载历史价格、黑客事件与安全漏洞分析均属于公开历史记录。加密货币市场具有极高风险,请审慎研判。