編者注:文章原題爲「html
Detailed overview of Ethereum 2.0 shard chains: Committees, Proposers and Attesters(關於以太坊 2.0 分片鏈細節概述:委員會、提案者和證實者)」。讀完這篇文章就更能理解:爲何權益證實沒法使用最長鏈規則而必須採用其餘規則,而這些規則又會有怎樣的侷限性。文章很是長,但不讀你就錯過了。有興趣的讀者能夠結合文末超連接研究一下。
時至今日,許多關於以太坊 2.0 的工做細節已經公諸於衆,同時還有許多團隊在着手實現。可是 以太坊 2.0 還有一大塊空白的部分還未規範,也沒有披露什麼訊息,那就是分片鏈技術。基本上全部關於規範的部分都展現在這裏,而這篇博客會着重提供一些細節概述。git
腳註:這篇文章的第一版所述的方法,稱做即時消息驅動(IMF, immediate message driven),如今已經被拋棄了。相關內容能夠在這裏找到。github
只要將 32 個 ETH 放入現有主鏈(PoW chain)上指定的智能合約,任何以太坊網絡中的參與者都能成爲驗證者節點。算法
-Image by Hsiao-Wei Wang-安全
參與者進入驗證者池以後,就能夠被分配給某個分片。分配過程是是徹底隨機的,能夠經過可驗證延時函數(VDFs,Verifiable Delay Functions)保證隨機的無偏性。bash
若是有參與者質押的權益超過 32 ETH(假設是 320 ETH),他們就會得到相應比例的驗證者席次。這些席次彼此之間無關,會被獨立地分配給分片網絡;因此對於投入 320 ETH 的參與者來講,最不理想的狀況是在單個出塊時段,成爲十個不一樣分片網絡的驗證者。但若是不這麼設計的話,就會增長競爭敵手接管某一個分片的可能性;通常來講,咱們都預期那些擁有更多權益的人能夠調用更多的資源以及算力(所以要防範這一點)。網絡
以太坊 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 節點在線,區塊共識就沒法達成,進而致使系統總會在某些時候停滯不前。
以太坊 2.0 延續使用以前的方法,也就是在每一個出塊時段,會有一個驗證者(又稱做提案者,proposer)被指派產生區塊。並且以太坊 2.0 還進行了拓展:委員會的其餘驗證者被激勵去「證明(attest)」這個區塊,也就是給它簽名。這種簽名使用了 BLS 羣簽名方法,能夠避免隨着簽名增長而使得區塊大小暴增。並且對於給定的出塊時段,若是驗證者沒有看到新建立的區塊,或是區塊不在當前應該在的鏈上,驗證者被鼓勵去證實存在這個狀況,又稱做證實「跳過該區塊」的操做。這樣一來,誠實的驗證者會證實每一個出塊時段都正好有一個區塊產生;這多是由提案者建立的真實區塊,或是一個被跳過的區塊(「跳過該區塊」)。
藉由證實者機制和分叉選擇規則,以太坊 2.0 分片鏈避免了通常 PoS 方法和拜占庭共識算法的問題。
即時消息驅動(IMD)
從創世區塊開始,每當咱們面臨分叉時,只要某個分支上具備的驗證者(即爲該分支的當前和以往區塊作證明的驗證者)比其它分支都要更多樣,咱們就認爲它是應該被選擇的分支(預告,後面會提到最新消息驅動 Latest Message Driven)。
咱們分析一下上圖所示的情形。每一個區塊中的字母表示該區塊得到的證實,虛線的區塊表示「跳過該區塊」操做。如今發生分叉,Alice (A)、Bob (B)、Carol (C)、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 、二、四、六、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 (C)、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 是 Near 用於其分片鏈的共識算法,關於 TxFlow 的細則能夠在這裏找到。
以太坊採起的方法的兩個缺點是:即使積累大量證實,理論上分叉仍然可能發生,並且很是依賴驗證者之間的時間同步。目前協議中,出塊速度爲 8 秒,因此要求時間同步精度在數秒之內。以太坊基金會進行過的測試代表,若時間差在 10 秒之內,鏈仍然會繼續增加。大多數證實會變成「跳過該區塊」操做,但仍然能指向正常的區塊,使得鏈穩定增加。
TxFlow 繼承了大多數以太坊方法中的特色,可是不依賴時間同步;只要求惡意節點少於 1/3 則正常區塊就是不可逆的。然而,在目前的設計中,只要超過 1/3 的驗證者掉線,整個鏈就會喪失活躍性。
註腳:請注意,當分片數量不少,且惡意身份能靈活切換時,假設惡意節點少於 1/3 佔比是不合理的。因此包含 TxFlow方法在內的其它拜占庭協議,最終仍有可能發生分叉。
值得一提的是,EthResearch 在 TxFlow 上測試時,Vitalik 指出 TxFlow 方法中決定何時出塊的設計(「網速多快,就出多快」)有其餘缺點:這會促使節點們抱團,以減小延時。對此指控的反駁是, TxFlow 方法的瓶頸來自「速度最慢的 1/3 節點裏,其中最快的驗證者的延時」。也就是說,除非超過 2/3 佔比的驗證者聯合起來,否則沒法有效提升出塊速度(也沒法增長出塊獎勵)。因此 TxFlow 的驗證者發生抱團或中心化,須要大多數驗證者共同爲之,這在驗證者基數足夠大的狀況下很難發生。
下表將 TxFlow 方法和 證實( Attestations)框架進行簡化對比:
若是你對分片的去中心化帳本有興趣,請關注咱們的進展:
NEAR 推特
My 推特— twitter.com/AlexSkidano…
Medium — medium.com/nearprotoco…,
Discord — discord.gg/kRY6AFp,
研究論壇 — 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)複製代碼