1. 程式人生 > >探究以太坊 2.0 的分叉選擇規則

探究以太坊 2.0 的分叉選擇規則

編者注:文章原題為“Detailed overview of Ethereum 2.0 shard chains: Committees, Proposers and Attesters(關於以太坊 2.0 分片鏈細節概述:委員會、提案者和證明者)”。讀完這篇文章就更能理解:為什麼權益證明無法使用最長鏈規則而必須採用其他規則,而這些規則又會有怎樣的侷限性。文章非常長,但不讀你就錯過了。有興趣的讀者可以結合文末超連結研究一下。

時至今日,許多關於以太坊 2.0 的工作細節已經公諸於眾,同時還有許多團隊在著手實現。但是 以太坊 2.0 還有一大塊空白的部分還未規範,也沒有披露什麼訊息,那就是分片鏈技術。基本上所有關於規範的部分都展示在這裡,而這篇部落格會著重提供一些細節概述。

腳註:這篇文章的初版所述的方法,稱作即時訊息驅動(IMF, immediate message driven),現在已經被拋棄了。相關內容可以在這裡找到。

委員會及其構造

只要將 32 個 ETH 放入現有主鏈(PoW chain)上指定的智慧合約,任何以太坊網路中的參與者都能成為驗證者節點。
在這裡插入圖片描述
-Image by Hsiao-Wei Wang-

參與者進入驗證者池之後,就可以被分配給某個分片。分配過程是是完全隨機的,可以通過可驗證延時函式(VDFs,Verifiable Delay Functions)保證隨機的無偏性。

如果有參與者質押的權益超過 32 ETH(假設是 320 ETH),他們就會獲得相應比例的驗證者席次。這些席次彼此之間無關,會被獨立地分配給分片網路;所以對於投入 320 ETH 的參與者來說,最不理想的情況是在單個出塊時段,成為十個不同分片網路的驗證者。但如果不這麼設計的話,就會增加競爭敵手接管某一個分片的可能性;一般來說,我們都預期那些擁有更多權益的人可以呼叫更多的資源以及算力(因此要防範這一點)。

在 proof-of-stake 系統中產出區塊
以太坊 2.0 是 PoS 系統。在本章節,我們先回顧一下現有的且被推崇的 PoS 區塊鏈中,是如何產生區塊的:

在這樣的框架中,生成區塊的時間間隔是固定的。例如每五秒生成一個區塊,並由一群驗證者來進行建立和驗證區塊。在每五秒的出塊時段內,會有一個驗證者被指定來生產該時段(time slot)的區塊。如果驗證者彼此之間的權益數量不同,則有較多權益的驗證者會有較高的概率成為區塊生產者。

當分叉發生時,誠實的驗證者會選擇具有最多區塊的那條鏈。只要誠實的驗證者佔全部驗證者總數的一半以上,想要偽造一條最長鏈是非常困難的。假設所有少數惡意節點試圖聯合起來,私下建立一條分叉鏈,並且故意在誠實鏈的出塊時段內不產出區塊;即使如此,他們的惡意分叉仍然會比誠實鏈要來的短;這個論點類似 PoW 系統,只要超過一半以上的算力由誠實節點控制,要反轉最長鏈的可能性極低。

然而如果直接實施這種架構,會存在許多問題。首先,短程分叉還是很有可能發生;只要少數節點控制了全部驗證者中的 10% ,最後的幾個區塊,比如說六個,的回滾概率還是高的令人無法接受;第二,會出現各式各樣的審查問題。舉例來說,如果惡意節點碰巧在一條佇列中獲得連續兩個出塊時段的出塊權力,他們就能審查前一個出塊時段產生的區塊:

在這裡插入圖片描述

上圖中惡意驗證者控制了第 3 和 第 4 個出塊時段;它們能夠緊接在 1 號塊(即第 1 個出塊時段所出的塊)之後生成區塊,實質上造成對 2 號塊的審查。而誠實的驗證者在第 5 個出塊時段生產區塊時,會選擇被操控的包含第 3 和 第 4 區塊的鏈,因為它們是較長鏈。

即便是單個惡意驗證者也能試著去審查前一個時段的區塊。如下圖所示,X 軸表示時間軸,出塊時段標記在底部,區塊中的數字表示人們預期的該塊的出塊時段(標號1 即表示人們預期這個塊會在第 1 個出塊時段出塊)。假設誠實的驗證者被指派為第 0 和 2 時段生產區塊;該誠實驗證者將區塊 0 廣播出去之後,被指派為第 1 個時段出塊的惡意驗證者可以扣住區塊不去廣播,等到區塊 2 被廣播出去後再廣播區塊 1(由於負責出區塊 2 的驗證者沒有收到區塊 1 ,他們會緊接著區塊 0 構建他們的區塊;因此,區塊 1 和區塊 2 就變成了兩條同樣長的分叉鏈)。

在這裡插入圖片描述

等到第 3 個出塊時段,誠實的驗證者應該接著哪個塊建立新的區塊呢?我們考慮以下四種可能的情況:

總是跟在較早建立的區塊後面。這麼一來,處在較早出塊時段的惡意驗證者就會延遲廣播區塊,直到下一個出塊時段的區塊被建立後再廣播,導致後者就被忽略(如上圖情景所述)。

總是跟在較晚建立的區塊後面建塊。這種情況下,在時段 X 出塊的惡意驗證者可以選擇無視時段 X-1 建立的區塊,並且能確保負責時段 X+1 的驗證者一定會選擇他的區塊,而時段 X-1 建立的塊就會被忽略。

總是跟在自己先接收到的區塊後面建塊。這種情況下,只要惡意驗證者比下一個驗證者的網速更快更穩,上述兩種情形都有可能發生。

隨機選擇區塊。這樣惡意驗證者就無法確定自己建立的區塊會不會被接受(除非它們在一條網路中控制了多個出塊時段);但是如果審查區塊能獲得高於出塊的獎勵,惡意驗證者仍會嘗試作惡,同時有 50% 的成功機率。

上面的四種情況都是我們不願意見到的。

拜占庭方法

針對上述問題,人們提出了一系列的提案,這些提案的想法是在驗證者建立區塊時,使用一種拜占庭共識演算法。最早設想這個方法的論文是 ByzCoin ,而後又有許多基於它的協議被提出。它們的核心思想是:一旦區塊經過委員會最終確定,只要惡意節點數量不超過 1/3,這個區塊就是不可逆的,換句話說分叉和篡改無法成功。

這個方法有兩個主要的缺點, a) 大多數拜占庭演算法很慢,無法應對大量參與者要達成共識的場景; b) 掉線的節點會被視為惡意行為,因為如果少於 2/3 節點線上,區塊共識就無法達成,進而導致系統總會在某些時候停滯不前。

檢視證明(Attestations)數量的方案
以太坊 2.0 延續使用之前的方法,也就是在每個出塊時段,會有一個驗證者(又稱作提案者,proposer)被指派產生區塊。而且以太坊 2.0 還進行了拓展:委員會的其他驗證者被激勵去“證實(attest)”這個區塊,也就是給它簽名。這種簽名使用了 BLS 群簽名方法,可以避免隨著簽名增加而使得區塊大小暴增。而且對於給定的出塊時段,如果驗證者沒有看到新建立的區塊,或是區塊不在當前應該在的鏈上,驗證者被鼓勵去證明存在這個情況,又稱作證明“跳過該區塊”的操作。這樣一來,誠實的驗證者會證明每個出塊時段都正好有一個區塊產生;這可能是由提案者建立的真實區塊,或是一個被跳過的區塊(“跳過該區塊”)。

藉由證明者機制和分叉選擇規則,以太坊 2.0 分片鏈避免了一般 PoS 方法和拜占庭共識演算法的問題。

分叉選擇規則

即時訊息驅動(IMD)

從創世區塊開始,每當我們面臨分叉時,只要某個分支上具有的驗證者(即為該分支的當前和以往區塊做證實的驗證者)比其它分支都要更多樣,我們就認為它是應該被選擇的分支(預告,後面會提到最新訊息驅動 Latest Message Driven)。

在這裡插入圖片描述

我們分析一下上圖所示的情形。每個區塊中的字母表示該區塊獲得的證明,虛線的區塊表示“跳過該區塊”操作。現在發生分叉,Alice (A)、Bob (B)、Carol ©、Dave (D) 和 Elaine (E) 已經證明過下分支的部分割槽塊;而 Victor (V)、Xavier (X)、Yasmine (Y) 和 Zach (Z) 證明過上分支的區塊。為了找出正確的那條鏈,我們得從創世區塊開始往右推演。參與者必須在第 2 個出塊時段對上下兩條分支進行選擇;而分叉選擇規則告訴我們,要選擇在其上有較多不重複的證明者的分支。我們可以看到,下分支有五個證明者(Alice, Bob, Carol, Dave and Elaine),上分支只有四個(Victor, Xavier, Yasmine and Zach),所以我們選擇下分支。注意,其實在下分支裡,並沒有某個塊是得到五個驗證者證明的,甚至連得到四個證明的塊都沒有(在第 7 個出塊時段之前的鏈,只有來自 Alice, Bob 和 Carol 的證明;如果鏈在第 8 個出塊時段結束的話,也只有來自 Alice, Dave 和 Elaine 的證明)。但是下分支的累計證明數比上分支多,因此選擇前者作為鏈。

相似的,在第 6 個出塊時段也要進行一次分叉選擇;上面分支有三個證明者( Alice, Bob 和 Carol ),下面的只有兩個( Dave 和 Elaine ),所以最終結果會選擇包含出塊時段 1 、2、4、6、7 所創塊的鏈。

最新訊息驅動 Latest Message Driven

在(最新訊息驅動)這種分叉選擇規則中,(在確認哪條分支有多少驗證者時)我們只考慮這些驗證者在最新的出塊時段提交的證明。舉例來說,在下圖中的第 3 個出塊時段(也就是最新的出塊時段), Alice 提交了對上分支區塊的證明,因此我們認定 TA 選擇了上分支。換言之,Alice 在第 2 個出塊時段的證明將被忽略掉,因此我們在第 0 個出塊時段進行分叉選擇的時候,上分支有三個證明者( Alice, Bob 和 Elaine ),下分支只有兩個( Carol 和 Dave),我們選擇上面的分支:

在這裡插入圖片描述

要注意的是,此種分叉選擇規則只看 Alice 在最新的出塊時段(出塊時段 3)的選擇,這和 Alice 最先提交哪個證明或是特定觀察者最先接收到哪個證明無關。

證明的條件

只有在區塊滿足某些條件時,誠實的證明者才會對區塊進行證明:

區塊屬於證明者認定的當前被選擇的鏈上;

證明者在同一個出塊時段內,沒有對其他區塊進行過證明。

注意:我們相信誠實的提案者不會在同一個出塊時段內建立兩個區塊;因此,這種分叉選擇規則只要配合罰沒規則便可使用:當出現惡意提案者試圖在同個出塊時段建立多個塊,以此分叉區塊鏈的時候,它的權益會被立即罰沒掉。

如果證明者沒有收到特定出塊時段的區塊,則證明者會採取證明“跳過該區塊”的操作。由證明者自行選擇等待時間,直到他們決定停止等待並證明“跳過該區塊”操作。Danny Ryan 建議誠實的證明者應該等到出塊時段過了一半之後,再進行最終他們認為正確的證明(不論是對實際區塊或是跳過的區塊進行證明)——因為大多數證明者都會這麼做。

分析

活躍性
不同於其他拜占庭共識演算法,在上述方法中,即使超過 1/3 佔比的節點掉線,出塊過程也能繼續正常執行。網路中的參與者會仔細檢查只得到少於 2/3 證明的區塊,並對這些區塊更加小心,直到有其他附加的安全條件被滿足(比如,等到這些區塊被交叉關聯(cross-link)到信標鏈(The Beacon Chain),並且由 Casper FFG 進行過確認……這些就超出本文討論範圍了)。不過最重要的是,系統會持續出塊,而不會延宕。

抗審查性
回顧一下上面提到的兩種審查場景,在第一種情形中,擁有連續兩個時段出塊權的驗證者想審查前一個區塊就不可能成功了,因為分叉選擇與鏈長度不再有任何關係。

如果沒有限制驗證者只能在相應的出塊時段內做證明,那麼第二種場景(提案者延遲出塊,直到下個出塊時段的區塊被創建出來)仍然可能發生:出塊時段 X 中的惡意驗證者可以延到 X+1 塊被建立後,再廣播他們的區塊。對於證明者來說,他們無法區分惡意攻擊或僅僅是網路延時的區別,而且一旦證明沒有限定的時間視窗,人們就可以在後來證實 X,有效地審查 X+1。

要求在特定時間視窗進行證明可以解決上述問題,只要所有參與者的時鐘都是同步的。如果無法保持同步(但仍然在數秒鐘的時間範圍內),基於時間差的攻擊就有可能發生;當然發生的可能性極低。

抗分叉性
在兩種可能的累計證明數的方法中(最新訊息驅動 LMD,只有在最新的出塊時段中的證明會被採納;及時訊息驅動 IMD ,採納所有的證明),後者提供較好的抗分叉性保證(詳見此文關於分叉性的章節),但相比於其他拜占庭共識演算法仍然不夠好。

本文描述了以太坊 2.0 中的 LMD 方法,雖然這種方法對分叉性的抵抗較弱。 為了更好了解這一點,假設某條分支中有 60 個證明者,其中有部分惡意節點;另外一條分支有 40 個證明者。在 IMD 場景下,需要在那 60 個證明者中出現 21 個惡意證明者為具有 40 個證明者的分支做證明,才能改變原有主鏈選擇的結果(最終為 61 個證明數 vs 60個證明數,原來被選擇的主鏈上只有 60 個證明);在 LMD 場景下,只要出現 11 個惡意節點就能達到分叉目的(最終為 51 個證明數 vs 49 個證明數,原來被選擇的主鏈上只有 49 個證明)。儘管 LMD 能夠減少分叉發生,加上主鏈有超過 2/3 佔比的證明數且惡意節點佔比不到 1/3 ,我們仍無法完全避免分叉發生。我們考慮下面的例子:

假設有七個驗證者,其中 Alice (A)、Bob (B)、Carol ©、Dave (D) 和 Elaine (E) 是誠實節點,而 Xavier (X) 和 Yasmine (Y) 是惡意節點。

(i) 現在出現了分叉,第 2 和 3 出塊時段都接著第 1 個出塊時段的區塊出塊,而 Alice 和 Bob 看到第 2 個出塊時段生成的區塊,併為它提供證明;

(ii) Carol 沒有看到第 2 個出塊時段的區塊和證明,而只看到第 3 個出塊時段建立的區塊。於是 Carol 和惡意節點 Xavier、Yasmine 替區塊 3 提供證明;

(iii) 現在區塊 3 擁有三個證明,所以 Alice 和 Bob 就會認為包含第 3 個出塊時段的分支才是主鏈,因此他倆也對區塊 3 進行證明(假設證明時間視窗還沒結束)。現在區塊 3 具有超過 2/3 佔比的證明數,理應不可逆;

(iv) 但其實 Dave 和 Elaine 在有效期間也對區塊 2 進行證明,卻因為網路延遲問題沒有及時被看到(Alice 和 Bob 也沒看到);

(v) 這時候,惡意節點 Xavier 和 Yasmine 選擇在第 4 個出塊時段建立塊,並接續在原本應該被拋棄的區塊 2 上。一時之間,上分支證明數(Dave, Elaine, Xavier 和 Yasmine)反超下分支的證明數(Carol, Alice 和 Bob),前者成為主鏈(即使下分支一度存在超過 2/3 佔比的證明數);

(vi) 現在所有誠實的證明者都會對區塊 4 進行證明。

注意,上述的攻擊很難成立(比如 Dave 和 Elaine 出現延遲的情況;在有數百驗證者的網路中很難發生,除非攻擊者控制了整個網路通訊),這對作惡手段也有很高的要求(Xavier 和 Yasmine attesting 要先知道他們證明的區塊不會被選為主鏈,但這仍表示 LMD 方法不如拜占庭共識演算法來的強健)。

和 TxFlow 比較

TxFlow 是 Near 用於其分片鏈的共識演算法,關於 TxFlow 的細則可以在這裡找到。

以太坊採取的方法的兩個缺點是:即便積累大量證明,理論上分叉仍然可能發生,而且非常依賴驗證者之間的時間同步。目前協議中,出塊速度為 8 秒,所以要求時間同步精度在數秒以內。以太坊基金會進行過的測試表明,若時間差在 10 秒以內,鏈仍然會繼續增長。大多數證明會變成“跳過該區塊”操作,但仍然能指向正常的區塊,使得鏈穩定增長。

TxFlow 繼承了大多數以太坊方法中的特點,但是不依賴時間同步;只要求惡意節點少於 1/3 則正常區塊就是不可逆的。然而,在目前的設計中,只要超過 1/3 的驗證者掉線,整個鏈就會喪失活躍性。

註腳:請注意,當分片數量很多,且惡意身份能靈活切換時,假設惡意節點少於 1/3 佔比是不合理的。所以包含 TxFlow方法在內的其它拜占庭協議,最終仍有可能發生分叉。

值得一提的是,EthResearch 在 TxFlow 上測試時,Vitalik 指出 TxFlow 方法中決定什麼時候出塊的設計(“網速多快,就出多快”)有其他缺點:這會促使節點們抱團,以減少延時。對此指控的反駁是, TxFlow 方法的瓶頸來自“速度最慢的 1/3 節點裡,其中最快的驗證者的延時”。也就是說,除非超過 2/3 佔比的驗證者聯合起來,不然無法有效提高出塊速度(也無法增加出塊獎勵)。所以 TxFlow 的驗證者發生抱團或中心化,需要大多數驗證者共同為之,這在驗證者基數足夠大的情況下很難發生。

下表將 TxFlow 方法和 證明( Attestations)框架進行簡化對比:

7

結語

如果你對分片的去中心化賬本有興趣,請關注我們的進展:

NEAR 推特 — https://twitter.com/nearprotocol,

My 推特— https://twitter.com/AlexSkidanov

Medium — https://medium.com/nearprotocol,

Discord — https://discord.gg/kRY6AFp,

研究論壇 — http://research.nearprotocol.com

非常感謝 Vitalik Buterin, Justin Drake 和 Danny Ryan 進行無數的答疑,並明確了證明框架;還要感謝 Bowen Wang 和 David Stolp 校對本文。

​原文連結: https://medium.com/nearprotocol/detailed-overview-of-ethereum-2-0-shard-chains-committees-proposers-and-attesters-a9992d2fd103
作者: Alexander Skidanov
翻譯&校對: IAN LIU & 阿劍
稿源:以太坊愛好者(https://ethfans.org/posts/detailed-overview-of-ethereum-2-0-shard-chains-committees-proposers-and-attesters)