共识算法(BABE+GRANDPA)
共識算法(BABE+GRANDPA)
? 傳統的分布式系統采用的較常用的共識算法包括raft, paxos, PBFT等。
- PBFT(practical byzantine fault tolerance)
- 是相對比較簡單且實用的算法。
- 必須要指定一個委員會,只有委員會里的節點擁有投票權,不是開放式的。
而自從比特幣后,出現了新的共識算法
- 工作量證明 (Proof of Work) 的共識機制
- 第一個去中心化的金融交易系統。
- 工作量證明的去中心化程度很高,允許任何節點加入網絡,
- 主要問題是對算力和電力的消耗很高。
- 權益證明(Proof of Stake)的共識機制
- 是通過抵押代幣來作為投票權,總的來說抵押的代幣越多,投票權越大。
- 權益證明只是允許任何節點的加入,保證了網絡的開放性
- 還需要搭配共識算法才能成為一個整體的去中心化共識。
- 一般最常用的有兩個類型: BFT(Byzantine Fault Tolerance)共識算法和鏈式(Chain based)共識算法。
? BFT(Byzantine Fault Tolerance)共識算法是通過領導者提出下一個區塊,其他節點通過投票來決定是否接受或者拒絕這個區塊。比如PBFT, Tendermint, Hotstuff。它們的主要難點在于當領導節點作惡或者下線的時候,如何在委員會里選擇下一個領導者。
? 鏈式(Chain based)共識算法分為兩個步驟: 出塊(block proposal)和終結性(finality)。比如ouroboros, BABE(出塊), Casper CBC(終結性), GRANDPA(終結性)。在substrate中,BABE和GRANDPA合在一起決定了如何出塊以及如何選出最佳分支的過程。接下來主要講解一下BABE和GRANDPA。
1.BABE算法
? BABE是Blind Assignment for Blockchain Extension的縮寫。簡單來說,BABE把時間分為一個個epoch。每一個epoch又分為一個個的時間間隔(slot)。每一個slot里都會通過VRF(verifiable random function)從眾多的節點中選出一部分有資格出塊的節點(slot leader)。這里我們暫且稱之為出塊節點。每一個時間間隔 (slot) 選出的出塊節點都可能不同,有可能多個,也可能一個都沒有被選上。總體來說一個節點被選上的概率正比與它抵押的代幣數量。在Substrate中,一個時間間隔大概是6秒鐘。
上圖就代表幾個連續的epoch,每一個epoch中又有若干slot。每一個slot中被選中的出塊節點(slot leader)從0到多個不等。r1,r2,r3 代表每一個epoch對應的隨機數,用來進行VRF計算的。
在一個slot里,出塊節點會把下一個區塊發給其他所有節點。對于網絡中參與共識的任何一個節點,它可能收不到任何區塊,此時這個間隔對應的區塊就是空的 。在實際應用中,substrate引入一個備用的出塊機制。就是說如果沒有收到任何區塊,則通過備用機制出塊。
參與者也可能會同時收到多個區塊,分別來自不同的出塊節點。如果這些區塊又不同的話,這些區塊都會被保存下來。因此這個時候它本地的區塊鏈就分叉了,不是鏈式結構,而是樹狀結構。那么如何決定哪一個分支作為最終主鏈呢?這個時候就需要借助GRANDPA來進行抉擇了。
1.1 VRF
這里rm是隨機數,sk是用戶的密鑰, VRF的輸出有兩項: d作為輸出數據,π則是可以證明輸出數據是合法的
fn vrf_sigh(PrivateKey, Transcript) -> (VRFOutout, VRFProof);-
PrivateKey是驗證者的私鑰
-
Transcript是輸入數據,是當前槽數(Slot number),時期數(Epoch number)和鏈上隨機值(Randomness)
-
對于這個VRF輸出,監測他是否低于一個特定的值,如果是的話,驗證者得到了一個生成區塊的機會
- VRFOutout <φ(stake),正比于驗證者的質押量
- lPublicKey是驗證者的公鑰
- 用來驗證輸出是否合法
1.2 鏈上隨機值
-
在時期交換節點(Epoch transition),Runtime提供下一個交換節點后的驗證者集合和新的鏈上隨機值( Randomness )
-
鏈上隨機值由上上個周期的VRF輸出經過混合后產生
1.3 BABE步驟
1.4 次級(Secondary)區塊
出塊的順序解決了,但在BABE中,出塊變得不確定了
如果一個 Slot 方式如下情況:
- Slot 沒有人的VRF滿足要求
- Slot 有多個驗證者滿足要求
- 通過備用機制出塊,就是按照Aura順序指定驗證人出塊,被稱為次級Aura區塊,優先級低
BABE通過這個過程確定了出塊驗證者的順序,確定出塊(敲定)則需要通過GRANDPA完成
1.5 實現
- 共識算法在Substrate中主要是通過兩個結構摘要(Digest)和封章(Seal)
- 在權益證明(Proof of Stake)中,封章通常是驗證者的簽名
- 由共識引擎先生成預摘要(Pre-digest),之后Runtime進行處理,共識引擎再生成后摘要(Post-digest)和封章(Seal)
- 預摘要包含:VRF輸出和證明(VRFOut,VRFProof)
- 后摘要在時期交換(Epoch transition)時才會產生,包含下個時期驗證者集和鏈上隨機值
- 隨機值由Runtime產生
2. GRANDPA
2.1 什么是GRANDPA
-
GHOST-based Recursive Ancestor Deriving Prefix Agreement
-
波卡將GRANDPA與BABE分成兩個模塊,BABE提供活性和概率的確定性,GRANDPA提供確定性。
-
GRANDPA 與其他拜占庭式容錯(BFT)區塊鏈算法不同之處在于,驗證者對鏈而不是區塊進行投票。該協議采用過渡性地投票機制,GRANDPA 算法找到具有最高投票數的區塊編號,將將其視為最終投票。此過程允許在在幾個區塊內同時進行。
? GRANDPA共識與BABE或者比特幣的POW不同,BABE和比特幣的POW是概率確定性,而GRANDPA共識要做到100%不可逆。
之所以需要做到不可逆,因為波卡的跨鏈特性,需要保證跨鏈的交易一旦執行,絕不可能在原鏈上被撤銷。
2.2 GRANDPA要解決的三個問題:
2.2.1 不需要全部節點確認才成為不可逆的問題
? 因為我們沒辦法保證所有節點都會對某個塊進行確認,畢竟網絡波動的原因會一直存在,否則會極大影響效率。因此我們提出了各種BFT算法,在部分節點確認的情況下,保證網絡的安全性。
這里會用到 BFT 2 次 ? 共識,之所有需要2次是因為:
如上圖,如果只有 1 次 ? 節點確認,會有 2 個塊高度為 101 的區塊成為了不可逆,造成“沖突”
不會立馬成為 commit, 會先成為 pre-commit, 然后 pre-commit 經過 2/3 共識后才會成為commit,就根本沒有任何情況能讓 2 個 N 同時成為 commit
2.2.2 敲定過程中的大量網絡傳輸的消耗問題
? 因為需要 2 次 ? 共識廣播,所以 GRANDPA 的復雜度是 O(n2),隨著節點數量的增加,效率也會大幅下降,比如EOS雖然只有21個出塊節點,但它敲定的時間大概需要3分鐘左右,而波卡的目標是全網1000個節點。
? 因此 GRANDPA 不是對每個pre-commit塊進行逐個投票,而是將過程分為預投票和預執行,對當前最高塊進行投票,通過拆解區塊結構,可以一次確認若干個塊,極大提高敲定效率。
如下圖,每個節點選出自己認為最高塊,從而確定本輪新敲定的塊。
2.2.3 出現意外或者惡意節點的問題
問題1和2中都只考慮理想的誠實節點的情況,但實際運行時可能會出現其他情況導致“沖突”,比如下圖
? 當網絡情況不好,導致兩邊的藍色誠實節點無法同步,他們各自提交自己收到的區塊,而當中的惡意節點對兩邊的提交都進行簽名(雙簽),從而導致網絡“沖突”
? 除此之外,大量節點離線也導致問題。
? 針對這類問題,GRANDPA具有一項稱為“安全責任”的功能,即通過扣除節點抵押并將其從節點集中剔除,使驗證者對違反安全性的行為負責。
? Polkadot 為了防止這種情況的發生使用了一個叫做 Account Safety 的方式。
? 如果當網絡中出現了要分叉的 commit 信息時,Polkadot 的節點會馬上采取 Account Safety 的機制。每個節點都會詢問其他節點他們所看到的 pre-vote 的情況,節點都會回復他們收到的信息,這樣就很容易檢查到有哪些惡意節點投了兩個區塊。最后這些被抓到的作惡節點將會被踢出共識網絡,永遠不能進入。
? 如果你想要重寫一個之前的區塊,除了需要能夠控制超過 ? 的節點外,你還需要承受這 ? 節點的抵押被系統扣除的成本。
2.3 GRANDPA 的具體流程
一個主節點廣播之前一輪確認后的區塊高度;
等待網絡延遲以后,每個節點都廣播他們認為的可以被確認的最高的區塊(pre-vote);
每個節點對步驟 2 接受到的區塊集進行計算,算出他們認為的能夠被確認的最高區塊,并且將結果廣播出去(pre-commit);
當節點接收到足夠的 pre-commit 的消息能夠確認區塊后就會形成 commit 的消息,一般認為大于 2/3 就可以被確認了。
2.4 GRANDPA 的缺點
- GRANDPA最大的缺點是敲定時間的不確定性,Edgeware上線初期就出現過幾個小時無法敲定區塊的現象。
- 不過任何設計都有代價,只能說這是 GRANDPA 追求節點數量(去中心化),必須付出的代價。
總結
以上是生活随笔為你收集整理的共识算法(BABE+GRANDPA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用HP LaserJet Pro MF
- 下一篇: JAVA程序设计基础05循环结构