第 15 章
共識
本書從頭到尾都在談共識規則:所有人都必須同意的規則,系統才能以去中心化、卻又確定性的方式運作。在電腦科學中,共識一詞的出現早於區塊鏈,它關係到分散式系統中同步狀態這個更廣泛的問題:如何讓分散式系統中的不同參與者(最終)都同意同一個全系統的狀態。這就叫做達成共識。
在去中心化的記錄保存與驗證這些核心功能上,單靠信任來確保從狀態更新得出的資訊正確無誤,可能會出問題。這個相當普遍的挑戰在去中心化網路中特別明顯,因為沒有一個中心化的實體來決定什麼才是真的。沒有中心化的決策實體,正是區塊鏈平台的主要吸引力之一,因為這帶來了抗審查的能力,取用資訊也不必仰賴權威的許可。然而,這些好處是有代價的:沒有受信任的仲裁者,任何分歧、欺騙或差異都必須用其他方式來調和。共識演算法就是用來兼顧安全與去中心化的機制。
在區塊鏈中,共識是系統的關鍵性質。簡單來說,這牽涉到真金白銀!所以在區塊鏈的脈絡下,共識指的是在維持去中心化的同時,能夠達成共同的狀態。換句話說,共識的目的是打造一個有嚴格規則、卻沒有統治者的系統。沒有任何一個人、組織或團體「說了算」;權力與控制分散在廣大的參與者網路中,而遵守規則、誠實行事正符合這些參與者的自身利益。
在敵對的條件下,跨越分散式網路達成共識、又不讓控制權集中,是所有開放的公共區塊鏈的核心原則。為了因應這個挑戰並維持去中心化這項寶貴的性質,社群持續實驗各種不同的共識模型。本章探討這些共識模型,以及它們對以太坊這類智能合約區塊鏈預期的影響。
|
備註
|
雖然共識演算法是區塊鏈運作的重要一環,它們卻運作在基礎層,遠低於智能合約這層抽象。換句話說,共識的大部分細節對智能合約的撰寫者都是隱藏的。就像使用網際網路不需要知道路由怎麼運作一樣,使用以太坊也不需要知道共識演算法怎麼運作。 |
15.1. 共識的原則
在區塊鏈技術中,特別是在以太坊裡,理解共識的原則能幫助我們弄懂網路如何維持完整性並有效運作。為了更清楚地掌握整體的運作方式,我們來逐一看看這些核心概念。
15.1.1. 安全性
在共識機制的脈絡下,安全性(safety)指的是確保網路始終正確無誤地對區塊鏈目前的狀態達成一致。這表示要避免 雙重支付(double spending)與交易衝突這類問題,在整個網路中維持一致性。在一個具備安全性的系統中,每個節點對鏈的歷史都有完全相同的看法,實際上就像一個一次一個、以不可分割的方式執行操作的中心化實作。
15.1.2. 最終性
最終性是以太坊共識機制中最重要的安全性特性之一。它標示出交易被視為已完成、不可逆轉的時間點,確保交易一旦加入區塊鏈,就無法再被更改或移除。交易的這種不可逆性讓人對系統有高度的信任,讓使用者確信自己的交易已經被永久記錄下來。
基本上,最終性把安全性的想法付諸實行,讓它從單純的概念變成實際可用的東西。它確保即使網路的不同部分可能各有自己的局部看法,仍然存在一個無法撤回的共識點,讓鏈的歷史固定下來、無法更改。
15.1.3. 活性
安全性確保網路上不會發生壞事,而 活性(liveness)則保證好事最終總會發生。換句話說,無論發生什麼事,以太坊網路都會繼續處理交易、加入新的區塊。
從另一個角度來看,活性也可以從可用性的角度來理解。實際上,這表示只要我們把一筆有效的交易提交給網路中誠實運作的節點,就可以預期這筆交易會被包含在接下來的某個區塊中,讓區塊鏈繼續延伸下去。這種交易會被收錄、處理的預期,對於贏得使用者的信任以及以太坊平台的整體效用都是必要的。
15.1.4. 區塊樹與分叉
要設計出一個在任何情況下都同時具備安全性與活性的共識協議是不可能的,你必須在兩者之間有所偏重。雖然以太坊的共識協議在網路狀況良好時同時提供安全性與活性,但在情況混亂時,它會優先確保活性。它是透過分叉這個概念做到的。
在區塊鏈中,每個區塊(特殊的創世區塊除外)都建立在一個父區塊之上,並指向它。因此,我們最後得到一條由區塊組成的鏈:區塊鏈。在採用會分叉的共識協議的鏈上,實際情況往往不是這樣的線性結構:在真實世界的條件下,我們最後得到的可能更像一棵區塊樹(block tree),而不是一條區塊鏈,如圖 15-1 所示;而共識協議的目標,就是讓網路上的所有節點對同一個線性的區塊序列達成一致。

區塊樹中的各個分支稱為分叉。分叉會因為網路與處理的延遲、客戶端故障或惡意的客戶端行為而自然發生。
如果我們去詢問跟隨不同分叉的節點,它們對系統的狀態會給出不同的答案。這正是會分叉的共識協議的韌性所在:在不利的條件下,它們不會完全停擺,而是分叉。最終,我們希望網路上每個正確的節點都對歷史有完全相同的線性看法,進而對系統的狀態有共同的看法。促成這種一致正是協議的分叉選擇規則的職責:給定一棵區塊樹和一些決策準則,分叉選擇規則的設計目的,是從所有可用的分支中,選出最有可能最終進入那條最終的、線性的主鏈(canonical chain)的分支。會分叉的協議的缺點是,跟隨的分支最後沒有成為主鏈的節點,最終必須倒轉它們對現實的看法,撤銷最近處理過的所有交易,才能回到正確的分支上。這稱為鏈重組(reorg)或 回復(reversion),會造成干擾,所以協議都盡可能把它減到最少。
現在我們就能理解以太坊共識協議中最終性的威力了:分叉是達成活性的強大手段,但為了讓網路能夠使用,這種彈性必須用一些安全性保證來平衡。
15.2. 透過工作量證明達成共識
第一個區塊鏈比特幣的創造者,發明了一種基於工作量證明(proof of work,PoW)的共識演算法。工作量證明可以說是支撐比特幣最重要的發明。工作量證明的通俗說法是挖礦,這造成了對共識主要目的的誤解。人們常常以為挖礦的目的是創造新的貨幣,因為現實世界中採礦的目的是開採貴金屬或其他資源。其實,挖礦(以及所有其他共識模型)真正的目的,是在保護區塊鏈的同時,讓系統的控制權保持去中心化,並分散到盡可能多的參與者手中。新鑄造貨幣的獎勵,是給那些為系統安全做出貢獻的人的誘因:是達成目的的手段。從這個意義來說,獎勵是手段,去中心化的安全才是目的。
在工作量證明共識中,也有相應的「懲罰」,那就是參與挖礦所需的能源成本。這種可觀的能源消耗並不是缺陷,而是刻意設計的安全與誘因機制的關鍵。如果參與者不遵守規則、拿不到獎勵,他們就可能白白損失已經花在挖礦電費上的資金。因此,工作量證明共識是風險與報酬之間的精心平衡,驅使參與者出於自身利益而誠實行事。
以太坊一開始是仿效比特幣的工作量證明區塊鏈:它使用工作量證明演算法,搭配同樣基本的誘因系統,追求同樣的基本目標:在保護區塊鏈的同時讓控制權去中心化。以太坊的工作量證明演算法與比特幣的略有不同,稱為 Ethash。
15.2.1. Ethash:以太坊的工作量證明演算法
在以太坊轉換到權益證明(proof of stake,PoS)之前,它仰賴一種名為 Ethash 的工作量證明演算法。Ethash 使用的是 Dagger-Hashimoto 演算法的演進版本,而 Dagger-Hashimoto 結合了 Vitalik Buterin 的 Dagger 演算法與 Thaddeus Dryja 的 Hashimoto 演算法。Ethash 仰賴一個大型資料集的產生與分析,這個資料集稱為有向無環圖(directed acyclic graph,或更簡單地稱為「the DAG」)。DAG 的初始大小約為 1 GB,之後持續緩慢地線性成長,每個 epoch(30,000 個區塊,大約 125 小時)更新一次。
DAG 的目的,是讓 Ethash 工作量證明演算法必須維護一個大型、經常存取的資料結構。這進而是為了讓 Ethash 具有抗 ASIC 的特性,也就是說,要製造出比高速 GPU 快上好幾個數量級的特定應用積體電路(application-specific integrated circuit,ASIC)挖礦設備會更加困難。以太坊的創辦人希望避免工作量證明挖礦的中心化:那些能使用專門晶圓廠、擁有龐大預算的人,可能會主宰挖礦基礎設施,進而破壞共識演算法的安全。
用消費級的 GPU 在以太坊網路上執行工作量證明,代表全世界有更多人能參與挖礦。獨立礦工的數量越多,算力就越去中心化,也就能避免像比特幣那樣,大部分算力集中在少數大型工業化挖礦業者手中的情況。用 GPU 挖礦的缺點是,它在 2017 年引發了全球性的 GPU 短缺,導致 GPU 價格飆漲,也招致遊戲玩家的強烈抗議。這使得零售商開始限購,每位顧客只能買一到兩張 GPU。
直到 2017 年,以太坊網路上的 ASIC 礦機威脅大致上還不存在。要在以太坊上使用 ASIC,需要設計、製造並配送高度客製化的硬體。生產這些硬體需要投入可觀的時間與金錢。以太坊開發者長期以來表明要轉換到權益證明共識演算法的計畫(如今已經實現),很可能讓 ASIC 供應商長期沒有把以太坊網路當成目標。
15.3. 透過權益證明達成共識
從歷史上來看,工作量證明並不是第一個被提出的共識演算法。在它之前,許多研究者探索過以財務或聲譽作為擔保的想法。更早之前,最早的一些共識模型是需要許可的:驗證者是依據權威或身分選出的,而不是透過公開競爭。例如,實用拜占庭容錯(practical Byzantine fault tolerance,PBFT)需要一組固定或經過挑選的驗證者,這種模型至今仍是許多傳統分散式系統的基礎。
基於工作量證明的共識最大的突破之一,是讓參與變成無需許可:任何擁有運算能力的人都能做出貢獻並獲得獎勵,不需要經過核准才能加入。這對去中心化是一大勝利。從某種意義上來說,工作量證明是作為較封閉模型的無需許可替代方案而發明的。
在比特幣成功之後,許多區塊鏈都採用了工作量證明。但共識研究的爆發重新點燃了大家對權益證明的興趣,也帶來了重大的進展。以太坊的創辦人從一開始就希望最終能遷移到權益證明。事實上,以太坊最初的工作量證明鏈內建了一個障礙,也就是所謂的 難度炸彈(difficulty bomb),它的設計是隨著時間慢慢讓挖礦變得更困難,迫使系統走向最終的轉換。以太坊版本的權益證明雖然是無需許可的,在概念上卻有一部分源自早期以權威為基礎的系統:在這裡,身分與參與資格來自於投入質押。不過,既然任何擁有 ETH 的人都能這麼做,它仍保有中本聰設計中開放參與的精神。
一般來說,權益證明演算法是這樣運作的:區塊鏈會追蹤一組驗證者,任何持有該區塊鏈基礎加密貨幣的人——以以太坊來說就是以太幣(ether)——都可以送出一種特殊類型的交易,把自己的以太幣鎖進存款,成為驗證者。驗證者輪流提議下一個有效區塊並對它投票,每個驗證者的投票權重取決於其存款(也就是質押)的多寡。驗證者正確參與協議時,會獲得與其質押成正比的小額獎勵。如果他們犯錯,例如發布不正確或延遲的見證投票(attestation),可能會受到小額懲罰,大致與獎勵的規模相當。但還有一種嚴重得多的後果,稱為罰沒(slashing),只有在驗證者可被證明有惡意時才會發生,例如發布互相衝突的見證投票,或是 重複提議的區塊(equivocating block)。因此,權益證明透過獎懲制度,迫使驗證者誠實行事並遵守共識規則。權益證明與工作量證明的主要差異在於,權益證明的懲罰是區塊鏈內在的(例如損失質押的以太幣),而工作量證明的懲罰則是外在的(例如損失花在電費上的資金)。
以太坊從 2015 年推出起,就打算轉換到權益證明共識協議。朝這個方向邁出的第一個具體步驟,是 2020 年 12 月 1 日信標鏈(Beacon Chain)的推出。一開始,信標鏈是一條空的區塊鏈,讓所有人都能把 32 ETH 存進一個特定的存款合約(deposit contract)來成為驗證者,而它只處理驗證者及其各自餘額的內部共識。當時,以太坊區塊鏈仍使用 Ethash 作為共識協議。
2022 年 9 月 15 日,合併(The Merge)硬分叉發生,信標鏈帶著自己的驗證者集合,把它基於權益證明的共識協議延伸到以太坊主區塊鏈上,實際上終結了 Ethash 的使用。然而,仍有一些限制,包括驗證者無法提領資金、離開驗證者集合。這些問題在 2023 年 4 月 12 日的 Shapella 升級中完全解決,完成了以太坊從工作量證明轉換到權益證明共識協議的工作。
以太坊使用的權益證明共識協議稱為 Gasper。在接下來的幾節中,我們會從基本術語開始,再進一步到分叉選擇規則(LMD-GHOST)與最終性元件(finality gadget)(Casper FFG),探討它是如何運作的。最後,我們會用一個範例來釐清前面討論過的理論概念。
15.4. 權益證明的術語
在這一節,我們會把重點放在以太坊權益證明共識的組成部分與術語上。
15.4.1. 節點與驗證者
節點是以太坊網路的骨幹。它們彼此通訊,負責驗證是否遵守共識。驗證者負責提議新區塊並對它們投票,它們附屬於這些節點;但和名稱可能暗示的不同,驗證者其實並不親自驗證區塊。檢查區塊與交易是否遵守協議規則的,是節點軟體。一個節點可以承載多個驗證者,而驗證者的職責是透過同時執行一個執行層客戶端與一個共識層客戶端來完成的。我們會在接下來幾節中看到這些職責究竟是什麼。
權益證明有一個值得記住的特殊性質:活躍驗證者的集合是已知的。這將是達成最終性的關鍵,因為我們能辨識出何時已經取得參與者的多數票。
15.4.2. 區塊與見證投票
嚴格的時間管理是以太坊權益證明的一項重要性質。權益證明中的兩個關鍵時間單位是 slot(恰好 12 秒)與 epoch(橫跨 32 個 slot)。
每個 slot 都恰好選出一個驗證者來提議區塊。在每個 epoch 中,每個驗證者都恰好有一次機會以見證投票的形式分享它對世界的看法。見證投票包含兩種投票:對鏈頭(head of the chain)的投票,供 LMD-GHOST 協議使用;以及對檢查點的投票,供 Casper FFG 協議使用,其中 FFG 代表「Friendly 最終性元件」。分享見證投票很耗頻寬,所以它被分散到每個 epoch 之中,而不是每個區塊都進行,以分攤必要的工作量,讓負擔維持在可控的範圍內。
協議透過對驗證者的獎懲制度,激勵他們產生區塊與見證投票並確保其正確性,但它也容許空的 slot 和缺漏的見證投票;這些情況可能出於自然的原因(例如某個節點離線了),也可能出於追求利潤的原因。我們會在後面的「時機賽局」一節詳細說明。
15.5. LMD-GHOST
LMD-GHOST 是以太坊共識協議的主要部分:它是分叉選擇規則的演算法。它選出節點在自己對區塊鏈的局部看法中,應該視為有效的最新區塊。這個區塊也稱為 鏈頭。
要完全理解它如何運作,你必須先知道以太坊權益證明協議的一些基本概念。在傳統的基於工作量證明的共識協議中,負責建立新區塊並把它們加到鏈上的實體(也就是礦工)不需要符合任何特殊的要求。只要他們發布的區塊滿足工作量證明,就會被整個網路接受。在以太坊基於權益證明的共識協議中,驗證者必須質押一大筆 ETH 作為擔保(目前至少 32 ETH),才能進入驗證者集合。
如同我們先前簡單提過的,驗證者有兩項主要職責:
提議區塊
每個 slot 都會以偽隨機的方式選出一個驗證者,建立並提議鏈上的下一個區塊。
產生見證投票
每個 slot 都會選出一部分驗證者,發布他們的投票,投給他們認為最適合作為鏈頭的區塊。這個投票接著會以見證投票的形式分享給每個驗證者。
當驗證者在見證投票中投給某個區塊時,它其實是在給這個區塊一個分數。這個分數恰好等於驗證者發布見證投票時所質押的 ETH 數量。但不只如此:這一票不只是投給那個區塊,也同時投給了與所選區塊位於同一分叉上的所有祖先區塊,如圖 15-2 所示。

你可以說,投給一個區塊的票會往回傳遞給它的所有祖先。為了讓這個概念更清楚,我們可以為所有分支指定分數。分支是連接一個區塊與其父區塊的連結,如圖 15-3 所示。

我們把一個分支的分數,定義為作為該分支根部的區塊(圖 15-3 中的區塊 B)的分數,加上它所有直接後代分支的分數。
圖 15-4 是一條由區塊組成的鏈,其中每個區塊的分數都是 1。連接 E 與 D 的分支,分數恰好等於區塊 E 的分數,因為它沒有後代區塊。要計算分支 D→C 的分數,你需要把區塊 D 的分數加上所有後代分支的分數。在這個例子中只有一個後代分支:分支 E→D。所以分數是 1(區塊 D 的分數)+ 1(分支 E→D 的分數)= 2。接著是分支 C→B:它的分數是 1(區塊 C 的分數)+ 2(分支 D→C 的分數)= 3。這裡有一個帶著區塊 C′ 的小分叉,我們需要為分支 C′→B 指定分數。它的分數就是 1(區塊 C′ 的分數),因為區塊 C′ 沒有直接後代。最後是分支 B→A;要計算它的分數,需要加總 1(區塊 B 的分數)+ 1(分支 C′→B 的分數)+ 3(分支 C→B 的分數)= 5。

圖 15-5 是一個更複雜的情境,其中有好幾個分叉,每個區塊的分數也各不相同。看看這張圖,確認你了解每個分支的分數是怎麼算出來的。

看完上一個例子,應該就很清楚:一個區塊的分數不只影響那個區塊本身,也會影響它所有的祖先,因為分數會往回傳遞給之前所有的分支。這背後的想法是:如果一個驗證者(以見證投票的形式)投票支持某個區塊成為鏈頭,它也就認定這個區塊所有的祖先都是有效的,而且屬於正確的鏈。
現在,我們終於可以深入探討 LMD-GHOST 實際上如何運作,以及它如何選出要被視為鏈頭的區塊。我們先從它的名字開始分析。LMD-GHOST 由兩個縮寫組成:latest message driven(最新訊息驅動)與 greediest heaviest observed subtree(最貪婪的最重觀察子樹)。
15.5.1. Latest Message Driven
要為每個區塊與分支指定分數,你只需要考慮每個驗證者最近的那一次見證投票。也就是說,如果你從驗證者 V 收到兩次見證投票,不必把它們算兩次;你需要檢查哪一次是最新的,並捨棄另一次。
圖 15-6 是一個驗證者在區塊 B 發布見證投票的情形,它在其中表示自己認為區塊 B 是鏈頭。之後,在區塊 F 的時候,這個驗證者再次被選中發布新的見證投票,在其中表示偏好以區塊 F 作為新的鏈頭。當這個驗證者在區塊 F 發布新的見證投票時,其他驗證者需要捨棄舊的那一次(在區塊 B 時發布的),只考慮最新的那一次。

15.5.2. Greediest Heaviest Observed Subtree
GHOST 是分叉選擇規則的關鍵。head 區塊是得票最高的分叉中,沒有任何後代的那個區塊。
我們實際操作一遍,好更清楚地理解 LMD-GHOST 在真實情境中如何運作。圖 15-7 呈現的是我們先前用過的同一個情境。

LMD-GHOST 一律從一個被視為已最終確定鏈的一部分的初始區塊開始。一開始,這個區塊是創世區塊;但在完整的基於權益證明的以太坊共識協議中,它會持續更新為最新的已合理化(justified)檢查點區塊,這個術語我們會在「Casper FFG:最終性元件」一節探討。如果你還不知道什麼是已合理化的檢查點,也沒關係;你只需要知道永遠會有一個起始區塊。
在這個例子中,區塊 A 是初始區塊。假設我們是一個需要發出見證投票,或是被選中提議下一個區塊的驗證者。我們需要執行 LMD-GHOST 才能知道哪個區塊是鏈頭,這樣才能據此發布見證投票,或是把下一個區塊建立在正確的前一個 head 區塊之上。我們已經收集了其他驗證者到目前為止的見證投票,並依照協議的 LMD 規則,每個驗證者只考慮最近的那一次。所以我們已經有所有區塊的分數,也就是每個驗證者給予各區塊的分數總和。
這時,LMD-GHOST 分兩個步驟運作:
-
它為所有分支指定分數,方法和我們前面說明的一樣:把每個區塊的分數往回傳遞給之前所有的分支。圖 15-8 顯示了所有分支最後的分數。

-
接著,從初始區塊開始,協議中 GHOST 的部分會貪婪地一路選擇分數最高的分支,直到抵達一個沒有後代的區塊。這就是 LMD-GHOST 分叉選擇規則所回傳的 head 區塊。
我們在範例中一步一步看它如何執行。LMD-GHOST 從初始區塊 A 開始,因為沒有其他分支可選,它立刻沿著分支 B→A 走到區塊 B,如圖 15-9 所示。

現在,有兩個分支可以選擇:
-
分支 C→B,分數為 8
-
分支 D→B,分數為 6
GHOST 貪婪地選擇分支 C→B,因為它的分數最高,如圖 15-10 所示。請注意,區塊 D 的分數比區塊 C 高並不重要,因為 LMD-GHOST 考慮的不是單一區塊的分數,而是該區塊所在的整個分叉的分數。

現在又有兩個不同的分支可以選擇:
-
分支 E→C,分數為 4
-
分支 F→C,分數為 3
GHOST 選擇分支 E→C,如圖 15-11 所示。

這時只剩一個分支可以選擇,也就是分支 H→E,所以 GHOST 就選擇它,如圖 15-12 所示。

區塊 H 沒有後代。LMD-GHOST 停下來,並把它回傳作為鏈新的 head 區塊。
15.5.3. 誘因
LMD-GHOST 為嚴格遵守規則的驗證者提供了各種明確的誘因,並懲罰惡意行事的驗證者。在這一節,我們會探討它如何防止惡意行為者破壞規則,並獎勵善意的參與者。
驗證者需要履行兩項不同的職責:
-
提議區塊
-
產生見證投票
針對每一項職責,LMD-GHOST 都有好幾種方式確保每個人都依規則行事。
提議區塊
當驗證者被選中向鏈提議新區塊時,它只能建立單一個有效的區塊。這麼做,驗證者就能賺到它所建立區塊中所有交易的優先費用總和,外加一些新鑄造的 ETH,如圖 15-13 所示。

如果驗證者試圖作弊,建立不只一個區塊,協議就會明確地懲罰它,罰沒它一部分的質押。事實上,要成為驗證者集合的一員,你必須質押一些 ETH 作為擔保(至少 32 ETH)。這筆質押(也)是必要的,協議才能透過罰沒來懲罰你,也就是從中扣除一些 ETH,如圖 15-14 所示。

|
備註
|
值得注意的是,明確的懲罰是以太坊權益證明共識協議與比特幣工作量證明之間的一大差異。比特幣礦工的區塊如果成為最重鏈的一部分,就會獲得獎勵。如果他們為同一個區塊高度建立了不只一個區塊,並不會受到任何明確的懲罰。 你可能會好奇為什麼。這是因為基於工作量證明的系統需要付出一些工作(也就是工作量證明本身)才能建立有效的區塊。如果礦工建立了不只一個區塊,他們只是在浪費時間和金錢,因為最終只會有一個區塊留在最重鏈上,所以他們也只會因為其中一個區塊獲得獎勵。 以太坊的權益證明協議不需要驗證者執行工作量證明來建立有效的區塊。這表示對驗證者來說,建立不只一個區塊幾乎不需要成本。這就是為什麼我們需要明確地懲罰任何試圖以這種方式作弊的人。 |
15.6. Casper FFG:最終性元件
Casper FFG 是一種元共識(metaconsensus)協議。它是一個疊加層,可以在底層的共識協議之上執行,為底層協議加上最終性。
在以太坊的權益證明共識中,底層協議是 LMD-GHOST,而它並不提供最終性。最終性確保區塊一旦在鏈上被確認,就無法被逆轉:它們會永遠是鏈的一部分。所以本質上,Casper FFG 的功能就是一個最終性元件,我們用它來為 LMD-GHOST 加上最終性。
Casper FFG 利用了權益證明協議中的一個事實:我們知道參與者是誰,也就是管理質押以太幣的驗證者。這表示我們可以用計票來判斷何時已經看到誠實驗證者的多數票,或者更精確地說,看到管理多數質押的驗證者的投票。在接下來的所有內容中,每個驗證者的投票都依其管理的質押價值加權,但為了簡單起見,我們不會每次都明講這一點。
Casper FFG 和所有傳統的 拜占庭容錯(Byzantine fault tolerant,BFT)協議一樣,只要出錯或懷有敵意的驗證者少於三分之一,就能確保最終性。一旦誠實驗證者的多數宣告某個區塊為最終的,所有誠實驗證者都會同意,讓這個區塊無法逆轉。藉由要求誠實驗證者占總數的三分之二以上,系統確保共識準確反映誠實多數的看法。值得注意的是,Casper FFG 與傳統 BFT 協議不同的地方在於,即使超過三分之一的驗證者遭到攻破,它仍提供經濟最終性(economic finality)(更多細節請見「可究責的安全性與合理的活性」一節)。
15.6.1. Epoch 與檢查點
Casper FFG 透過要求在一個 epoch 內取得超過三分之二驗證者的投票來確保共識,並把投票分散到 32 個 slot 中,以有效率地管理龐大的驗證者集合,如圖 15-17 所示。一個 epoch 分成 32 個 slot,每個 slot 通常包含一個區塊。epoch 的第一個 slot 就是它的檢查點。

驗證者每個 epoch 對檢查點(也就是第一個 slot)投票一次,以維持統一的投票焦點。為了效率,這個過程同時包含 Casper FFG 與 LMD-GHOST 的投票;在 Casper FFG 的脈絡下,它的目標是讓檢查點最終確定,而不是整個 epoch,也就是說,最終性涵蓋的是檢查點以及它之前的內容。
15.6.2. 合理化與最終確定
Casper FFG 和傳統的 BFT 協議一樣,分兩個階段確保網路達成一致。首先,驗證者廣播並收集對某個提議檢查點的看法。如果有顯著的多數同意,這個檢查點就已合理化,代表初步的一致。在接下來的一輪中,如果驗證者確認已合理化的檢查點獲得廣泛支持,它就達到最終確定,表示它已獲得一致同意且無法逆轉。這個過程突顯出確保網路一致性與安全的協作努力,目標是讓檢查點在特定的時間範圍內先被合理化、再被最終確定,從而提升共識機制的可靠性。
來源與目標、連結與衝突
在 Casper FFG 中,投票由來源(source)檢查點與目標(target)檢查點組成,代表驗證者在不同時間點對區塊鏈狀態的承諾。這些投票以一組連結的形式投出,表示驗證者目前的共識點與提議的共識點。來源投票反映驗證者認可某個檢查點已獲得廣泛支持,而目標投票則代表對一個新檢查點的有條件承諾,取決於其他人是否也給予類似的支持。這種雙重投票的制度有助於有條理地逐步最終確定區塊,確保網路的完整性與連續性。
絕對多數連結
在 Casper FFG 中,當超過三分之二的驗證者(依質押權重計算)都支持同一個連結,而且他們的投票都已收錄在區塊鏈中時,來源檢查點與目標檢查點之間就建立了一個 絕對多數連結(supermajority link),記為 s→t。這個機制透過驗證者的廣泛同意來確認檢查點的順序,藉此確保共識與安全。
15.6.3. 罰沒
Casper FFG 實作了一套罰沒機制,懲罰違反協議規則的驗證者,目的是確保網路的共識。這種強制手段能遏止原本可能破壞區塊鏈完整性的行為,例如讓互相衝突的檢查點最終確定。偵測這些違規行為,特別是像環繞投票(surround vote)這類複雜的情境(請見「分叉選擇規則」一節)[44],由於技術上的挑戰,可能需要仰賴專門的外部服務。罰沒的後果與不當行為的嚴重程度以及網路整體的健康狀況成正比,懲罰會依特定時間範圍內的集體行為而增減,以確保驗證者的行為公平且可究責。
15.6.4. 分叉選擇規則
Casper FFG 修改了傳統的 LMD-GHOST 分叉選擇規則,要求節點優先選擇擁有最高已合理化檢查點的鏈;這個檢查點實際上就成為 LMD-GHOST 協議的起始區塊。這項調整是從 LMD-GHOST 協議原本的做法演進而來,藉由承諾遵守經絕對多數(supermajority)驗證者同意的檢查點,確保網路達到最終性。它實際上保證了檢查點一旦被合理化,網路就無法回復到它之前,從而強化區塊鏈的安全與穩定。這條規則的設計也是為了維持網路的活性,符合 Casper 的根本目標。
15.6.5. Casper 戒律
在 Casper FFG 中,檢查點是確保網路共識與安全的核心。檢查點以 epoch 編號標記,這個編號隨著區塊鏈的推進而遞增。驗證者必須遵守嚴格的投票規則:他們不能對同一個檢查點投下不同的結果,也就是不能雙重投票(double vote),如圖 15-20 所示。如果沒有這條投票規則,鏈重組會更容易發生,讓鏈變得非常不穩定。

驗證者也必須避免投出可能被解讀為與先前承諾相矛盾的票(不能環繞投票)。違反這些原則會導致罰沒,這種懲罰的目的是維持共識機制的完整性與可究責性,如圖 15-21 所示。

15.6.6. 可究責的安全性與合理的活性
Casper FFG 共識協議提供兩項保證,它們類似於傳統共識中安全性與活性的概念,但又有所不同:可究責的安全性(accountable safety)與 合理的活性(plausible liveness)。
可究責的安全性與經濟最終性
Casper FFG 對可究責的安全性的證明顯示,除非超過三分之一的驗證者違反協議規則,否則互相衝突的檢查點不可能都被最終確定。這套系統確保在懷有敵意的驗證者少於三分之一時,被最終確定的檢查點無法逆轉,同時落實網路安全與對不誠實行為的經濟懲罰。
Casper FFG 的經濟最終性為潛在的攻擊者帶來成本,不只透過協議規則,也透過經濟上的反誘因來確保安全。試圖讓互相衝突的檢查點最終確定、藉此破壞網路的驗證者,會面臨嚴厲的懲罰,損失很大一部分的質押。這種做法與傳統共識機制不同,它多加了一層經濟後果,確保讓區塊最終確定這件事對惡意行為者來說代價高昂,從而提升區塊鏈的完整性與抵禦攻擊的韌性。
15.7. 實際範例:檢查點的生命週期
我們一起走一趟以太坊 Casper FFG 機制中檢查點的生命週期。
以太坊驗證者的社群可能極為龐大,參與者可能多達數十萬。要一次處理所有這些投票並不實際。那麼我們要怎麼處理呢?
投票會分散到我們所說的 epoch 中,而一個 epoch 分成 32 個 slot,每個 slot 為時 12 秒。如此一來,每個驗證者每個 epoch 恰好投票一次,每個 slot 大約有 1/32 的驗證者集合在投票。圖 15-22 是這樣一群驗證者。

在這個例子中,驗證者的數量當然比真實的以太坊網路少得多,但我們確實有 64 個節點,分成 32 組。每一組會在 epoch 中的一個 slot 投票,如圖 15-23 所示。

那麼,他們在對什麼投票呢?他們對一個檢查點投票,具體來說,就是 epoch 的第一個 slot。[45]這個檢查點是在不同時間投票的驗證者共同的目標。
|
備註
|
這裡有一點必須釐清:雖然我們常說讓 epoch 最終確定,但從技術上來說,我們最終確定的其實是檢查點,也就是這些第一個 slot。檢查點一旦被最終確定,直到該 slot 為止(包括該 slot)的一切都已塵埃落定,安全且無法更改。 |
圖 15-24 呈現了一個 epoch,在這裡是 epoch N。檢查點 N 是 slot 32N;一旦這個檢查點被最終確定,slot 32N-1 以及之前的每一個 slot 都會被視為已最終確定。

達成這種安全性的過程相當嚴謹,類似傳統的 BFT 共識機制。在接下來的幾節中,我們會說明它如何運作。
15.7.1. 第一輪:合理化
每個驗證者向網路廣播自己對目前 epoch 檢查點的看法。接著,他們會聆聽網路中是否有絕對多數認同他們的看法。如果有,這個檢查點就被「合理化」了。在這個階段,驗證者相信網路中的多數支持這個檢查點進入最終確定,但他們還不能完全確定每個人都同意。
關鍵問題在於,驗證者還無法確定網路上的惡意行為者沒有提供他們關於網路狀態的假資訊,也就是對他們說一套、對其他人說另一套。這一點非常重要,卻常常被忽略。如果所有參與者永遠都是誠實的,合理化就等於最終確定,整個兩輪的過程也就可以省略了。
當驗證者把一個檢查點合理化時,代表它已經收到網路中三分之二的驗證者對該檢查點的認可,如圖 15-25 所示,但這第一輪的認可只是驗證者自己局部的看法。有可能(特別是在敵對的條件下)並沒有足夠的驗證者達成共識。傳統 PBFT 式的共識機制,例如 Algorand、Dfinity 與 Cosmos 所使用的,會在這個階段停擺,失去活性。相反地,以太坊會繼續前進。如果無法把某個檢查點合理化,沒關係,它只會繼續往下,嘗試把下一個檢查點合理化。之所以可行,是因為以太坊仰賴 LMD-GHOST 來確保活性,而 Casper FFG 只是一個疊加層,是「有了更好」的東西。所以就算最終性暫時停滯,也不是什麼嚴重的問題。

15.7.2. 第二輪:最終確定
驗證者宣布,他們已經聽到絕對多數表示也支持這個檢查點。他們會再次檢查網路的其他部分是否確認這個絕對多數確實存在。如果是,驗證者就能把這個檢查點「最終確定」,如圖 15-26 所示。最終確定是很有力的一步:它表示沒有任何誠實的驗證者會逆轉這個檢查點。他們在自己的局部看法中也許還沒有把它標記為已最終確定,但至少已經把它標記為已合理化,而不採取會受懲罰的行為,就無法逆轉它。

實際上,理想情況下每一輪各花一個 epoch,也就是說,把一個檢查點合理化需要一個 epoch,再把它最終確定又需要一個 epoch,總共大約 12.8 分鐘。不過,多虧 Casper FFG 的管線化設計,我們每 6.4 分鐘就能讓一個檢查點最終確定,也就是每個 epoch 一次。
|
備註
|
另外值得一提的是,從外部的觀點來看,由於投票會隨著 epoch 的進行而逐步累積,在沒有重大鏈重組的前提下,我們可能在 12.8 分鐘結束之前,就看到某個檢查點很可能會被最終確定的跡象。不過,協議內正式的合理化與最終確定動作,只會在 epoch 結束時才發生。 |
在檢查點的合理化與最終確定過程中,有很多地方可能出錯。我們來分析兩個重要的情況,以及這個 friendly 最終性元件如何處理它們。
15.7.3. 互相衝突的合理化
想想為什麼檢查點需要「已合理化」與「已最終確定」兩種狀態,會很有啟發性。為什麼不能在絕對多數(三分之二)投票贊成某個檢查點之後,就立刻把它最終確定?
差別在於:合理化關乎局部的一致,而最終性關乎全域的共識。
把一個檢查點合理化,表示我身為驗證者,已經收到三分之二的驗證者確認他們認可這個檢查點。然而,這份認可只代表我局部的觀點。其他驗證者有可能掌握不同的資訊,我無法確定。儘管有這種不確定性,身為誠實的驗證者,我承諾永遠不會逆轉任何我根據自己的局部資料合理化的檢查點。
另一方面,把一個檢查點最終確定則更進一步。它發生在我收到三分之二的驗證者保證,他們也都聽到三分之二的其他驗證者確認了這個檢查點的有效性。這表示網路中的絕對多數(而不只是我局部的看法)都認可並承諾這個檢查點。正是這種廣泛的共識,保護這個檢查點不會在全域被逆轉。因此,已最終確定的檢查點不只是在局部被認可,而是在全域都受到保障。
我們來探討一個極端的情境,以便更了解共識的過程。假設我們有四個驗證者 A、B、C 和 D,如圖 15-27 所示。他們全都是誠實的,但他們所處的網路可能出現無限期的延遲。為了這個例子,假設每個區塊高度都有一個檢查點。

情境中的每個驗證者都有區塊 0,因此都能把檢查點 0 合理化;所以對四個驗證者來說,0 是來源,在局部已合理化,而 1 是目標(請見「來源與目標、連結與衝突」一節)。
現在,假設 A 的網路連線嚴重延遲,而它又剛好被選中提議區塊。A 在 epoch 2 提議了一個區塊。這個區塊包含把檢查點 1 合理化所需的全部四票,但由於 A 的網路連線嚴重延遲,其他驗證者從來沒有看到這個區塊。
A 擁有來源 0 與目標 1 之間的絕對多數連結(請見「絕對多數連結」一節),所以它會把檢查點 0 最終確定,並把檢查點 1 合理化。同時,B、C 和 D 在目前的 epoch 中沒有看到任何投票,所以他們仍然只有已合理化的檢查點 0。他們在這個 epoch 也會投給一個空的檢查點,也就是檢查點 X,如圖 15-28 所示。

在 epoch 3,B、C 和 D 之中的一個驗證者被選中提議區塊。
這個區塊包含三張以檢查點 0 為來源、檢查點 X 為目標的投票;因此,0 與 X 之間有一個絕對多數連結,讓驗證者 B、C 和 D 把檢查點 0 視為已最終確定,把檢查點 X 視為已合理化,如圖 15-29 所示。另一方面,A 認為這個區塊無效,因為在它的局部看法中,1 已經合理化,不能被回復。驗證者 A 的鏈要繼續下去,唯一的辦法是刪除它的記憶,並與網路的其他部分重新同步。

|
備註
|
請務必記得,在這個例子中,驗證者 B、C 和 D 從來沒有看到 A 提議的區塊。由於他們沒有觀察到區塊 2,也就是本來會讓檢查點 1 被合理化的那個區塊,他們無法對區塊 1 達成一致,也就無法把檢查點 1 合理化。結果,他們改投給一個空的檢查點。 |
這個例子顯示,即使只是簡單的網路延遲,也可能讓節點對合理化與最終確定有不同的看法。不過,光是這一點並不足以說明為什麼需要兩個不同的階段:先合理化,再最終確定。需要兩個階段的理由非常直接:如果沒有合理化這一步,A 就會把檢查點 1 最終確定,而其他驗證者會認為它無效,如圖 15-30 所示。

在前面的例子中,A 必須刪除它的記憶,並與網路的其他部分重新同步。這是因為如同我們先前所說,合理化類似一個局部的步驟,是可以被回復的。然而,如果 A 直接把檢查點 1 最終確定,這就不可能做到了。如果沒有這兩個階段,A 就會有一個已最終確定的區塊被回復,而 B、C 和 D 就能在不被罰沒的情況下,讓區塊 1 成為孤立的區塊。保證安全性的唯一方法,是採用雙向提交(two-way commit):合理化與最終確定。
15.8. Gasper:真實的例子
到目前為止,我們已經看過 Casper FFG 與 LMD-GHOST 各自如何運作。現在我們來看看它們如何結合成 Gasper,並用在以太坊的權益證明共識協議中。
要完全理解 Gasper 如何運作,最好的方法是跟著一個真實的例子,看一條區塊鏈如何用它來對區塊的歷史達成共識。我們的例子不會使用以太坊主網,而是建立一個只有三個驗證者的模擬網路,以便更清楚地描述共識協議的每個階段發生了什麼事,如圖 15-31 所示。

這三個驗證者質押的 ETH 數量相同,所以他們的投票權(也就是他們對每個所投區塊的分數貢獻)也相同。此外,每個驗證者在每個區塊都會發布一次見證投票,而不是像以太坊主網那樣每個 epoch 一次。
我們的目標是觀察一個區塊從發布、到第一次被合理化、再到被最終確定的一生。
在我們簡化的網路中,每個 epoch 由三個 slot 組成,如圖 15-32 所示。

我們從編號 1 的 epoch 開始這個例子。這並不是真正的第一個 epoch,只是為了簡單起見稱它為「epoch 1」。驗證者 A 被選中提議第一個區塊。我們可以把它要提議的區塊稱為區塊 1,如圖 15-33 所示。

驗證者 A 發布區塊 1,這個區塊立刻開始在網路中傳播。發布後不久,驗證者 B 和 C 收到它,並把它存進自己對網路的看法中。
接著,所有驗證者都發出一次見證投票,投給他們認為鏈上最新的 head 區塊。為此,他們必須在自己的局部看法上執行 LMD-GHOST。結果是區塊 1。這些見證投票會被發布出去,並分享給所有驗證者。
現在,驗證者 B 被選中在下一個 slot(slot 2)提議區塊,如圖 15-34 所示。為此,這個驗證者同樣必須在自己對網路的局部看法上執行 LMD-GHOST,以取得要在其上建立新區塊的最新 head 區塊。

以下是驗證者 B 對網路的看法:
-
驗證者 A 的見證投票:head 區塊:區塊 1
-
驗證者 B 的見證投票:head 區塊:區塊 1
-
驗證者 C 的見證投票:head 區塊:區塊 1
所以驗證者 B 執行 LMD-GHOST 的結果是區塊 1。他們現在可以在區塊 1 之上發布區塊 2。在區塊 2 中,驗證者 B 也會存入所有他們看過、但還沒有收錄在先前區塊中的見證投票。所以他們存入了那三個投給區塊 1 的見證投票。
區塊 2 在網路中傳播,發布後不久,驗證者 A 和 C 就收到了它。請記得,LMD-GHOST 會同時使用透過點對點(P2P)網路分享的投票與收錄在區塊中的投票,而 Casper FFG 只考慮收錄在區塊中的投票。所以,如果驗證者已經透過 P2P 網路分享 LMD-GHOST 的投票,把這些投票收錄進區塊並不會影響 LMD-GHOST 的結果;但這對 Casper FFG 來說至關重要,因為這是驗證者得知這些投票的唯一途徑。
同樣地,所有驗證者都發出一次見證投票,投給他們認為鏈上最新的 head 區塊。由於他們的局部看法中都有區塊 2,他們全都投票支持區塊 2 成為鏈頭。接著,他們發布這些見證投票,讓所有驗證者都能看到。
現在,驗證者 C 被選中在 slot 3 提議下一個區塊。他們在自己的局部看法上執行 LMD-GHOST 以取得 head 區塊。以下是驗證者 C 對網路的看法:
-
驗證者 A 的見證投票:head 區塊:區塊 2
-
驗證者 B 的見證投票:head 區塊:區塊 2
-
驗證者 C 的見證投票:head 區塊:區塊 2
結果是區塊 2,所以驗證者 C 在它之上發布區塊 3,如圖 15-35 所示。

在區塊 3 中,驗證者 C 存入了那三個投給區塊 2 的見證投票,因為它們還沒有收錄在先前的區塊中。
區塊 3 在網路中傳播,發布後不久,驗證者 A 和 B 就收到了它。接著,驗證者們發出投給它的見證投票。
現在又輪回驗證者 A。他們必須提議下一個區塊(slot 4),這也是新 epoch(epoch 2)的第一個區塊,如圖 15-36 所示。

驗證者 A 在自己的局部看法上執行 LMD-GHOST,以取得鏈頭。以下是驗證者 A 對網路的看法:
-
驗證者 A 的見證投票:head 區塊:區塊 3
-
驗證者 B 的見證投票:head 區塊:區塊 3
-
驗證者 C 的見證投票:head 區塊:區塊 3
結果是區塊 3,所以驗證者 A 在它之上發布區塊 4。
在區塊 4 中,驗證者 A 存入了那三個投給區塊 3 的見證投票,因為它們還沒有收錄在先前的區塊中。
區塊 4 在網路中傳播,發布後不久,驗證者 B 和 C 就收到了它。驗證者們必須發出新的見證投票,投票支持它成為鏈頭。但這一次,有些事情改變了。
我們進入了新的 epoch,所以驗證者必須更新投票中 Casper FFG 的部分。事實上,我們先前略過了一點:見證投票不只包含對鏈上最新 head 區塊的投票(也就是共識協議中 LMD-GHOST 的部分),還包含對 Casper FFG 檢查點的投票。具體來說,每個見證投票都包含一個來源投票與一個目標投票。來源投票是驗證者所知道的最新已合理化檢查點,而目標投票則代表驗證者認為下一個應該被合理化的區塊。
所以驗證者 A、B 和 C 發出的見證投票如下:
見證投票
-
head 區塊:區塊 4
-
來源區塊:區塊 1
-
目標區塊:區塊 4
目標區塊很容易選,因為它就是 epoch 的第一個區塊(有一些邊緣情況下,目標區塊不是 epoch 的第一個區塊,但為了簡單起見,我們先忽略它們)。來源區塊的算法,是查看驗證者手上的見證投票,看看是否有某個區塊被超過三分之二的驗證者投為目標區塊。我們在先前的見證投票中沒有列出來源區塊與目標區塊,但我們就假設它們都把區塊 1 當成目標區塊。所以現在,我們已經把區塊 1 合理化了,因為從區塊 1 到區塊 4 有一個絕對多數連結。請見圖 15-37。

這些見證投票接著會被發布、分享給所有驗證者,並收錄在接下來的 slot 中(通常就是下一個 slot)。我們可以跳過區塊 5 和 6,直接來到區塊 7,也就是下一個 epoch(epoch 3)的第一個區塊,如圖 15-38 所示。

驗證者 A 再次被選中提議區塊。他們在自己的局部看法上執行 LMD-GHOST。以下是驗證者 A 對網路的看法:
-
驗證者 A 的見證投票:head 區塊:區塊 6,來源區塊:1,目標區塊:4
-
驗證者 B 的見證投票:head 區塊:區塊 6,來源區塊:1,目標區塊:4
-
驗證者 C 的見證投票:head 區塊:區塊 6,來源區塊:1,目標區塊:4
結果是區塊 6,所以他們在它之上發布區塊 7。
區塊 7 在網路中傳播,發布後不久,驗證者 B 和 C 就收到了它。驗證者們必須發出新的見證投票,投票支持它成為鏈頭。而這裡又有些事情改變了。
我們進入了下一個 epoch(epoch 3),所以見證投票中 Casper FFG 的部分又改變了。事實上,驗證者 A、B 和 C 發出的見證投票是這樣的:
見證投票
-
head 區塊:區塊 7
-
來源區塊:區塊 4
-
目標區塊:區塊 7
如你所見,目標區塊現在是區塊 7,來源區塊則是區塊 4。之所以如此,是因為驗證者 A、B 和 C 在上一次的見證投票中,全都把目標區塊投給了區塊 4。我們現在已經把區塊 4 合理化了,因為從區塊 4 到區塊 7 有一個新的絕對多數連結,如圖 15-39 所示。

我們也已經把區塊 1 最終確定了,因為它是一個已合理化的檢查點,而它的直接子檢查點(區塊 4)也已經合理化。當驗證者認為某個區塊已最終確定,代表這個驗證者已經看到超過三分之二的驗證者確認,他們全都看到該區塊已被合理化。事實上,以驗證者 A 為例(這也適用於驗證者 B 和 C),他們看到了 B 和 C 的見證投票,其中 B 和 C 都把區塊 1 投為來源區塊。把區塊 1 投為來源區塊,代表 B 和 C 先前已經看到三分之二多數把區塊 1 投為目標區塊。所以我們可以確定,要逆轉區塊 1,至少有三分之一的驗證者必須因為雙重投票而被罰沒。
15.9. 爭議與競爭
讀到這裡,你可能會好奇,為什麼我們需要這麼多種不同的共識演算法?哪一種比較好?這個問題的答案,正是過去十年分散式系統中最令人振奮的研究領域的核心。一切都取決於你認為怎樣才算「更好」;在電腦科學的脈絡下,這關乎前提假設、目標,以及無可避免的取捨。
很可能沒有任何一種演算法能在去中心化共識問題的所有面向上都做到最佳。當有人說某個共識演算法比其他的「更好」時,你應該開始提出問題來釐清:在哪方面更好?不可竄改性?最終性?去中心化?成本?至少到目前為止,還沒有明確的答案。此外,共識演算法的設計是一個價值數十億美元產業的核心,引發了巨大的爭議與激烈的辯論。到頭來,也許根本沒有「正確」的答案,就像不同的應用可能有不同的答案一樣。
整個區塊鏈產業就是一場巨大的實驗,這些問題會在敵對的條件下、在龐大的金錢價值面臨風險的情況下接受考驗。最終,歷史會為這場爭議給出答案。
共識協議中的爭議可能很多,而協調整個網路來解決這些爭議並不容易。讓各方的誘因一致很關鍵,但並不總是做得到。我們來檢視以太坊共識演算法目前的兩個問題。
15.9.1. 時機賽局
在以太坊的協議中,時間被劃分成 12 秒為一個單位的 slot。每個 slot 都指派一個驗證者,在 slot 一開始(t = 0)擔任提議區塊的角色。接著,一個由見證投票者(attester)組成的委員會負責驗證這個區塊,目標是在 slot 開始後的第 4 秒(t = 4)之前完成,這被視為見證投票的截止時間。
時機賽局(Timing games)是一種策略:驗證者在提議區塊之前盡可能地等待,以最大化他們的最大可提取價值(MEV)獎勵,如圖 15-40 所示。這種做法需要微妙的平衡:驗證者必須延後提議以獲取更多價值,同時又要確保他們的區塊獲得足夠比例的見證投票委員會支持,才能留在主鏈上。

以太坊中的時機賽局造成了一種競爭局面:一個驗證者從 MEV 得到的收益,可能讓其他驗證者處於不利的地位。這種競爭可能增加錯過的 slot 與潛在的鏈重組次數,從而擾亂共識。此外,它也會促使見證投票者延後他們的驗證,讓整個過程更加複雜。
「共識的原則」一節指出了活性對以太坊共識過程的重要性。然而,時機賽局會損害網路的可靠性,對這項關鍵特性構成威脅。
timing game 是什麼?它就像是等待完美的時機出手,想從中獲得最大的好處。一些維持網路運作的人正試圖這麼做。他們等待適當的時機採取行動,以獲得最多的獎勵。但這種等待的遊戲可能有風險。如果他們的網路連線很慢,或是經驗不太夠,就可能錯過履行職責的機會。而錯過太多次機會,可能會讓網路變得比較不可靠。

目前,這還不是什麼大問題。大部分擔任驗證者的實體並沒有真正投入這些時機賽局,或者根本沒有參與,如圖 15-41 所示。
|
備註
|
自從我們在 2024 年寫下本章以來,情況已經有了一些變化。現在,Dencun 硬分叉加入了一個名為「提議者加權」(proposer boost)的解決方案,它確實會懲罰延遲提議區塊的提議者。提議者加權會在區塊被提議的那個 slot 中,為區塊提議者的見證投票增加權重。 |
15.9.2. 絕對多數的中心化
以太坊中絕對多數客戶端風險的概念,關乎如何在網路的健康與安全之間取得平衡。以太坊決定使用多個客戶端,以避免任何單點故障。這是因為所有軟體(包括這些客戶端)都可能有錯誤。真正的麻煩始於共識錯誤,它可能導致嚴重的後果,例如憑空創造出無限的以太幣。如果只有一個客戶端在主導一切,而它又遇上了這樣的錯誤,修復起來將是一場惡夢。網路可能在錯誤持續存在的情況下運作得夠久,讓攻擊者造成無法挽回的損害。
我們來快速分析一個例子,看看如果多數客戶端有錯誤時會發生什麼事。請注意,圖 15-42 中的每個方塊都是一個檢查點,而不是區塊鏈中的一個區塊。

正常運作的客戶端會忽略包含無效區塊(標示為「B」)的那個 epoch。指向區塊 B 的箭頭用來把這個無效的 epoch 合理化,而從它出發的箭頭則把它最終確定。
假設錯誤已經修正,而那些把無效 epoch 最終確定的驗證者想要切換回正確的鏈 B(Chain B),首先需要做的就是把 epoch X 合理化,如圖 15-43 所示。

要參與 epoch X 的合理化,需要一個如虛線箭頭所示的絕對多數連結,而驗證者必須跨越從區塊 B 出發、代表無效 epoch 已最終確定的那個箭頭。對兩個連結都投票,可能會讓這些驗證者受到懲罰。
多客戶端的做法提供了一張安全網。如果錯誤出現在一個不到一半網路使用的客戶端上,網路的其他部分因為執行其他客戶端,會直接忽略有問題的區塊。這讓網路保持在正軌上,把干擾降到最低。但如果多數客戶端(特別是超過三分之二驗證者使用的客戶端)出現錯誤,就可能錯誤地讓鏈最終確定,進而可能導致鏈的分裂。
以太坊鼓勵客戶端的多樣化,因為如果每個人都使用同一個客戶端,而它又失靈了,整個網路都會陷入風險。執行與主流相悖的客戶端所受的懲罰,就是為了避免我們把所有雞蛋放在同一個籃子裡。這樣一來,即使某個客戶端真的有錯誤,損害也能受到控制,影響的使用者也較少。如果少數客戶端出了問題,影響就比較小,因為多數客戶端可以修正路徑,繼續讓鏈最終確定。
我們越是把選擇分散到不同的客戶端上,以太坊就越安全。這不只是為了避免技術故障,更是為了保護以太坊的未來免於任何單點故障。這種多樣性是我們對抗全網危機的最佳防線,確保以太坊無論遇到什麼狀況,都能保持穩健與韌性。
我們最初撰寫本章時,Geth 的使用率是 63%,如同前面說明的,這是個問題。現在情況比較健康了,但未來仍需要改善;截至目前,41% 的執行層客戶端使用 Geth,38% 使用 Nethermind,如圖 15-44 所示。

這個問題不只影響執行層客戶端,也影響共識層客戶端,不過共識層這一側的問題很快就得到處理,現在的情況相對健康而穩定,如圖 15-45 所示。

註腳
- 譯註:依照圖 15-18 的註腳(看到絕對多數連結 CN → CN + 1,因此把 CN + 1 標記為已合理化)、下一小節「最終確定」的說明,以及「互相衝突的合理化」一節四個驗證者的例子(A 擁有來源 0 與目標 1 之間的絕對多數連結,因此把檢查點 0 最終確定、把檢查點 1 合理化),一個絕對多數連結 s→t 合理化的是目標檢查點 t,來源 s 本身必須已經合理化。原文此處說「把舊的檢查點合理化」,與這些說明不一致。本章「Gasper:真實的例子」一節的範例(區塊 1、區塊 4 被合理化的說法,以及圖 15-37、15-39 的圖說)也採用與此處相同、比上述定義晚一格的說法,請依註腳與四個驗證者的例子理解。 ↩
- 節點已經看到一個絕對多數連結 CN → CN + 1,因此把 CN + 1 標記為已合理化。由於在檢查點樹中,CN + 1 是 CN 的直接子節點,節點也會把 CN 標記為已最終確定。已最終確定的檢查點以交叉斜線標示,並標上 F。 ↩
- 譯註:「分叉選擇規則」一節並沒有說明環繞投票;說明環繞投票的是之後的「Casper 戒律」一節(見圖 15-21)。 ↩
- 檢查點永遠是 epoch 的第一個 slot,但如果檢查點本身的區塊不存在,它的區塊雜湊可能來自更早的區塊。 ↩



