logo

你真的懂以太坊嗎?以太坊2.0設計原則了解一下 | 技術

瀏覽數

99+

作者 | Raul Jordan 

編譯 | Jhonny

很多文章都在討論以太坊 2.0的路線圖、研究提案及其發展現狀。然而有關以太坊2.0內部運行背後的設計原則和不變量的文章卻不多。

對於以太坊2.0這樣一場需要協調並耗時數年的重大變革來說,其成功的關鍵在於需要一組明確的不變量 (invariants) 並要求實施者 (implementers) 與以太坊的哲學理念保持一致。本文將解釋其中一些設計決策、相關背景以及為何這些設計對於以太坊2.0協議的未來至關重要。

 

歷史回顧

自以太坊網絡誕生以來,將以太坊從 PoW 轉換為 PoS 協議的動機就在不斷演化。當時 Vitalik Buterin 正在探索一種可行的解決方案,以克服單純的 PoS 協議存在的缺陷,從而提供比 PoW 更強大的安全保障。具體來說,Vitalik 和以太坊研究團隊設計了一種稱為 slasher (罰沒) 的機制,用以在 PoS 協議中懲罰惡意攻擊者並罰沒他們的存款 (Buterin 2018)。

之後 Vlad Zamfir 加入了以太坊項目,2014年的大多數工作都集中在解決已知的針對 PoS 的遠程攻擊 (long-range attack)

當攻擊者輕易地從頭開始搭建一條比當前的規範鏈更長的鏈,並導致網絡中的其他參與者認可新鏈的狀態時,這就是遠程攻擊。

 

這種情況幾乎不可能在比特幣或以太坊等 PoW 鏈上發生,因為這需要整合大量的計算能力。然而,由於 PoS 機制並不依賴於計算能力,因此在遭遇這種攻擊時會導致網絡崩潰 (Zamfir 2014)

Vitalik Buterin 和 Vlad Zamfir 一致認為,除了嚴格地阻止客戶端同步一條超過某個 checkpoint (檢查點) 的鏈之外,沒有其他可行的抵禦遠程攻擊的解決方案 (Buterin 2018)。

這種方法意味著,網絡中的新節點只需要從那個最新的、由網絡中的其他節點認可為“finalized”的“checkpoint”開始同步,而不是從創始區塊開始同步。也就是說,當新的節點加入到網絡中時,新節點對舊節點存在固有的信任。這種現象被稱為 PoS 的弱主觀性 (weak subjectivity)。當新節點加入網絡中時,對在網絡所有參與者中已經被“finalized”且不可篡改的區塊存在主觀信任 (subjective trust)。

在那段時間,Vitalik Buterin 和以太坊基金會的 Virgil Griffith 都致力於在 ArXiV (https://arxiv.org/abs/1710.09437) 網站上發布最初版的 Casper Proof of Stake 白皮書。2014至2017年這段很長的時間,以太坊試圖在當前運行 PoW 機制的以太坊主鏈之上覆蓋一個基於 PoS 機制的最終性系統 (a PoS based finality system)。與此同時,以太坊開發者們也致力於實現狀態分片 (state sharding),將之作為擴展以太坊網絡的方案。

而到了2018年時,這兩項規劃都得到了重大的推進,且2018年3月份在台北的一場標志性研究聚會之後,以太坊研究團隊提議將 Casper Proof of Stake 和 Sharding 合並到一項稱為以太坊 Serenity (也即以太坊2.0) 的發展方案中

 

為何要推出以太坊2.0?

本文旨在解釋“為何要推出以太坊2.0?”這一核心問題背後的設計理念。

當然,對當前以太坊 PoW 鏈的共識協議和數據完整性進行全面變革並不是通過僅僅一次硬分叉就能夠輕易實現的--重新開始搭建一個全新的系統並將當前的以太坊1.0鏈完全地摒棄,這不是更容易嗎?

在搭建以太坊2.0時,我們遇到的一個難題就是需要讓以太坊社區參與到這場挑戰中來,並讓社區成員清楚地了解過渡到以太坊2.0背後的巨大益處和需求。在了解了伴隨這種範式轉換而來的巨大責任之後,現在是構建以太坊2.0的絕佳時機。

不管我們是否願意承認,當前區塊鏈和加密貨幣依舊處於繈褓階段,並且我們今天所做的決定將推動區塊鏈和加密貨幣在未來多年的加速增長和采用。在轉向 PoS 機制方面,我們已經等待了足夠長的時間,以太坊應用亦是如此。當前已到了構建以太坊2.0的最佳時間,相關團隊也做好了相應的準備。

 

前方的挑戰

單純的 Layer 1 擴展可能會付出巨大的安全性代價,因為對區塊鏈進行分片會使得無法對交易進行全局性驗證 (global transaction verification,也即網絡中的所有礦工 (除了惡意攻擊者之外) 都會致力於對所有交易進行確認,所有礦工的算力保證了整條鏈的安全。而分片則意味著某條分片鏈中的交易只由整個網絡中的一部分驗證者進行驗證 (因為整個網絡中的驗證者會被分配到各個分片鏈中負責交易驗證),如此一來,單條分片鏈的安全性就比整條鏈的更低);當前的比特幣和以太坊就能夠對交易進行全局性驗證,從而保證了整個網絡的安全。

關鍵的問題是:我們如何在不犧牲去中心化和安全性的同時獲取擴展性呢?以太坊的很多競爭性區塊鏈平台 (如 EOS) 選擇走中心化的路線來解決這一問題。而以太坊選擇了一種不同的方式,即將網絡的狀態劃分到1024條並行運行的分片鏈之中,每條分片鏈都由統一由一條稱為信標鏈 (beacon chain) 的根鏈進行協調

信標鏈運行完全的 Casper PoS 機制,整個體統中不存在 EOS 那樣的代理或中心化的投票權。在這種方式中,每個節點只需要負責處理整個網絡中所有交易的一部分,且很多區塊可以並行處理交易,這就線性增長了整個網絡的吞吐量

以太坊2.0規範試圖回答以下問題:

如果沒有對交易進行全局性驗證,那網絡的安全性將會受到什麼影響呢?應該如何選擇驗證的參與者同時阻止驗證壟斷的出現呢?應該如何設計激勵措施,以最大限度地提高數據可用性和參與的積極性?

在經過多年的研究、探索和理解需要做出的權衡之後,以太坊探索著將 PoS 作為其共識算法的選擇。出於文本中討論的原因,驗證者是一定能夠獲得獎勵的,同時驗證實體 (個人或企業) 在 Casper PoS 協議中享有平等的待遇,在參與到驗證者委員會並獲得獎勵/處罰方面有著均等的概率

交易的全局性驗證轉變成了間接性驗證:每條分片鏈中的每筆交易都將首先由該分片中的驗證者進行驗證,該分片的驗證者會將檢查點 (checkpoints) 提交至信標鏈中,信標鏈在以太坊2.0中扮演著各分片鏈的“協調者”角色

 

以太坊2.0設計的不變量

協議設計的一個關鍵支柱就是理解該協議將在哪些不變量下運行

對於以太坊及其開發者社區來說,存在一個不可修改的設計決策對於以太坊2.0的未來發展是至關重要的。我們可以將以太坊2.0的核心分為以下幾個要點:

參與到網絡中應該是無需許可的 (permissionless);

Layer 1 的範圍應該簡潔 (concise)、緊湊;

協議應該在最大程度上具有表達性 (expressive),同時不考慮其未來的用途;

網絡應該具有活性 (liveness),能夠有效地從任何災難性的場景中恢覆過來;

應該將協議的覆雜性與應用程序開發的覆雜性區分開來

01.無需許可性

以太坊2.0與其他“下一代”區塊鏈平台的顯著區別就在於如何參與共識

以太坊2.0中稱為驗證者的唯一要求就是需要持有 32 枚 ETH。在以太坊2.0系統中,不存在代理,沒有用於選擇驗證節點的投票,也沒有決定誰能參與驗證的中心化機構。更重要的是,每個實體參與進來的硬性要求是質押 32 ETH,這使得以太坊2.0中的驗證者都得到了平等的對待。

然而,任何個人都可能擁有對個驗證者身份 (也即持有大量 ETH 的用戶在多個客戶端中進行質押,並擁有多個驗證者身份)。這只是一項簡化共識協議的安全性和簡潔性的決策。從激勵設計的角度來說,在對區塊進行投票驗證時,平等地對待所有參與者是非常重要的,這對於形式化建模 (formal modeling) 也是很重要的。1名驗證者=質押 32 ETH,不能多也不能少。

其他的區塊鏈平台往往通過采取一種更為中心化的方式來進行交易驗證,以此來解決擴展性問題;但對於以太坊而言,這並不是其考慮的選項。

02.保持簡潔性,但具有最大程度的表達性

以太坊2.0在其核心定義和實現目標方面力求簡潔緊湊。在基礎層面,以太坊2.0是一個用於搭建去中心化應用的可擴展、無需許可平台,

在以太坊2.0系統中,沒有必要引入應用程序邏輯,這是有原因的。我們可以將以太坊2.0系統類比成 Linux 系統的內核 -- 並不應該由操作系統本身來決定應該包含某些特性或設想其用例,而是應該由為系統內核搭建應用的開發者來決定。

03.保證安全性

以太坊2.0的 PoS 模式 -- Casper the Friendly Finality Gadget -- 在一系列的激勵措施下運行,旨在保持高度的活力和網絡參與。以太坊2.0通過 Casper 進行擴展並利用其特征來保護整個分片鏈網絡的安全性。也就是說,以太坊2.0通過使用鏈最終性閾值的概念來保證系統中的 1024 條分片鏈與信標鏈共享安全性。

PoS 的前提是,驗證者在按預期執行被分配的驗證工作之後就能夠獲得獎勵,或者因為處於離線狀態而小損失部分質押金,亦或者如果驗證者惡意違反協議時受到嚴重的懲罰 (質押金被罰沒)。

雖然這一前提很簡潔,但相關的細節是決定成敗的關鍵。一旦我們意識到不僅要考慮每個驗證者的行為,同時還要考慮所有驗證者委員會的行為時,Casper 經濟學很快就變得更加覆雜。

通常對於 PoS 鏈的一個開放性問題是:應該何時懲罰惡意行為,以及應該如何根據行為的嚴重程度來相應地對驗證者進行懲罰 (嚴重程度不同,懲罰也應不同)。也就是說,我們需要找到一個足夠全面的懲罰措施,既能涵蓋所有的極端情況,又能保持簡潔性

由於協議依賴於驗證者的活動,協議的運行也依賴於持久的時間尺度,可能會出現誠實的驗證者下也無法參與驗證的情況。誠實的驗證者可能因為斷電、網絡故障或其他原因而離線,但我們需要明確地將離線懲罰和惡意行為懲罰區分開來

以太坊2.0的部分設計原理是使任何企圖破壞協議的攻擊者付出巨大的成本代價。也就是說,在其他區塊鏈平台上發生的51%攻擊,在以太坊2.0鏈上將需要付出巨大的成本,甚至會帶來相反的效果。也即逆轉協議中的最終性將使得攻擊者對於其他誠實地驗證者非常顯而易見,從而允許社區協調一致地通過軟分叉來將該惡意攻擊者移除出去,使其攻擊變得無效

基於 PoS 機制的系統的另一個限制就是驗證者的困境,也即系統中的驗證者過於懶惰 (離線狀態),一味地相信協議中的其他驗證者將會以正確的方式進行區塊驗證,因此這些懶惰的驗證者玩忽職守。這些驗證者通過不執行他們的驗證職責,從而節省帶寬或一般的計算需求,除非他們面臨重大的懲罰。針對這種情況,可以通過在網絡中增加針對數據缺失或錯誤的簽名信息而設置的非常嚴重的懲罰和挑戰機制,以此來緩解這種問題。

 

以太坊2.0的驗證者激勵措施

以太坊2.0的驗證者激勵措施如下:

01.驗證者離線:Quadratic Leak

以太坊2.0依賴於拜占庭容錯閾值,也即必須保證網絡中 2/3 的驗證者是誠實的驗證者

針對不參與驗證的驗證者的懲罰稱為 “inactivity leaks”。如果某條分片鏈在超過4個 epoch 期間沒有得以敲定,那該協議對驗證者的獎勵將變得盡可能嚴格,也即最大的預期獎勵將是0,因此驗證者需要正確地進行驗證操作,否則將受到更多的懲罰。懲罰程度的大小將與上一次鏈實現最終性以來的時間成正比 (也即距離上一次的最終性的時間越長,受到的懲罰就越大),以此來組織驗證者離線。

[備註:在以太坊2.0階段,每生成64個區塊(大約需要6.4分鐘,稱為一個epoch),信標鏈將重新打亂驗證者並將他們重新分配到所有的分片鏈中。]

驗證者離線的時間越長,這種懲罰就會呈指數級增長。這種懲罰稱為“quadratic leak”,這種懲罰機制的設計初衷是:短期的離線狀態將不會受到懲罰,但離線較長一段時間將為驗證者帶來很大的不利影響,這能夠很好地將預期的現實情況考慮進去。這種懲罰所損失的資金將被銷毀,而不是分發給其他的誠實驗證者。

02.故意的惡意行為:罰沒 (slashing)

在針對以太坊 PoS 的早期提案中,惡意的驗證者將受到稱為 slashing (罰沒) 的巨大懲罰,通常這些機制僅僅討論了針對單獨的個人惡意驗證者的懲罰,而沒有討論驗證者串謀起來的嚴重性。只有當很大一部分驗證者協同對網絡進行惡意操作時,網絡才會受到影響。

根據拜占庭式容錯,對惡意行為者的懲罰將是在一定時間間隔內也進行惡意行為的驗證者數量的3倍。這有助於懲罰大量協同的攻擊行為,同時也阻止惡意驗證者聚集在一起。也就是說,對於驗證者來說,聯合起來對網絡發起攻擊是非常不利的。

罰沒 (slashing) 是通過一個揭發機制來實現的,也即驗證者能夠通過發現其他驗證者的可罰沒攻擊行為來獲得獎勵,作為報酬能夠獲得其他驗證者被罰沒的資金。

03.驗證者獎勵

根據 Vitalik Buterin 的以太坊 Serenity 設計原理 (https://notes.ethereum.org/s/rkhCgQteN),他概述了每名驗證者在每個 epoch 時間段內 (每生成 64 個區塊稱為一個 epoch) 獲得的基本獎勵的4個明確組成部分:

通過證明以確定正確的 epoch 檢查點而獲得的獎勵的 1/4;

通過證明以確定正確的 chain head 而獲得的獎勵的 1/4;

通過證明使區塊得以快速進入鏈中而獲得的獎勵的1/4;

通過證明以確定正確的分片區塊而獲得的獎勵的1/4;

此外,根據正確參與驗證的驗證者數量,在這個基本獎勵之上還有其他額外的獎勵。這一額外的獎勵用於激勵驗證者進行正確操作,共同地推動了網絡中的誠實活動。獎勵的發放時間表應該是一直且直接的。增加其他更多的覆雜性將使整個系統更易於出錯,從宏觀經濟的角度來看也更難以理解。

 

將協議的覆雜性與應用的覆雜性區別開來

可以說,以太坊2.0的路線圖是一項將歷時多年且最具雄心的計劃之一,該計劃從整個區塊鏈領域吸取了經驗教訓並創建了一個能夠很好地解決擴展性三難困境的協議,該協議將能夠持久運行下去。

有關分片將如何有效地增加開發者體驗已經存在很多的討論。其基本依據是,在以太坊2.0協議的設計中不考慮應用開發者的需求是非常困難的,因為分片鏈的高度覆雜系統要求各分片需要彼此交互 (跨分片通信)。

乍看之下,這種觀點說得通,因為從外部看來以太坊2.0非常令人生畏,且在以太坊2.0中有關智能合約執行方面依舊存在很多的不確定性。但實際上,事實要微妙地多。

應用開發者將只需要了解以太坊2.0協議的一小部分就夠了。普通的智能合約開發者是不需要了解驗證者註冊表 (validator registry) 或者信標鏈的最終性小工具的內部構造的。

因此,階段0 (信標鏈階段) 完全從應用層中移除了。最近階段1和階段2也提出了一些非常有力的提案,這些提案建議對執行環境進行更高程度的抽象化 (abstraction),這使得以太坊2.0變得更加強大和更為簡潔。

最壞的情況下是,錢包/應用開發者需要了解跨分片交易的某些細節,以便通過一些技巧顯示即時交易結算。今天的計算機操作系統和內部結構比10年前覆雜得多,但是大多數應用程序開發人員並不需要理解那些使計算機構架變得強大的隱藏內部構造。將這兩者區分開來是優秀的架構設計的核心,我們也可以將之當成在搭建以太坊2.0時需要記住的一個設計不變量。

 

構建一台真正的世界計算機

總結而言,以太坊是圖靈完備的,這意味著以太坊能夠以當前計算機相同的方式運行任何類型的代碼,盡管它尚且是一台緩慢、單線程的計算機。

今天的以太坊類似於早期的弱處理器。當前在以太坊上運行應用程序是昂貴的,因為該協議內置了一些機制,用於阻止困擾諸多公共事業的公地悲劇。 

以太坊充滿活力的開發者社區從未停止過對當前網絡的創新,無論是其核心層 (Layer 1) 還是 Layer 2。從治理的角度來說,以太坊未來計劃的升級並不會一路平坦毫無挫折。如果未來以太坊2.0上線了幾年之後,我們感到收到約束並希望搭建以太坊3.0,那也意味著我們在前者的核心設計方面的失敗。

可升級性 (upgradeability) 應該以一種不需要通過有風險的硬分叉才能實現的方式才融入到協議中。也就是說,一旦系統長期處於運行中,Layer 1 層面的創新應該保持最小甚至為零的狀態。

我們還有很長的路要走,但是我們通過謹慎地提醒自己為何要搭建這個軟件,以及我們希望以太坊在未來10年內走向何方,我們也就可以編寫能夠經受住時間考驗的、更具魯棒性的代碼。

參考鏈接:

https://www.tokendaily.co/blog/design-principles-of-ethereum-2-0