BFT用在區(qū)塊鏈改進(jìn)上的好處是什么
掃描二維碼
隨時(shí)隨地手機(jī)看文章
自2018年末推出以來(lái),Lisk改進(jìn)建議(或LIPs)與Lisk社區(qū)密切合作,幫助改善了生態(tài)系統(tǒng)。我們通過(guò)這個(gè)過(guò)程引入的許多網(wǎng)絡(luò)特性之一是新的拜占庭容錯(cuò)(BFT)共識(shí)系統(tǒng)。在這篇博客文章中,我們已經(jīng)討論了Lisk協(xié)議共識(shí)算法的優(yōu)點(diǎn)。在Lisk SDK 3.0.0中實(shí)現(xiàn)它之前,我想關(guān)注BFT共識(shí)的一個(gè)重要方面——計(jì)算塊終結(jié)的過(guò)程,即保證某個(gè)特定塊永遠(yuǎn)不會(huì)被還原。
BFT的主要好處是什么?
在深入討論這個(gè)主題之前,讓我們快速瀏覽一下BFT在區(qū)塊鏈上改進(jìn)的基本關(guān)鍵特性。
1. 安全性:如果網(wǎng)絡(luò)中超過(guò) 2/3 的活動(dòng)委托誠(chéng)實(shí)地遵循協(xié)議,則兩個(gè)沖突塊永遠(yuǎn)無(wú)法在鏈上最終確定。
2. 活性:即使 1/3 的活動(dòng)委托脫機(jī),新塊仍可在網(wǎng)絡(luò)上完成。
3. 問(wèn)責(zé)制:如果代表違反議定書(shū),他/她將對(duì)此負(fù)責(zé)。
這是BFT為協(xié)議提供的三個(gè)高級(jí)值。它試圖盡快從分叉中恢復(fù)過(guò)來(lái),以更好地完成網(wǎng)絡(luò)鏈的增長(zhǎng)。這些特性都需要更廣泛的理解。在這里,我們將更多地關(guān)注實(shí)現(xiàn)細(xì)節(jié)。
使用BFT共識(shí),每個(gè)節(jié)點(diǎn)不僅僅維護(hù)了區(qū)塊鏈。它還在內(nèi)存中維護(hù)額外的元數(shù)據(jù),以便根據(jù)算法定義的規(guī)則驗(yàn)證塊。此信息還將部分保存在區(qū)塊鏈本身上,以確保節(jié)點(diǎn)在崩潰時(shí)可以重建內(nèi)存中的數(shù)據(jù)集。對(duì)于每個(gè)塊,我們額外保留到區(qū)塊鏈的一個(gè)屬性是委托之前鍛造的高度和鍛造該塊時(shí)預(yù)投票的最大高度。與此同時(shí),每個(gè)節(jié)點(diǎn)將保持最終確定的高度,因此在鏈恢復(fù)的情況下,已經(jīng)確定的塊不能被恢復(fù)。
讓我們進(jìn)入今天的主題——代表們?yōu)閴K投票。
為塊進(jìn)行民主投票
在Lisk生態(tài)系統(tǒng)中,投票并不是什么新鮮事——它是所有授權(quán)的權(quán)益關(guān)系證明(DPoS)協(xié)商共識(shí)算法的核心。LSK代幣持有者可以為代表投票,然后,根據(jù)他們的投票,系統(tǒng)選擇有資格為特定一輪鑄造新區(qū)塊的最高代表。以前,投票制度只用于為代表投票。隨著B(niǎo)FT的引入,這一概念得到了擴(kuò)展。現(xiàn)在,每個(gè)委托者將為每個(gè)塊投一票,唯一的區(qū)別是這些票將由各個(gè)節(jié)點(diǎn)維護(hù)和保存。只有少數(shù)計(jì)算出來(lái)的屬性將與網(wǎng)絡(luò)共享,而不是與整個(gè)投票分類賬共享。系統(tǒng)中的數(shù)學(xué)公式和協(xié)議檢查將確保每個(gè)節(jié)點(diǎn)投出適當(dāng)?shù)倪x票。
與任何投票系統(tǒng)一樣,基本規(guī)則是,作為一個(gè)代表,您只能對(duì)特定高度的塊投一次票。由于兩個(gè)塊不能在同一高度上存在,所以實(shí)際上可以為每個(gè)塊投一次票。這個(gè)過(guò)程稱為預(yù)投票。收集到塊?以上的選票(多數(shù))有資格獲得下一輪的投票。
第二輪投票稱為預(yù)提交,規(guī)則相同 - 一名代表可以預(yù)先提交一個(gè)塊,合格的塊即意味著已經(jīng)獲得了超過(guò)2/3的所有預(yù)投票。最終確定的最高塊將被視為鏈的最終高度。所有高度低于最終確定的塊也將被視為最終確定塊,在任何情況下都不能還原。
還有一些其他的規(guī)則:
1. 代表不能預(yù)先投票,也不能預(yù)先提交他們沒(méi)有參與的那輪投票的區(qū)塊。這樣做是為了避免垃圾投票。因此,我們需要跟蹤委托何時(shí)開(kāi)始活動(dòng)。
2. 代表不能提預(yù)投票和預(yù)提交超過(guò)兩輪,以提高整個(gè)系統(tǒng)的性能。
示例場(chǎng)景#1—四個(gè)委托,都是偽造的
為了更好地理解這個(gè)概念,讓我們舉一個(gè)小例子。假設(shè)網(wǎng)絡(luò)中有四個(gè)活動(dòng)的委托。完成任何塊——至少?(三個(gè)代表)必須同意。
4名代表-全部鍛造
讓我們通過(guò)一個(gè)數(shù)據(jù)模擬來(lái)進(jìn)一步理解這一點(diǎn)。
1. 應(yīng)用區(qū)塊鏈時(shí),需要檢查以下信息: 代表先前偽造的高度、已獲得?的區(qū)塊鏈中最高高度以及上一次委托處于活動(dòng)狀態(tài)的輪數(shù)
2. 委托檢查前預(yù)提交和使所有導(dǎo)向塊?票為止??紤]到規(guī)則,該委托不能兩次預(yù)提交相同的塊。委托也不能預(yù)先提交未激活的塊。此外,由于性能原因,我們不會(huì)在鏈的當(dāng)前高度之后的超過(guò)兩輪執(zhí)行這些預(yù)提交。
3.在每個(gè)塊上,委托將對(duì)所有塊進(jìn)行預(yù)投票??紤]到委托不能對(duì)同一個(gè)塊進(jìn)行兩次預(yù)投票的規(guī)則。代表不能在不活躍的時(shí)候提前投票。此外,出于性能原因,我們不會(huì)從當(dāng)前鏈的高度執(zhí)行超過(guò)兩輪的預(yù)提交。
4. 如圖所示,鏈中的第一個(gè)塊在高度6處有三個(gè)預(yù)提交。這意味著該塊已經(jīng)完成,并且永遠(yuǎn)不會(huì)被還原。
5. 鏈中的其余塊顯然應(yīng)用于鏈。為了解決網(wǎng)絡(luò)中的分叉問(wèn)題,可以適當(dāng)恢復(fù)這些分叉。
6. 你可能會(huì)注意到的塊?選票增加前的預(yù)提交。擁有更多預(yù)投票的塊將有更多的預(yù)提交,并且有更多的機(jī)會(huì)被最終確定。
有一個(gè)重要的事實(shí)需要記住——終結(jié)性不是針對(duì)單個(gè)塊的,而是針對(duì)特定塊的高度。如果完成了一個(gè)塊,這意味著它下面的所有塊也都完成了。由于委托列表(確定鍛造順序的列表)中的更改,最終結(jié)果并不總是按順序遞增的。這意味著有可能有幾個(gè)塊沒(méi)有完成,但是下一個(gè)塊將會(huì)更早完成。在這種情況下,所有先前的塊,高度低于剛剛完成的塊,也將被視為完成。
示例場(chǎng)景#2—四個(gè)委托,缺少插槽
為了進(jìn)一步理解這個(gè)預(yù)投票和預(yù)提交流程,讓我們以具有相同四個(gè)代表的模擬為例,但是這一次代表開(kāi)始丟失他們的插槽。這導(dǎo)致鏈的最終性沒(méi)有平穩(wěn)地增長(zhǎng),而是在最終塊之間有間隙。
在這個(gè)數(shù)據(jù)模擬中,您將注意到第一個(gè)最終確定的塊位于高度6,而鏈位于高度11。之所以會(huì)出現(xiàn)這種情況,是因?yàn)榇韨冨e(cuò)過(guò)了名額,無(wú)法預(yù)投票,也無(wú)法預(yù)先對(duì)之前的區(qū)塊做出提交。但是由于高度6已經(jīng)確定,所以在該高度之前的所有塊也將被認(rèn)為是最終確定的。
示例場(chǎng)景#3 -五個(gè)委托,全部切換
現(xiàn)在讓我們?cè)倥e一個(gè)例子,有五名代表正在偽造,但在第三輪之后,他們都被其他代表取代了。
在這個(gè)模擬中需要注意的關(guān)鍵事實(shí)是,最終的高度是如何從高度1持續(xù)增長(zhǎng)到高度15的。然后從15到30保持靜止?fàn)顟B(tài)。在每個(gè)塊上,委托仍然為新塊投票,但是由于委托不能在非活動(dòng)期間預(yù)先提交任何塊,所以它們沒(méi)有預(yù)先提交舊塊。網(wǎng)絡(luò)將會(huì)增長(zhǎng),但不會(huì)考慮最后確定任何塊。
示例場(chǎng)景#4 - 11個(gè)委托,一個(gè)委托開(kāi)關(guān)
這個(gè)用例更類似于一個(gè)真實(shí)的網(wǎng)絡(luò),在這個(gè)網(wǎng)絡(luò)中,委托列表在幾輪中保持一致,然后只有少數(shù)幾個(gè)委托交換它們的位置。在這個(gè)數(shù)據(jù)模擬中,我們還增加了委托的數(shù)量,這產(chǎn)生了一組令人難以置信的數(shù)字。
在這個(gè)例子中,我們可以看到這個(gè)網(wǎng)絡(luò)的最終結(jié)果是連續(xù)增長(zhǎng)到33,然后停止一段時(shí)間(4個(gè)塊)。最終結(jié)果又開(kāi)始增長(zhǎng)。這種行為更接近實(shí)際生活中的網(wǎng)絡(luò)。
為什么要進(jìn)行這些模擬呢?
您可能想知道為什么我們要完成并開(kāi)發(fā)所有這些數(shù)據(jù)密集型的模擬,盡管邏輯已經(jīng)被記錄下來(lái)了。但理解邏輯部分是復(fù)雜的,可能會(huì)在實(shí)現(xiàn)過(guò)程中導(dǎo)致錯(cuò)誤。這些數(shù)據(jù)模擬使我們對(duì)數(shù)據(jù)流有了清晰的理解,并可視化了BFT共識(shí)性在各種情況下的行為。
與此同時(shí),這些數(shù)據(jù)模擬幫助我們?yōu)閷?shí)現(xiàn)編寫(xiě)測(cè)試,這不僅使實(shí)現(xiàn)變得合理,而且為我們提供了擴(kuò)展和添加更多測(cè)試場(chǎng)景的方法。
我們希望這些數(shù)據(jù)模擬也能幫助您更好地理解BFT共識(shí)建議。再次重申,本文只涉及BFT LIP的一個(gè)方面,即預(yù)投票和預(yù)提交。在LIP中還有很多,比如分叉的選擇規(guī)則和分叉的恢復(fù)機(jī)制,這些結(jié)合起來(lái)就可以完成拜占庭式的容錯(cuò)共識(shí)。
來(lái)源;區(qū)塊網(wǎng)