The 2016 Shanghai Attacks: History and Technical Deep Dive | Hudson Jameson (Polygon Labs)
三句話摘要
2016 年上海 Devcon 期間,Ethereum 遭受針對 EVM opcode 定價漏洞的拒絕服務攻擊,核心開發者如何在會議現場緊急應對。 多客戶端架構是 Ethereum 在 2016 年上海攻擊中從未中斷的真正原因,也是任何追求高韌性區塊鏈最值得效仿的核心設計原則。 opcode 定價錯誤是核心漏洞。 EXT code hash 這類 IO 密集操作的 gas 費用遠低於其實際耗用的硬碟與記憶體資源,攻擊者得以極低成本反覆呼叫,直接壓垮客戶端底層的 LevelDB,使 Geth 節點因記憶體錯誤崩潰。
重點整理
重點- 1
opcode 定價錯誤是核心漏洞。 EXT code hash 這類 IO 密集操作的 gas 費用遠低於其實際耗用的硬碟與記憶體資源,攻擊者得以極低成本反覆呼叫,直接壓垮客戶端底層的 LevelDB,使 Geth 節點因記憶體錯誤崩潰。
- 2
多客戶端架構是 Ethereum 當次倖存的關鍵。 Geth 下線期間,使用 RocksDB 的 Parity 客戶端持續正常出塊,整條鏈從未停止。這印證了「規格與客戶端分離」的設計哲學——Ethereum 的規格存在於 GitHub,任何人都能實作不同客戶端,而非綁定單一參考實作。
- 3
緊急協調能力決定應對速度。 核心開發者借用一台備用 Toshiba 筆電、在上海 Hyatt 大廳找到空房作戰,同時直接致電 F2Pool、EthFans 等現場礦池負責人,透過網路內建的 1/1024 漸進機制在 5 小時內將區塊 gas 上限壓到約 40 萬,讓攻擊合約無法塞入區塊。
- 4
狀態清理需要系統性硬分叉。 空帳戶(empty account)在協議層被視為獨立存在,1,900 萬個空帳戶佔用大量磁碟並拖慢同步,臨時措施無法解決;最終 Spurious Dragon 硬分叉改寫規則,讓節點在「觸碰」空帳戶時自動刪除,再透過腳本批量清理,才根治狀態膨脹問題。
實用技巧與重點
乾貨- 攻擊時間:2016 年 9 月 18 日,Devcon 2 開幕前 6 小時
- 攻擊手法一:EXT code hash opcode 定價過低 → 大量呼叫 → Geth(LevelDB)記憶體耗盡崩潰
- 攻擊手法二:SUICIDE(self-destruct)opcode 反覆建立空帳戶 → 狀態膨脹達 1,900 萬個空帳戶
- 當時存活的執行層客戶端:Geth(Go)、Parity(Rust)、Ethereum J(Java)、Aleth/Ethereum++(C++)
- 底層資料庫:Geth 使用 LevelDB,Parity 使用 RocksDB
- 緊急措施:降低區塊 gas 上限,礦工透過 1/1024 漸進公式調整,約 5 小時降至 ~400,000 gas
- 協調對象:F2Pool、EthFans(後更名 SparkPool),均在上海現場
- 修復硬分叉:
- Tangerine Whistle(EIP-150):重新定價多個 IO 密集 opcode
- Spurious Dragon(EIP-158):消除空帳戶概念,批量清除 1,900 萬個空帳戶
- 攻擊者花費:300 ETH(當時 ~$4,000,現值 ~$875,000)
- ETH 當時價格:$13
結論
結論“多客戶端架構是 Ethereum 在 2016 年上海攻擊中從未中斷的真正原因,也是任何追求高韌性區塊鏈最值得效仿的核心設計原則。”
完整解析
詳細2016 年 9 月,Ethereum 基金會正在上海舉辦年度開發者大會 Devcon 2。就在 Vitalik Buterin 準備登台演講的前 6 小時,凌晨 3 點,負責活動運營的 Hudson 被一通廁所電話叫醒——「我們正在被攻擊。」此時 ETH 價格僅 13 美元,Ethereum 主網僅有 Geth(Go)、Parity(Rust)、Ethereum J(Java)、Aleth(C++)四個客戶端能同步,整個生態系統還相當年輕。
第一波攻擊利用了 EVM opcode 定價系統的根本缺陷。Ethereum 的 gas 機制原本應讓每個操作的費用與其耗用的計算資源成正比,但 EXT code hash 這類需要頻繁存取底層資料庫的 IO 密集操作,定價遠低於其實際消耗。攻擊者部署惡意合約,在單一交易中反覆呼叫此 opcode,使 Geth 底層的 LevelDB 被淹沒——硬碟 IO 超載、記憶體耗盡,節點接連崩潰。關鍵是,同樣情境下使用 RocksDB 的 Parity 客戶端卻撐了下來,讓整條鏈得以繼續出塊,沒有中斷。
開發者們擠在上海 Hyatt 酒店的一個臨時空房裡應戰,有人甚至沒帶筆電,Hudson 把備用的 Toshiba 筆電借給 Peter 和 Martin 嘗試同步節點。在最糟糕的網路環境下,他們確定了緊急方案:協調礦工大幅降低區塊 gas 上限。Ethereum 協議內建一個機制,礦工可透過出塊信號表達期望的 gas 上限,網路每個區塊最多移動 1/1024,多數礦工一致時可快速收斂。Hudson 直接致電同在上海參加 Devcon 的 EthFans(後改名 SparkPool)負責人,並聯絡 F2Pool,再由這些礦池向其他礦工廣播設定異動。約 5 小時後,區塊 gas 上限被壓縮至約 40 萬,攻擊合約根本無法塞入區塊,第一波攻擊被暫時壓制。
然而攻擊並未停止。幾天後,第二波攻擊改用 SUICIDE(self-destruct)opcode 的 ether 轉帳副作用,每次呼叫都在狀態中「彈出」新的空帳戶。協議當時區分「空帳戶」(zero balance/nonce/code)與「不存在帳戶」,前者仍佔用磁碟空間與記憶體,但建立成本極低。攻擊者就這樣累積出 1,900 萬個空帳戶,使全節點的磁碟用量與同步時間急劇膨脹。針對這兩個問題,核心開發者快速推出兩個連續硬分叉:Tangerine Whistle(EIP-150)重新定價所有 IO 密集 opcode,從根本堵住定價漏洞;Spurious Dragon(EIP-158)則修改協議,讓節點在觸碰空帳戶時直接刪除,再輔以批量腳本清理全部 1,900 萬筆狀態,Ethereum 的磁碟佔用才回歸正常。整個攻擊過程,攻擊者共花費 300 ETH,按當時市價約 $4,000 美元;以今日幣值計算,則高達 $875,000。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

