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