
以太坊升級:關於共識的基礎知識(下)
TechFlow Selected深潮精選

以太坊升級:關於共識的基礎知識(下)
這是一本關於以太坊權益證明協議的權威技術書籍。將從一些初步的內容開始,涵蓋一些不限於以太坊的共識基礎。
撰文:Ben Edgington
編譯:tiao
本文是《關於共識的基礎知識》章節的下半部分。上篇詳見《升級以太坊:關於共識的基礎知識》
分叉選擇規則
正如我們所見,由於各種原因——網絡延遲、網絡中斷、消息接收順序錯誤、對等節點的惡意行為——網絡上的節點最終會對網絡狀態有不同的視圖(view)。最終,我們希望網絡上的每個正確節點都能對歷史達成一致的線性視圖,從而對系統狀態形成共同的視圖。協議的分叉選擇規則(fork choice rule)就是為了達成這種一致。
當給定一個區塊樹,以及一些基於節點對網絡的本地視圖的決策標準時,分叉選擇規則的設計初衷是從所有可用的分支中,選擇最有可能成為最終的線性的規範的鏈的那一個。也就是說,當節點試圖向規範視圖靠攏時,它將選擇最不可能被修剪出區塊樹的分支。

分叉選擇規則通過選擇一個分支頂端的區塊(被稱為頭塊)來隱含地選擇一個分支。
對於任何正確的節點,任何分叉選擇規則的第一標準是:它選擇的區塊必須是有效的,遵守了協議的規則,並且它的所有祖先也必須是有效的。任何無效的區塊都會被忽略,而建立在無效區塊上的任何區塊自身也是無效的。
鑑於此,有許多不同的關於分叉選擇規則的例子。
-
以太坊和比特幣中的工作量證明協議使用「最重鏈規則」 [4](有時稱為「最長鏈」,儘管這並不完全準確)。頭塊是在工作量證明下完成最多累積「工作」的鏈的頂端。
-
以太坊的權益證明 Casper FFG 協議中的分叉選擇規則是「跟隨包含最高的合理檢查點的鏈」,並且永遠不會回滾一個已經最終確定的區塊。
-
以太坊的權益證明 LMD GHOST 協議中的分叉選擇規則在其名稱中有所體現:採用「最貪婪、最重的被觀察子樹」。它涉及去計算驗證者對區塊及其後代區塊的累積投票。它也適用與 Casper FFG 相同的規則。
我們將在它們各自的章節中詳細解釋第二和第三個例子。
你可能已經看出來了,這些分叉選擇規則都是為一個區塊分配數字分數的方法。獲勝的區塊——頭塊——有最高的分數。背後的想法是,當所有正確的節點最終看到某個區塊時,將毫不含糊地認同它是頭塊,並選擇跟隨其分支,無論自己對網絡有什麼其它視圖。因此,所有正確的節點最終都會就一個被追溯到創世紀的單一規範鏈的共同視圖達成一致。
重組(Reorgs)和回滾(reversions)
當一個節點接收到新的區塊(和在權益證明中對區塊的新投票)時,它將根據新信息重新評估分叉選擇規則。最常見的情況是,新區塊將是節點當前視為頭塊的區塊的子區塊,並將成為頭塊。
然而,有時新區塊可能是區塊樹中某個其他區塊的後代(請注意,如果節點還沒有新區塊的父區塊,它需要詢問其對等節點以獲得父區塊,對於它知道自己所缺失的任何其它區塊也是如此)。
無論在何種情況下,在更新的區塊樹上運行分叉選擇規則可能會指向一個與先前頭塊不同分支上的頭塊。當這種情況發生時,節點必須執行重組(reorg,是 reorganisation 的簡寫),這也被稱為回滾。它將踢出(回滾)之前已經包含在其鏈中的區塊,並將採用新的頭塊分支上的區塊。
在以下圖表中,節點評估區塊 F 為頭塊,因此其鏈由區塊 A, B, D, E, F 組成。節點知道區塊 C,但它不在節點的鏈的視圖中;區塊 C 在一個側分支上。

一段時間後,節點接收到區塊 G,它不是建立在節點當前的頭塊 F 上 ,而是建立在區塊 C 的分支上。根據分叉選擇規則的細節,節點可能仍然評估 F 為比 G 更好的頭塊,因此忽略 G。但在當前情形中,我們將假設分叉選擇規則表明 G 是更好的頭塊。
區塊 D, E, 和 F 不是區塊 G 的祖先,所以它們需要從節點的規範鏈中移除。這些區塊包含的任何交易或信息都將被回滾,就好像它們從未被接收過一樣。節點必須完全倒回處理區塊 B 之後的狀態。
倒回區塊 B 後,節點可以將區塊 C 和 G 和添加到其鏈中並相應地處理它們。一旦結束,節點就完成了其鏈的重組。

稍後,可能會出現一個建立在區塊 F 之上的區塊 H。如果分叉選擇規則表明新的頭塊應當是 H,那麼節點將再次執行重組,回滾區塊到 B,並重新建立分支 H 上的區塊。
在工作量證明和以太坊的權益證明協議中,由於區塊傳播的網絡延遲,短暫的一兩個區塊的重組並不罕見。除非鏈遭到攻擊、分叉選擇規則的制定或分叉選擇規則客戶端的實現存在漏洞,否則非常長的重組應該極為罕見。
安全性與活性
在討論共識機制時,經常蹦出來兩個重要概念:安全性(safety)和活性(liveness)。
安全性
非正式地說,如果「沒有壞事發生」 [5],則某算法就被認為是安全的。
在區塊鏈環境中可能發生的壞事情的例子包括加密貨幣的雙花(double-spend),或者兩個彼此衝突的檢查點的最終確定。
分佈式系統中安全性的一個重要方面是「一致性」。也就是說,如果我們詢問不同的(誠實的)節點在鏈的某個進展點上的狀態,例如在特定區塊高度時某個賬戶的餘額,那麼無論我們詢問哪個節點,我們應該總是得到相同的答案。在一個安全的系統中,每個節點對鏈的歷史都有一個永不改變的相同視圖。
實際上,安全性意味著我們的分佈式系統「表現得像一箇中心化實例,一次只執行一個原子化的操作。」(引用 Castro 和 Liskov)。在 Vitalik 的中心化分類中,一個安全的系統是在邏輯上是中心化的。
活性
再次非正式地說,如果「最終會發生一些好事」,那麼某種算法就被認為具有活性。
在區塊鏈環境中,我們通常認為這意味著鏈總是可以添加一個新區塊;它永遠不會陷入無法產生包含交易的新區塊的僵局。
「可用性(Availability)」是看待這個問題的另一種方式。我希望鏈是可用的,這意味著如果我向一個誠實的節點發送一個有效的交易,它最終會被包含在一個擴展了這條鏈的區塊中。
二者不可兼得!
CAP 定理是分佈式系統理論中的一個著名結果,它指出沒有分佈式系統可以同時提供(1)一致性(consistency),(2)可用性(availability)和(3)分區容錯性(partition tolerance)。分區容錯性是指節點之間的通信不可靠時仍能正常運行的能力。例如,網絡故障可能將節點分成兩個或多個無法相互通信的群組。
在區塊鏈的語境中很容易證明 CAP 定理。假如亞馬遜網絡服務(AWS)下線,使得所有由 AWS 託管的節點可以相互通信,但沒有一個節點可以與外界通信;或者一個國家阻止所有進出的連接,使得沒有任何 gossip 流量可以通過。這兩種情況都將節點分成兩個不相干的組,如 A 與 B。

假設連接到 A 組網絡的某賬戶發送了一個交易。如果 A 組中的節點處理了該交易,那麼他們最終的狀態就與 B 組中的沒有看到該交易的節點們不同。因此,總的來說,我們失去了所有節點之間的一致性,因此失去了安全性。避免這種情況的唯一方法是 A 組中的節點拒絕處理交易,在這種情況下我們失去了可用性,以及活性。
總之,CAP 定理意味著,我們無法指望設計出一個在任何情況下都既安全又具有活性的共識協議,因為我們別無選擇,只能在一個不可靠的網絡上運行,即互聯網 [6]。
以太坊優先考慮活性
在網絡狀況良好的情況下,以太坊共識協議可同時提供安全性和活性,但在網絡運行不太順暢時,則優先考慮活性。在網絡分區的情況下,分區兩側的節點將繼續產生區塊。不過,最終確定性(finality,安全性的一種屬性)將不再在分區兩側一起發生。根據兩側管理的質押比例,要麼一側繼續獲得最終確定性,要麼兩側都不會繼續獲得最終確定性。
最終,除非分區得到解決,否則雙方都會因新穎的怠惰懲罰(inactivity leak)機制而重新獲得最終確定性。但這也最終會導致安全故障。每條鏈將最終確定不同的歷史,兩條鏈將永遠變得不可調和和獨立。
最終確定性(Finality)
我們將在接下來的章節中大量討論最終確定性,這是鏈的安全性的屬性。
最終確定性是指有些區塊永遠不會被回滾。當一個區塊被最終確定時,網絡上的所有誠實節點都同意該區塊將永遠保留在鏈的歷史中,因此它的所有祖先也將保留在鏈的歷史中。最終確定性讓你對比薩餅的支付不可撤銷,就像用現金一樣。這是對雙花的終極保護 [7]。
一些共識協議,如經典的 PBFT 或 Tendermint,每輪(每個區塊)都會最終確定。一旦一輪交易被包含在鏈上,所有節點都同意它將永遠存在。一方面,這些協議非常「安全」:一旦交易被包含在鏈上,它將永遠不會被回滾。另一方面,它們容易發生活性故障:如果節點無法達成一致——例如,如果超過三分之一的節點關閉或不可用——那麼就沒有交易可以被添加到鏈上,鏈將停止運行。
其他共識協議,如比特幣的中本聰共識,根本沒有任何最終確定性機制。總是存在有人呈現出一個更重的替代鏈的可能性。當這種情況發生時,所有誠實的節點必須相應地重組他們的鏈,回滾他們之前處理的任何交易。諸如你的區塊有多少確認之類的啟發式方法只是對最終確定性的近似值,而無法保證 [8]。
以太坊的共識層優先考慮活性,但也努力在有利的情況下以最終確定性的方式提供安全保證。這是試圖兩全其美的嘗試。Vitalik 這樣辯護 [9]:
一般原則是你想給予用戶「儘可能多的共識」:如果達成共識的節點 > 2/3,那麼我們就會得到常規的共識。但如果 < 2/3,那也不需要停下來什麼也不做,顯然,儘管新區塊的安全性暫時降低,鏈仍然可能繼續增長。如果個別應用不滿意較低的安全級別,它可以自由地忽略那些區塊,直到它們被最終確定。
在以太坊的共識層中,最終確定性是由 Casper FFG 機制提供的,我們很快就會探討這一機制。其原理是,所有誠實的驗證者定期就最近的檢查點區塊達成一致,他們永遠不會撤銷這些區塊。然後,該區塊及其所有祖先區塊就是「最終確定的」區塊——它們永遠不會改變,如果你向網絡中的任何誠實節點詢問它們或其祖先區塊的情況,你總會得到相同的答案。

以太坊的最終確定性是「經濟最終確定性」。理論上,協議可能會最終確定兩個相沖突的檢查點,即對鏈的歷史的兩個矛盾視圖。然而,這隻有在巨大且可量化的成本下才可能出現。除了最極端的攻擊或失敗情景外,最終確定就是最終確定。
Casper FFG 部分深入探討了這種最終確定性機制的工作原理。
另見
Leslie Lamport 參與的任何內容總是值得一讀,他與 Shostak 和 Pease 合著的 1982 年原始論文《拜占庭將軍問題》( The Byzantine Generals Problem)包含了許多洞見。雖然他們提出的算法在當今條件下已經效率極低,但該論文對推理一般共識協議是很好的引入。Castro 和 Liskov 在 1999 年發表的開創性論文《實用拜占庭容錯》(Practical Byzantine Fault Tolerance)也是如此,它對以太坊的 Casper FFG 協議的設計產生了重大影響。但是,你可能會想將這些「經典」方法與中本聰在 2008 年比特幣白皮書中描述的工作證明優雅的簡潔性相對比。如果說工作量證明有什麼優點的話,那就是它的簡潔。
上文中我們提到了 Gilbert 和 Lynch 在 2012 年的論文《CAP 定理的視角》(Perspectives on the CAP Theorem)。這篇論文對一致性和可用性(或我們語境中的安全性和有效性)概念進行了深入探討,有很強的可讀性。
由於分叉選擇規則的客戶端實現之間存在差異,以太坊信標鏈在 2022 年 5 月經歷了七個區塊的重組。這些差異在當時是眾所周知的,並且被認為是無害的。事實證明並非如此。巴納貝 - 蒙諾(Barnabé Monnot)對這一事件的描述非常有啟發性。
Vitalik 的博客文章《關於結算的最終確定性》(On Settlement Finality)提供了對最終確定性概念更深入、更細緻的探索。
對於我們正在構建的系統,我們的理想是它們是政治去中心化的(以實現無許可和抗審查),架構去中心化的(以實現無單點故障的抗逆力),但在邏輯上是中心化的(以實現一致的結果)。這些標準對我們如何設計共識協議有很大影響。Vitalik 在《去中心化的意義》(The Meaning of Decentralization)一文中探討了這些問題。
歡迎加入深潮 TechFlow 官方社群
Telegram 訂閱群:https://t.me/TechFlowDaily
Twitter 官方帳號:https://x.com/TechFlowPost
Twitter 英文帳號:https://x.com/BlockFlow_News














