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 的論點很有說服力:

  1. 滑坡效應:一旦你承認區塊可以被「糾正」,你就為未來的所有審查打開了大門
  2. 解決方案不完整:硬分叉只解決了 DAO 的問題,但世界上還有其他有漏洞的合約
  3. 錯誤的激勵:這會鼓勵人們不仔細審計代碼,反正出了事政府——哦不,是社區——會來救援

社區分裂: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 開始平行交易

參考資料

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!