以太坊協議層的七年之變

什麼是以太坊

什麼是以太坊?一千個人有一千個答案,而本文想探討的是最為一致的答案,即以太坊的協議是什麼?或用更技術地描述——如果要開發以太坊的客戶端(PoW鏈/ETH1),我需要依照什麼規則?

你沒法找到一份規範描述以太坊當前的共識規則,因為以太坊的協議是通過增量更新來描述的。以太坊黃皮書描述了創世時的完整協議,而每一次協議變更都稱為一次硬分叉(當然,也有人嘗試用「網絡升級」這個表述),需要所有的客戶端更新代碼。簡而言之,以太坊通過硬分叉來實現協議層的變化,變化的最小單元被稱為以太坊改進提案(EIP, Ethereum Improvement Proposal),一次硬分叉包含一組以太坊改進提案。本文將回顧以太坊的歷次硬分叉及其中包含的改進提案,試圖展現過去的七年中以太坊究竟做了什麼。

歷次硬分叉介紹

概況

以太坊的歷次硬分叉可以通過此頁面查看。自2015 年7 月30日上線起,共進行了14 次硬分叉,包含39 個EIP(「君士坦丁堡」和「彼得堡」視為同一次)。間隔最近的兩次硬分叉是26 天,間隔最遠的兩次則是490 天。

硬分叉分為「主動升級」和「被動升級」。主動升級指的是開發團隊主動對以太坊協議的修正,而被動升級則是「不得不」採取的行動,以應對潛在的安全性風險。被動升級至少包括「DAO Fork」、「Tangerine Whistle」、「Spurious Dragon」、「Muir Glacier」、「Arrow Glacier」、「Gray Glacier」,它們或處置黑客盜竊(DAO Fork),或應對DDOS 攻擊(Tangerine Whistle, Spurious Dragon),或僅僅處置難度炸彈(Muir Glacier, Arrow Glacier, Gray Glacier)。而「主動升級」大致符合白皮書的規劃(至少在命名上),Frontier(Frontier, Frontier Thawing)、Homestead、Metropolis(Byzantium, Constantinople/Petersburg, Istanbul),而Berlin 和London 則是以太坊路線圖變更後的過渡性升級。此外,多次主動升級也包含了推遲難度炸彈的選項。

硬分叉是如何達成共識的呢?儘管關於硬分叉的協商並無成文規定,而是依照某種社區管理進行,但其流程發生過一次變更,標誌性事件是Martin Holst Swende 提出了「以EIP 為中心的升級」。這種新的硬分叉協商機制首次在Berlin 升級使用,並避免了一次大型失誤,細節將在後文中介紹。

代表性硬分叉解讀

歷次硬分叉背後蘊含著一些代表性事件,頗具戲劇性,包括DAO 分叉、上海DOS、雙堡奇緣和拆彈危機。

DAO 分叉

DAO 分叉事件是以太坊發展過程中最為深遠的一次事件。由於the DAO 的智能合約被黑客攻擊,約360 萬ether 被黑客盜走,但有28 天的凍結時間。在這期間,借助Carbonvote ,持幣者表達意願,以太坊基金會決定將這部分資金轉移到新的智能合約,允許投資者提款。此次分叉產生了Ethereum Classic,也引發了大量的社會爭論。

上海DOS

在Devcon 2 期間,以太坊核心開發者們齊聚上海,但以太坊網絡卻遭遇了大量的網絡流量攻擊,造成了拒絕服務(DOS)。由於EXTCODESIZE 操作碼所消耗的實際系統資源遠高於攻擊者所需支付的手續費,攻擊者反複調用該操作碼,造成全網大多數節點無法追上最新區塊。開發者們一面協調礦池和全節點啟用受影響較小的Parity 客戶端,一面協商降低區塊gas(從5 M 降低至1.5 M)。最終,借助Tangerine Whistle 和Spurious Dragon 兩次硬分叉調整了相關操作碼的價格,並做了狀態修建,才緩解了DOS 攻擊的影響。這次硬分叉還帶來了後續影響,由於對EIP-161(納入在Spurious Dragon 中)的實現不當(Go-ethereum 和Parity 各自錯誤地做了實現),造成了共識分叉。

雙堡奇兵

你也許會好奇為什麼在7280000 高度會有「君士坦丁堡」和「彼得堡」兩個分叉,仔細觀察會發現兩者的差別就在於「彼得堡」移除了EIP-1283。

根據 ChainSecurity 的報告,EIP-1283 會為部分合約引入重入攻擊的風險。 TrailOfBits 給出了更詳盡的分析並提供了可能受影響的合約列表。在硬分叉激活前32 小時,以太坊基金會發文提醒節點升級或降級以推遲君士坦丁堡升級,隨後發布新版本引入彼得堡硬分叉,客戶端需要將「雙堡」配置在同一塊高或禁用君士坦丁堡硬分叉。

拆彈危機

為什麼Muir Glacier 和Istanbul 兩次硬分叉之間只有26 天,這是因為核心開發者們錯誤計算了難度炸彈的爆炸時間,導致在Istanbul 中未納入推遲難度炸彈的提案。等到發現難度炸彈即將要對網絡產生影響時,第76 次核心開發者會議迅速接受了EIP-2384,並納入到Muir Glacier 硬分叉中。

硬分叉決策流程變更

硬分叉是如何決定的?實際上以太坊長期缺少成文文檔,更多依賴「社會共識」(如果我錯了請改正)。 EIP-233 試圖規範分叉的正式流程,但並未被接受。

儘管本文無法展現以太坊社區對硬分叉決策流程的討論,但以太坊的硬分叉決定流程顯然發生過變化。在Berlin 硬分叉之前,開發者首先確定硬分叉的時間,再決定要納入哪些EIP,確定之後再進行實現和測試。 Berlin 前的每次硬分叉都是一個Meta EIP,例如Istanbul 硬分叉通過 EIP-1679 定義(簡稱HFM-1679)。

Martin Holst Swende 提出了 EIP 為中心的硬分叉流程,其核心觀點是將EIP 的接受與硬分叉剝離,核心開發者聚焦於單個EIP 的認可、實現和測試,當單個EIP 被接受後,後續的硬分叉可選擇納入該EIP。儘管在寫作過程中尚未找到該流程是如何被以太坊核心開發者接受的,但是Berlin 硬分叉棄用了 HFM-2070,而是採納了Martin 提出的流程。

決策流程的變更很快就發揮了作用,在Berlin 硬分叉測試網激活前兩週,圍繞EIP-2315 的廢留,開發者們展開了激烈的爭論並最終移除了EIP-2315 。由於新流程的採納,最後時刻的變更並未對硬分叉造成太大影響,並最終按期進行。更多細節可參考本人撰寫的《移除EIP-2315:以太坊柏林昇級前的緊急剎車》

不是改變的改變

值得一提的是,以太坊的區塊空間上限(Block gas limit)並非共識的一部分。礦工有權更改區塊空間上限,每個區塊的上限變化最多為0.1%。不去硬編碼這個數值主要是為了避免潛在的攻擊風險。該數值變化的歷史可參見MyCrypto 撰寫的研究報告。

EIP 深入分析

這些EIP 對以太坊究竟造成了什麼影響,又是誰影響著以太坊的決策呢。本文整理了以太坊硬分叉中納入的所有EIP(不包含元提案),詳見鏈接。 https://primitiveslane.notion.site/cbd45cf0289c414b86715b8a9e71b28e?v=838baf2ac3a442a6b3fa03e58c5dc0ae

EIP 都在做什麼

納入硬分叉的EIP 的類型主要包含計費模型變更、新操作碼引入、難度炸彈、經濟模型、預編譯、安全考慮等。

計費模型變更

計費模型變更是數量最多的EIP,共有10 個,佔25.6%。其通過增減操作碼的單價,以平衡gas 消耗和實際佔用系統資源的不匹配,可消除系統被DOS 攻擊的隱患,或是有利於特定類型應用的部署。一部分DOS 隱患是因為對系統資源的錯誤估計造成的,EIP-150 和EIP-160 解決了這個問題;而另一部分DOS 隱患則是系統的固有特性,伴隨著狀態數據增長,訪問狀態數據的實際資源消耗也隨之增長,因此需要定期調整相應操作碼的單價,典型的有EIP-1884(我認為寫得最好的EIP 之一)。

由於以太坊的狀態表示模型,計費模型必須定期調整,這是特性,而非故障。

新操作碼引入

共有9 個EIP 為以太坊虛擬機引入了新的操作碼(不含EIP-1884),佔23.08 % 。其中比較有影響力的包括EIP-7 (DELEGATECALL), EIP-1014(CREATE2), EIP-3198(BASEFEE) 等。

難度炸彈

共有6 個EIP 在推遲難度炸彈,佔15.4 % 。有2 次硬分叉伴隨著經濟模型的調整,即降低新區塊獎勵。其中有3 次僅為了推遲難度炸彈而實施的分叉,即名字中帶有Glacier 的硬分叉。有關難度炸彈的歷史,可見原語裡弄的報告。

經濟模型

有4 個EIP 對經濟模型有影響,2 個降低了新區塊獎勵,1 個調整了難度計算模型(EIP-100),此外引發較多爭議的EIP-1559 調整了手續費市場。

預編譯

有4 個EIP 將一些密碼學操作預編譯,因此無需在EVM 中執行,提昇運行效率。包括EIP-152, EIP-196, EIP-197, EIP-198。

安全考慮

有3 個EIP 是出於安全考慮的,包括重放攻擊保護(EIP-155),狀態前綴樹清理(EIP-161),合約代碼大小限制(EIP-170)。

其它

其它EIP 還包括網絡協議改進(EIP-8),增加交易執行狀態接口(EIP-658),增加新的交易類型(EIP-2718)等。此外,EIP-2 包含了Homestead 的所有更新,較為複雜。

誰為EIP 做貢獻

共有43 人,77 人次參與了這些EIP 的撰寫,其中參與2 個以上(含) EIP 的作者有11 個。 Vitalik Buterin 參與撰寫的最多,共17 個,佔43.6 %。 Martin Swende 和Christian Reitwiessner 各參與5 個,Alex Beregszaszi 和James Hancock 各參與3 個,其餘人參與的個數均不超過2 個。

Martin Swende 是以太坊基金會安全負責人,Go-ethereum 工程師,EIP 為中心的硬分叉流程的提出者;Christian Reitwiessner 是Solidity 語言的發明者。

另外有趣的是在新的硬分叉流程實施之後,EIP 作者的數量發生了顯著變化,這或許說明新的流程提高了EIP 的參與度。 Berlin之前,28 個EIP,43 人次,平均每個EIP 有1.54 個作者;Berlin之後,11 個EIP,34 人次,平均每個EIP 有3.09 個作者,增長了一倍。

總結

本文介紹了以太坊歷史上的歷次硬分叉,解讀了幾次硬分叉背後的代表性事件,並詳細描述了以太坊硬分叉決策流程向EIP 為中心的轉變。文章還深入分析了歷次硬分叉中的EIP 所發揮的作用以及他們背後的貢獻者。

以太坊即將迎來新的時代,往事湧上心頭,讀者朋友,你有何感受?

Total
0
Shares
Related Posts