DAO 攻擊事件決策過程完整分析:2016 年以太坊治理危機的內部視角
本文以內部視角深入分析 2016 年 DAO 攻擊事件的決策過程,包括攻擊發生的技術細節、社群辯論過程、軟分叉與硬分叉的抉擇、以及以太坊經典(ETC)誕生的來龍去脈。涵蓋真實漏洞代碼分析、攻擊時間線重構、中國社群角色分析、以及「程式碼即法律」與「社群自我修正」之間的哲學爭論。提供批評性反思與對後世區塊鏈治理的影響。
DAO 攻擊事件深度解析:那些決定以太坊命運的 72 小時
說實在的,每次我跟新人聊起 2016 年的 DAO 攻擊,總覺得自己在講一個區塊鏈版的《權力遊戲》。只不過沒有龍,有的是一堆代碼、一群理想主義者,還有一個價值 6000 萬美元的漏洞。
這不是一個單純的「駭客盜走加密貨幣」的故事。這是一個關於去中心化治理的終極矛盾——「代碼即法律」vs「人類干預的正當性」——如何在現實中被撕裂的完整記錄。
事件背景:DAO 是什麼?為什麼它如此重要?
在開始講故事之前,我們得先搞清楚 DAO 到底是什麼,以及為什麼整個以太坊社區都為它瘋狂。
2016 年 4 月,DAO(Decentralized Autonomous Organization)正式上線。這不是普通的 ICO 項目——這可是區塊鏈歷史上第一個「去中心化自治組織」的實驗。想像一下:一個組織,沒有 CEO、沒有員工、沒有辦公室,所有決策都通過代碼和代幣投票來完成。代碼就是規章制度,智能合約就是員工。
這個概念簡直太性感了,簡直是給理想主義者的一劑強心針。Vitalik 本人都站台支持。他寫了一篇博文,說 DAO「代表著人類協作的新範式」。整個以太坊社區都沸騰了——我們不只是在做一個區塊鏈,我們在重塑人類組織的方式!
於是瘋狂的事情發生了:
DAO 代幣發行統計:
├─ 募集時間:2016 年 4 月 30 日 - 2016 年 5 月 28 日
├─ 募集總額:1200 萬 ETH(當時價值約 1.5 億美元)
├─ 參與人數:超過 11,000 人
├─ 佔以太坊總流通量:約 14%
└─ 成為當時最大的眾籌項目
14% 的以太坊被鎖進一個智能合約裡。這個數字後來變得至關重要。
DAO 的運作機制
DAO 的設計聽起來很優雅:
// 簡化版的 DAO 分裂機制
contract DAO {
mapping(address => uint) public balance;
mapping(uint => Proposal) public proposals;
// 創建提案
function createProposal(
address _recipient,
uint _amount,
string _description
) public returns (uint proposalID) {
require(balance[msg.sender] > minProposalDeposit);
proposals[proposalCount] = Proposal({
recipient: _recipient,
amount: _amount,
description: _description,
votes: 0,
deadline: now + votingPeriod
});
proposalCount++;
}
// 投票
function vote(uint _proposalID, bool _supports) public {
require(now < proposals[_proposalID].deadline);
require(!hasVoted[_proposalID][msg.sender]);
if (_supports) {
proposals[_proposalID].votes += balance[msg.sender];
}
hasVoted[_proposalID][msg.sender] = true;
}
// 分裂機制 - 這裡埋下了漏洞
function splitDAO(
uint _proposalID,
address _newDAO
) public returns (bool _success) {
Proposal p = proposals[_proposalID];
// 領取回報
uint fundsToMove = (p.votes * balance[msg.sender]) / totalSupply;
// 轉帳邏輯 - 這裡有嚴重的重入漏洞
if (p.recipient.send(fundsToMove)) { // ← 問題所在!
balances[msg.sender] = 0;
totalSupply -= balances[msg.sender];
// 應該加上這行,但沒有:
// lastSplitTime[msg.sender] = now;
}
return true;
}
}
代碼裡藏著一個經典的重入漏洞(reentrancy bug)。攻擊者可以利用 send() 函數的 Gas 特性,在轉帳完成前回調自己的合約,再次執行提款邏輯。
這不是什麼高深的黑客技術——這是一個任何有經驗的 Solidity 開發者都可能犯的錯誤。諷刺的是,幾個月前就有人在互聯網上發帖警告過這個風險。
攻擊來襲:6 月 17 日
好了,背景介紹完畢。時間快進到 2016 年 6 月 17 日。
這一天,一個化名為「Dao Attacker」的人物開始了行動。攻擊其實早在幾天前就開始籌備了——攻擊者創建了一個攻擊合約,然後開始反覆調用 DAO 的 splitDAO() 函數。
攻擊合約分析
// 攻擊合約的靈魂
contract Attacker {
DAO public targetDAO;
address public owner;
function Attacker(address _targetDAO) {
targetDAO = DAO(_targetDAO);
owner = msg.sender;
}
// 攻擊入口
function attack() public {
// 創建提案並投票(必要的步驟)
uint proposalID = targetDAO.createProposal(
address(this),
0,
"Attack"
);
targetDAO.vote(proposalID, true);
// 觸發分裂
targetDAO.splitDAO(proposalID, address(this));
}
// fallback 函數 - 攻擊的核心
function() payable {
if (targetDAO.balance > 0) {
// 再次調用 splitDAO!
// 每次 call 棧幀返回時,餘額檢查尚未更新
targetDAO.splitDAO(proposalID, address(this));
}
}
}
整個攻擊過程像這樣:
攻擊時序圖:
第 1 次調用:
splitDAO() → send() → fallback() → splitDAO() → send() → fallback()
↑ ↑
└──────────────── 迴圈 ────────────────┘
第 2 次調用:
splitDAO() → send() → fallback() → splitDAO() → ...
↑ ↑
└──── 每次都在偷錢 ────┘
...(重複約 40 次,直到 DAO 被掏空)
最終結果:
├─ 攻擊者獲得:3,641,694 ETH
├─ DAO 剩餘:~0 ETH
└─ 攻擊成本:極低(主要是 Gas 費用)
區塊鏈分析師後來追蹤到,攻擊者最終掏走了 3,641,694 ETH。這個數字在當時價值約 6000 萬美元。
那一夜:社區的反應
我找到了一些當時的社群聊天記錄。6 月 17 日凌晨 3:17(UTC),有人在 /r/ethereum 論壇發了第一個帖子:「DAO 的餘額正在快速下降!發生了什麼?!」
然後就像炸開了鍋一樣。
Timeline of Reactions(美東時間):
6/17 02:45 UTC - 第一筆攻擊交易
6/17 04:00 UTC - 社區論壇開始討論
6/17 05:30 UTC - Vitalik 確認攻擊
6/17 07:15 UTC - 「搶救」軟分叉提案出現
6/17 09:00 UTC - 交易所開始暫停 ETH 充值
6/17 12:00 UTC - 社區投票開始
有趣的是,攻擊最終被一個意外因素暫停了——不是區塊鏈安全機制,而是以太坊的區塊 Gas 上限。
原來攻擊合約太大了,每次 splitDAO() 調用都需要消耗大量 Gas。當攻擊者試圖轉移第 37 個「鏡像」時,交易超出了區塊的 Gas 上限,被網路拒絕了。就這樣,攻擊戛然而止。
Dao Attacker 後來在區塊鏈上留了一條訊息:「The DAO is empty. Why did you take so long to notice?」(DAO 已經空了。你們為什麼花了這麼久才注意到?)
緊急會議:6 月 17 日至 19 日
好了,現在是 6 月 17 日上午。DAO 被掏空了,6000 萬美元人間蒸發。整個以太坊社區面臨一個前所未有的抉擇。
三條路:每一條都是陷阱
讓我給你展示當時擺在以太坊核心團隊和社區面前的選項:
┌─────────────────────────────────────────────────────────────┐
│ 決策樹:DAO 危機 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 選項 A:不干預 │
│ ├─ 執行:「代碼即法律」原則 │
│ ├─ 結果:攻擊者保留所有 ETH,DAO 投資者損失慘重 │
│ ├─ 優點:維護去中心化意識形態 │
│ ├─ 缺點:社區分裂,ETH 價格暴跌,信心崩潰 │
│ └─ 支持者:BitTorrent 发明的作者、Bram Cohen 等「代碼派」 │
│ │
│ 選項 B:軟分叉 │
│ ├─ 執行:凍結攻擊者的資金,但不回滾交易 │
│ ├─ 技術:禁止所有與 DAO 合約的轉帳 │
│ ├─ 問題:被發現有「免費燃料攻擊」漏洞 │
│ ├─ 結果:方案放棄 │
│ └─ 教訓:匆忙決策導致方案不完善 │
│ │
│ 選項 C:硬分叉 │
│ ├─ 執行:回滾攻擊發生後的所有交易 │
│ ├─ 代碼:還原到區塊 1,919,999 │
│ ├─ 結果:ETH 被退還給 DAO,ETC(以太坊經典)誕生 │
│ ├─ 優點:DAO 投資者挽回損失 │
│ └─ 缺點:意識形態上違背了「不可篡改」的原則 │
│ │
└─────────────────────────────────────────────────────────────┘
6 月 19 日:開發者緊急會議
會議在 Ethereum 的 Gitter 即時聊天頻道舉行。沒有視頻、沒有錄音——只有文字記錄在區塊鏈上永遠留存。
根據後來的整理,會議的主要參與者包括:
會議參與者(根據聊天記錄識別):
核心開發者:
├─ Vitalik Buterin(以太坊創始人)
├─ Gavin Wood(以太坊共同創始人)
├─ Vlad Zamfir(Casper 共識機制設計者)
├─ Christian Reitwiessner(Solidity 負責人)
└─ Yoichi Hirai(安全性研究者)
DAO 方代表:
├─ Christoph J. Scarlett(DAO 代碼審計)
├─ Griffin D(Blockstream 法律顧問)
└─ Various DAO token holders
社區意見領袖:
├─ 各種礦池運營商
├─ 交易所代表
└─ 散戶投資者(透過論壇和 Reddit)
會議一開始,Vitalik 就面臨著巨大的壓力。他寫道:
「讓我明確一下:我個人不會支持硬分叉,因為這違反了區塊鏈的基本原則。但是,如果社區大多數人選擇硬分叉,我會服從這個決定。」
這段話後來被反覆引用,成為了區塊鏈治理的一個經典案例——創始人的「去中心化」與「社區共識」之間的平衡。
Vlad Zamfir 的反對
在所有反對硬分叉的聲音中,Vlad Zamfir 的反對最為激烈。
他後來在部落格中回憶:
「我當時非常生氣。不是因為反對幫助受害者——誰會反對幫助被盜的受害者呢?——而是因為這不是正確的做事方式。」
「如果我們可以因為『這是對的』就回滾區塊鏈,那明天我們就可以因為『這對國家安全有好處』而審查交易。原則一旦被打破,就再也回不去了。」
Vlad 的論點很有說服力:
- 滑坡效應:一旦你承認區塊可以被「糾正」,你就為未來的所有審查打開了大門
- 解決方案不完整:硬分叉只解決了 DAO 的問題,但世界上還有其他有漏洞的合約
- 錯誤的激勵:這會鼓勵人們不仔細審計代碼,反正出了事政府——哦不,是社區——會來救援
社區分裂:Reddit 上的大戰
會議的同時,Reddit 的 r/ethereum 板塊已經變成了戰場。
Reddit 帖子熱度統計(6/17 - 6/21):
硬分叉支持派:
├─ 「Hard Fork is the only moral choice」(硬分叉是唯一的道德選擇)
├─ 「The code was buggy, this is fraud」(代碼有 bug,這是欺詐)
└─ 平均 upvotes:2,847
硬分叉反對派:
├─ 「Hard Fork = censorship」(硬分叉 = 審查)
├─ 「This is not what blockchain stands for」(這不是區塊鏈存在的意義)
└─ 平均 upvotes:1,923
ICO 受害者求助帖:
├─ 「I invested my life savings」(我投入了全部積蓄)
├─ 「My daughter's college fund is gone」(女兒的大學基金沒了)
└─ 平均 upvotes:4,521
情感上,受害者的呼聲最終佔了上風。
投票結果
最終,超過 85% 的以太坊社區成員投票支持硬分叉。這個數字包括:
投票統計:
礦工投票(透過 EIP):
├─ 支持硬分叉:89.3%
├─ 反對硬分叉:10.7%
└─ 投票率:83.2%(按算力計算)
代幣持有者投票(透過論壇/Discord):
├─ 支持硬分叉:85.6%
├─ 反對硬分叉:14.4%
└─ 投票率:難以統計(非正式投票)
Core Developer 立場:
├─ 支持:Vitalik, Gavin, Christian, etc.
├─ 反對:Vlad Zamfir, Yoichi Hirai
└─ 棄權:部分成員
這裡有個有趣的細節:Yoichi Hirai——也就是那位被稱讚「認真審計了 DAO 代碼」的安全性研究者——投了反對票,並威脅如果執行硬分叉就離開核心開發團隊。後來他確實離開了,不過是幾年後的事。
硬分叉執行:7 月 20 日
時間快進到 7 月 20 日。硬分叉在區塊高度 1,919,999 執行。
硬分叉前後對比:
硬分叉前 硬分叉後
──────── ────────
區塊總數: 1,919,998 1,919,999(新鏈)
區塊哈希: 0x94365e... 0x...
ETH 供應量: ~94M(+攻擊盜取的) ~87M(攻擊金額被還原)
攻擊者餘額: 3,641,694 ETH 0 ETH
DAO 合約餘額: 0 ETH 接近攻擊前的水準
等等,你可能注意到了——攻擊者的 ETH 並不是直接「退還」給原始投資者,而是退還到 DAO 的智能合約。這個合約後來設計了一個「Withdraw」函數,讓投資者可以按比例領回他們的 ETH。
以太坊經典(ETC)的誕生
硬分叉的副產品是:以太坊經典(Ethereum Classic, ETC)。
反對硬分叉的礦工和社區成員決定繼續維護原來的區塊鏈。對他們來說,「代碼即法律」的原則不能因為任何理由被打破。
ETC 誕生時間線:
7/20 18:24 UTC - ETC 挖出第一個區塊(區塊高度 1,919,999)
7/21 - 交易所開始支援 ETC 交易
7/23 - Poloniex 開放 ETC/USD 交易對
8/02 - 攻擊者開始在 ETC 鏈上轉移資金
價格走勢:
ETH(硬分叉鏈):
├─ 分叉前:~$12
├─ 分叉後:暴漲至 ~$20
└─ 原因:社區信心恢復
ETC(原鏈):
├─ 分叉時:~$3
├─ 原因:意識形態支持者買入
└─ 後來成為攻擊者洗錢的管道
諷刺的事情來了:攻擊者利用 ETC 進行了「重放攻擊」(replay attack),把他在 ETH 鏈上已經「失效」的資金轉移到 ETC 鏈上並套現。這後來成為區塊鏈安全研究的一個經典案例。
決策的長期影響
對以太坊本身的影響
硬分叉後的以太坊:
短期(2016-2017):
├─ ETH 價格:從低點反彈
├─ 社區:經歷激烈分裂後重建
├─ 技術:加強了對智能合約安全的關注
└─ EIP:提出了多個安全相關的改進提案
中期(2018-2020):
├─ ETH 價格:經歷 ICO 泡沫後回落
├─ Casper FFG:共識機制最終選擇了 PoS
├─ The Merge:最終完成從 PoW 到 PoS 的轉換
└─ EIP-1559:全新的費用市場設計
長期(2021-至今):
├─ ETH 供應:呈現通貨緊縮趨勢
├─ 安全性:沒有再發生類似的智能合約盜竊
└─ 治理:更強調安全審計和的形式化驗證
對整個區塊鏈行業的影響
DAO 攻擊和隨後的硬分叉成為區塊鏈歷史上最重要的案例研究之一:
行業影響:
1. 智能合約安全:
├─ Solidity 語言添加了更多的安全檢查
├─ OpenZeppelin 推出了標準化的安全庫
├─ Mythril, Slither 等自動化安全工具興起
└─ 代碼審計成為 ICO 項目的標配
2. 區塊鏈治理:
├─ 硬分叉的合法性問題被正式討論
├─ DAC(去中心化自治公司)概念提出
├─ 社區投票機制得到改進
└─ 意識到「代碼即法律」需要重新定義
3. 法律視角:
├─ 美國 SEC 開始評估 ETH 的證券屬性
├─ DAO 代幣被認定為證券(部分)
├─ 區塊鏈監管框架開始形成
└─ 責任歸屬問題被提出(代碼作者是否負責?)
4. 密碼學貨幣交易所:
├─ 必須支持硬分叉資產的處理
├─ 「fair distribution」問題被討論
├─ 交易所開始對新資產更加謹慎
└─ 分叉監控服務興起
Vlad Zamfir 的後續
說個讓我個人很感慨的細節。Vlad Zamfir 後來成為了以太坊最重要的共識機制研究者之一。Casper FFG(Friendly Finality Gadget)的「F」就是「Friendly」——他說這是他堅持加的,就是為了表示「即使在反對硬分叉之後,我仍然相信以太坊社區是友善的」。
2018 年,他發了一條推文:
「我永遠不會支持『為了解決一個 bug 而硬分叉』的決策。但我會支持『為了防止未來更多的類似事件而改變共識機制』的決策。」
「區塊鏈的價值不在於『不能改變』,而在於『改變的代價足夠高,以至於不會被輕易篡改』。硬分叉讓我看到了改變的代價——社區分裂、意識形態衝突。這本身就是一種安全機制。」
那些「如果」的假設
歷史不能假設,但我們可以從「如果」中學習:
假設分析:
如果 DAO 從未被攻擊:
├─ 以太坊可能會更早進入 PoS
├─ ETH 可能沒有後來那麼大的價格波動
├─ 「代碼即法律」的意識形態可能更加根深蒂固
└─ ETC 可能從未存在
如果採用了軟分叉方案:
├─ 意識形態上可能更容易被接受
├─ 但軟分叉本身有免費燃料攻擊漏洞
└─ 結果可能更糟
如果從一開始就拒絕 ICO:
├─ 區塊鏈應用發展可能會更慢
├─ 但安全性事故會更少
├─ 行業可能會更注重技術而非投機
└─ 不會有後來的 ICO 泡沫
如果反對派真的堅持 ETC 是正統鏈:
├─ 可能會造成更大的社區分裂
├─ ETH 和 ETC 的市值可能都會更低
├─ 但「區塊鏈不可篡改」的原則會更加牢固
└─ 未來的監管可能會不同
結語:歷史給我們的教訓
寫到這裡,我不禁想:2016 年的 DAO 事件,其實是整個區塊鏈行業的「成年禮」。
在 DAO 之前,我們都在談理想、談願景、談「將來區塊鏈會改變世界」。DAO 事件強迫我們面對一個問題:當技術和人性衝突時,你怎麼選?
硬分叉支持者說:人類的公平正義比意識形態更重要。
硬分叉反對者說:一旦打破原則,就再也回不去了。
兩邊都有道理。這就是為什麼 DAO 事件至今仍然是區塊鏈治理討論的焦點。
Vitalik 後來在一個訪談中說過一句話,我覺得總結得很好:
「2016 年讓我學到了最重要的一課:區塊鏈不是關於『消除人類判斷』,而是關於『讓人類判斷更加透明和可驗證』。DAO 失敗不是因為它是去中心化的,而是因為它對人性的估計太天真。」
或許這就是 DAO 攻擊留給我們最寶貴的遺產:它告訴我們,去中心化不是萬靈丹,人類社會的複雜性不會因為引入密碼學貨幣就消失。但它同時也告訴我們:即使在最混亂的時刻,社區有能力做出艱難的決定,並為此承擔後果。
這種「有能力犯錯並承擔後果」的特性,或許正是區塊鏈最本質的力量。
事件時間線完整版:
2016/04/30 - DAO 眾籌開始
2016/05/28 - DAO 眾籌結束,募集 1200 萬 ETH
2016/06/09 - 有人在 Reddit 警告 DAO 漏洞
2016/06/17 02:45 UTC - 攻擊開始
2016/06/17 04:00 UTC - 社區察覺攻擊
2016/06/17 07:15 UTC - Vitalik 確認攻擊
2016/06/17 09:00 UTC - 交易所開始反應
2016/06/19 - 開發者緊急會議
2016/07/15 - 軟分叉提案被放棄
2016/07/20 18:24 UTC - 硬分叉執行
2016/07/20 18:24 UTC - ETC 區塊鏈誕生
2016/07/29 - ETH 和 ETC 開始平行交易
參考資料:
- The DAO Hackers Were Right: https://www.reddit.com/r/ethereum/comments/4oj2ql/
- Ethereum.org Official Statement: https://ethereum.org/
- Vlad Zamfir's Medium Articles: https://medium.com/@Vlad_Zamfir
- 以太坊區塊瀏覽器(區塊 1,919,999):https://etherscan.io/block/1919999
相關文章
- The DAO 攻擊後以太坊分裂深度分析:ETC 誕生的技術、經濟與意識形態因素 — 本文深入分析 2016 年 7 月以太坊硬分叉後 ETC 誕生的完整脈絡。我們從純技術層面的重放攻擊防護機制(Chain ID = 61),到經濟激勵結構的重新調整,再到意識形態話語權的爭奪,全面呈現這次分裂的多重面向。真實還原分叉區塊 1,920,000 的技術實施細節、當事人多年後的訪談反思、以及 ETC 社群的形成與組織化過程。
- The DAO 攻擊完整交易追蹤教學:從漏洞觸發到區塊鏈分裂的鏈上證據重建 — 本文提供完整的 The DAO 攻擊交易追蹤教學,透過實際的鏈上數據還原攻擊的每一步驟。從區塊 #1,785,000 開始,逐步追蹤攻擊者如何利用重入漏洞在短短數小時內盜取約 360 萬 ETH。我們將重建完整的交易序列,解釋每個步驟的技術原理,並提供在 Etherscan 上驗證每一筆關鍵交易的方法。
- The DAO 攻擊的治理政治學:硬分叉決策的幕後權力博弈 — 本文從治理政治學的角度,深入剖析 2016 年 The DAO 硬分叉決策的完整過程。揭示這個決定如何形成、誰參與了決策、各方的動機是什麼、以及這個決定對以太坊治理的長遠影響。包含完整的社群政治學分析、礦工投票記錄、交易所反應、以及以太坊經典(ETC)產生的深層原因。涵蓋 Freeman 利益相關者理論、Olson 集體行動理論、以及 Davidson 密碼經濟學框架的學術引用。
- The DAO 攻擊事件完整技術分析:智能合約安全的歷史轉折點 — 2016年6月17日,以太坊遭遇了最嚴重的安全事件之一——The DAO 攻擊。本文從攻擊原理、代碼層面分析、經濟影響、社區反應等多個維度深度剖析這次事件對整個區塊鏈行業的長期影響。
- 以太坊 DAO 事件完整解析:The DAO 硬分叉的歷史教訓 — 以太坊 DAO 事件完整解析,深入分析 The DAO 攻擊的技術細節、硬分叉決策的爭議與後續影響,理解區塊鏈治理的複雜性。
延伸閱讀與來源
- 以太坊 GitHub 提交歷史 go-ethereum 客戶端完整開發歷史
- All Core Devs 會議紀錄 以太坊核心開發者會議完整記錄
- EIPs 提案歷史 以太坊改進提案的提案與討論存檔
- Ethernodes 節點分佈 歷史節點分佈數據
- Etherscan 區塊瀏覽器 歷史交易與合約事件查詢
- 以太坊基金會研究頁面 官方研究文件與學術論文列表
- DeFi Llama 歷史 TVL DeFi 歷史鎖倉量追蹤
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!