以太坊 API 服務工具 Infura 昨(11)日下午 4 時許出現系統中斷,連帶導致如 Metamask、MakerDAO、Uniswap 等 Dapp 發生異常,幣安在內多個交易平台也旋即中止了以太坊的相關交易作業。經查發現,起因源於以太坊客戶端 Geth 在一次版本更新中對共識機制的程式碼修正。
(前情提要:突發!Infura當機致「以太坊錢包異常」,多家交易所暫停ETH ERC20代幣充提)
以太坊核心開發者 Péter Szilágyi 今(12)晨發布了檢討報告,指出此次漏洞是被刻意觸發的;而以太坊擴容方案 Optimistic 隨後也出面坦言,其「無意間」的一次測試可能就是導致分叉發生的主因。
而這可能也是自 2016 年 DAO 分叉事件後,以太坊最嚴峻的挑戰。
事件總結:
- Infura 的 Ethereum Mainnet API 週三出現服務中斷,導致多個以太坊 Dapp 異常,各大交易平台也隨即中止對以太幣(ETH)和 ERC-20 代幣的服務。Infura 報告指出,因其運行舊版本的 Geth,在區塊高度 11234873 時遇見嚴重的共識錯誤。
- 根據 Péter Szilágyi 發布的檢討報告,起因為 Geth 在版本更新中偷偷插入共識機制的程式碼修正,而部分以太坊節點誤認此次升級不具優先性,故忽略了更新作業,導致以太坊區塊鏈分叉為舊版本與新版本兩條分類帳。諷刺的是,Geth 對共識機制修正,就是為了防止分叉發生。
- 這引發了以太坊透明度問題,因為許多節點並不知道 Geth 升級版本涵蓋了對共識機制的更動。
- Péter Szilágyi 報告指出,此次漏洞是被刻意觸發。許多人認為,這次的分叉事件是自 2016 年 DAO 分叉出以太坊經典(ETC)後最嚴峻的一次挑戰,令人開始質疑起以太坊自詡的去中心化,以及進入以太坊 2.0 時代後有關開發者協作的問題。
事件回顧:
起初,Infura 在昨日傍晚無預警出現服務中斷,因為它能幫助以太坊大多數的 DeFi 項目與以太坊主網同步,故導致 Compound、MyCrypto、Metamask 等眾多 Dapp 隨之當機;不久後,幣安也發現了以太坊節點上的交易紀錄存在衝突,遂中止相關交易作業,其他交易所也很快跟進幣安的做法。
後續過了一段時間,真正的問題起源逐漸明朗:Go Ethereum(Geth)存在漏洞。
據了解,Geth 支撐著以太坊上高達 80% 的 Dapp,而由於 Infura、Blockchair 等 Dapp 忽略了 Geth 的版本更新,導致以太坊出現分叉。鏈分叉不僅會導致 Dapp 作業陷入延遲,Dapp 數小時的系統中斷也讓客戶的資金也暴露在高度風險中。
目前,Infura 已經修復了該問題,其餘受影響的 Dapp 也更新了客戶端版本。
以太坊核心開發團隊負責人 Péter Szilágyi 在檢討報告中表示,Geth 在 7 月 20 日更新到 v1.9.17 版本,其中默默地加入了對共識機制的部分錯誤進行修正,但由於擔心這種簡單的修正作業會給有心人士攻擊的機會,因此並沒有對外公開。
另外,名為 Optimistic 的以太坊擴容方案今早也出面承認,因為其 OVM 虛擬機採用的是 Geth 在 6 個月前發布的版本,並在其中發現了程式碼錯誤。而在昨天事件發生後,他們在發現到多數節點都已完成升級,便決定對舊版本的錯誤進行測試,沒料卻引發了分叉。
Our Optimistic Virtual Machine relies on a version of geth that we forked 6 months ago. We’ve been pushing the limits of geth in the OVM and we found a very mysterious bug. We were able to patch the bug on our geth fork but the root cause remained unclear.
— Optimist Prime (@jinglejamOP) November 11, 2020
Blockchair 的首席開發者 Nikitia Zhavoronkov 也指出,程式碼修復確實是數個月前部署的,直至昨天才出現導致鏈分叉的交易。他說,由於該版本更新只是對程式碼進行一次小型的更動,因此 Blockchair 並未多費心,自認無需為此暫停 Blockchair 的服務。
(2/2)… got stuck on a minority chain (~30 blocks in 2 hours)
3. Technically, that was an unannounced hard fork. Something similar happened to #Bitcoin 7 years ago when there was a database upgrade: https://t.co/bdqQdpxIj2
4. Fix: upgrade geth and run debug.setHead(11234872) pic.twitter.com/SVQtgijViW
— Nikita Zhavoronkov (@nikzh) November 11, 2020
透明度
具有諷刺意味的是,Geth 版本更新試圖解決的就是共識錯誤可能引發的問題。
Geth 開發人員 Martin Swende 回應 Nikitia Zhavoronkov 的貼文表示,這次的系統崩潰是在提醒大家要隨時保持節點在最新狀態。他並說道,Geth 沒有對外宣傳,主要是在避免外界對程式碼漏洞的關注;他強調,比起對外公開可能引發的破壞,悄無聲息地修復漏洞是最好的辦法。
不過,社群仍質疑道,為何 Geth 不能私下對 Dapp 開發者發出提醒?
Thesis 創辦人 Matt Luongo 就表示,開發團隊應該要在任一與之相關的項目之間設立一個聯絡人,以幫助雙方的協調,順利完成升級。他說,當分叉事件突然發生時,任何一位像他們這樣在以太坊上進行建設的開發者,都可能會蒙受損失。
收拾殘局
Nikitia Zhavoronkov 強調,這次的問題不是惡意引發的,但他也同意,假如 Geth 知道這種情況可能出現,他們就應該為節點準備一份操作指南。Matt Luongo 也說,Geth 的團隊確實是一群優秀的開發者,但是他們缺乏運行基礎設施的經驗,而且資金也不足。
在一般情況下,以太坊要進行硬分叉,需要花費數週至數月的準備時間;公開的共識機制修復往往要冒著被攻擊的風險,假如有人「超前部署」,更可能導致網路完全癱瘓。
Péter Szilágyi 說,犧牲透明度以強化安全性絕不是他們的首要目標,但這確實能達到延遲的效果,讓多數節點在攻擊發生前就得以對其免疫。
Péter Szilágyi 表示,Geth 團隊就是認為透露漏洞的風險太大,才決定偷偷進行更新,以將風險降至最低。他說,雖然昨天出現了意想不到的反轉,即以太坊網路出現分叉,但是 Geth 團隊依舊認為,在版本修復上保持沈默是一項正確的決定。
而隨著以太坊 2.0 即將問世,這次事件的發生可能也帶給了以太坊寶貴的經驗。
Matt Luongo 就說,在事件發生後,最重要的是下此決定的人必須公開其原因,並在承認錯誤後從中得到成長。他表示,門羅幣(Monero)、比特幣和 Zcash 過去都發生過類似問題,而他們也都是這樣進行處理;而儘管這相當棘手,但是任何迴避與社群協調的行為都是極其危險的。
我希望這次的分叉能為以太坊帶來更緊密的聯繫,並重新思考以太坊上的項目該如何與客戶端協作。
📍相關報導📍
以太坊核心開發者:「柏林硬分叉」預計 1 月中旬發布,ETH 1.x 測試網 4 週內釋出
以太坊2.0預計12月正式發布;存款合約上線!ETH質押已破1.4萬枚
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務