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