李 彬 張新有
(西南交通大學(xué)信息科學(xué)與技術(shù)學(xué)院 成都 611756)
區(qū)塊鏈作為數(shù)字加密貨幣的重要底層技術(shù),最早于2008 年由化名為中本聰[1]的學(xué)者提出。區(qū)塊鏈技術(shù)的去中心化、數(shù)據(jù)不可篡改、數(shù)據(jù)安全等特點,使得其在數(shù)字貨幣、物流溯源、數(shù)據(jù)取證和金融交易等領(lǐng)域都有很好的應(yīng)用前景[2]。
當(dāng)前,區(qū)塊鏈發(fā)展成為三種差異化類型:公有鏈,聯(lián)盟鏈,私有鏈[3]。其中,部分去中心化的聯(lián)盟鏈得益于參與節(jié)點數(shù)量較為固定、網(wǎng)絡(luò)規(guī)模較小、節(jié)點的信用度好等特點,具備了交易確認(rèn)延遲低、吞吐量高、耗能小等優(yōu)勢,因此在近年來得到迅速發(fā)展。共識算法作為區(qū)塊鏈中最為核心的技術(shù),對區(qū)塊鏈的整體性能表現(xiàn)有著直接的影響。現(xiàn)有的許多適用于公有鏈場景的共識算法,因為有著巨大的共識成本和算力開銷,明顯不適用于聯(lián)盟鏈場景下的區(qū)塊鏈[3]。2014 年,隨著IBM 的聯(lián)盟鏈項目Hyperledger Fabric 的推出[4],人們把目光聚焦到了實用拜占庭容錯算法(Practical Byzantine Fault Tolerance,PBFT)。
本文針對聯(lián)盟鏈的應(yīng)用場景,分析了PBFT 共識機(jī)制存在的不足,并基于PBFT算法的思想,提出了一種分級的共識方案(Graded Byzantine Fault Tolerance,GBFT),以期在系統(tǒng)的長期運(yùn)行中達(dá)到更高的共識效率和吞吐量及更低的資源消耗。
一致性問題是分布式系統(tǒng)面臨的核心問題之一。分布式系統(tǒng)中如果僅存在非拜占庭錯誤,如網(wǎng)絡(luò)延遲、節(jié)點宕機(jī),可以通過Paxos[5]和Raft[6]等算法解決一致性問題。但是區(qū)塊鏈網(wǎng)絡(luò)作為一個低信任的分布式系統(tǒng),節(jié)點之間屬于互相不了解的參與者。受到利益的驅(qū)使,網(wǎng)絡(luò)中還可能產(chǎn)生拜占庭錯誤[7]。拜占庭錯誤是指存在節(jié)點主動向其他節(jié)點發(fā)送錯誤信息的可能,拜占庭節(jié)點指可以產(chǎn)生拜占庭錯誤的節(jié)點。在一個存在拜占庭節(jié)點的系統(tǒng)中,需要使用有拜占庭容錯能力的共識算法[8]。目前主流的區(qū)塊鏈共識機(jī)制主要有工作量證明、權(quán)益證明、股份授權(quán)證明以及實用拜占庭容錯算法等[9]。
工作量證明(PoW)的概念最早由Cynthia Dwork 和Moni Naor 在1993 年的論文中提出,主要用于解決當(dāng)時日益嚴(yán)重的垃圾郵件問題[10]。幾年后,Markus Jakobsson 和Ari Juels 正式提出了術(shù)語“Proof of Work”,并給出了PoW 的形式化定義[11]。在一個區(qū)塊鏈網(wǎng)絡(luò)中,必須有負(fù)責(zé)記錄交易的節(jié)點存在,最簡單的方法是進(jìn)行隨機(jī)選擇。然而,隨機(jī)選擇會使系統(tǒng)隨時暴露在可被攻擊的環(huán)境中。因此,如果一個節(jié)點想要發(fā)布一個交易區(qū)塊,就必須完成大量的工作來證明該節(jié)點幾乎沒有惡意攻擊網(wǎng)絡(luò)的可能性。一般來說,上述所謂的“工作”即計算機(jī)算力。工作量證明機(jī)制的優(yōu)點在于算法簡單、去中心化程度高、網(wǎng)絡(luò)擴(kuò)展性強(qiáng)、節(jié)點加入退出靈活。它的缺點是無用的工作量計算導(dǎo)致能源、算力等資源的嚴(yán)重浪費。此外,PoW 共識的效率較低,過長的出塊時間和交易確認(rèn)時間難以滿足現(xiàn)實需求。
權(quán)益證明(PoS)[12]試圖通過將采礦能力與節(jié)點持有的權(quán)益相聯(lián)系來解決PoW 中算力競爭的問題。PoS 的核心思想是持有較高權(quán)益的節(jié)點有更大的可能性來獲得區(qū)塊打包權(quán)。在使用PoS 機(jī)制的網(wǎng)絡(luò)中,依然需要節(jié)點求解PoW 中類似的數(shù)學(xué)難題。但是每個節(jié)點面對的數(shù)學(xué)難題的難度是不同的,這個難度與節(jié)點持有的代幣數(shù)量正相關(guān)。這意味著節(jié)點持有的代幣數(shù)量越多,它所需要求解的數(shù)學(xué)難題的難度越低,那么該節(jié)點解出這個難題并獲得區(qū)塊打包權(quán)的概率也就越大。PoS 的去中心化能力、網(wǎng)絡(luò)擴(kuò)展性與PoW 相當(dāng),同時還有效降低了對資源的浪費。但是PoS 中存在的“無利害攻擊”,“長程攻擊”等問題也讓PoS 的安全性備受質(zhì)疑。
股份授權(quán)證明(DPoS)[13],可以看做PoS的一個變種,由Bitshares 的首席開發(fā)者Dan Larimer 提出并應(yīng)用。它通過實施去中心化的民主方式,每個節(jié)點可以將其持有的權(quán)益作為選票投給一名代表。系統(tǒng)將選出得票較高的前N 個節(jié)點組成見證人網(wǎng)絡(luò)。見證人網(wǎng)絡(luò)中的節(jié)點使用專業(yè)運(yùn)行的網(wǎng)絡(luò)服務(wù)器,收集交易、打包區(qū)塊,引導(dǎo)促進(jìn)區(qū)塊鏈項目的發(fā)展。在完成本職工作的同時,這些節(jié)點還可以領(lǐng)取區(qū)塊獎勵和交易手續(xù)費。DPoS 通過投票、選舉降低了參與共識的節(jié)點數(shù)目,因此與POS、POW 相比,它具有更低的交易處理時延和更高的吞吐量。但是DPoS中存在的“超級節(jié)點”也讓它的去中心化能力備受爭議。
實用拜占庭容錯(PBFT),最早由Castro等[14]在1999 年提出,是解決存在拜占庭節(jié)點的分布式系統(tǒng)一致性問題的通用方案。PBFT算法基于狀態(tài)機(jī)復(fù)制原理(State Machine Replication)[15],主要由三個協(xié)議組成:一致性協(xié)議、檢查點協(xié)議以及視圖更換協(xié)議。區(qū)塊生成過程中,一致性協(xié)議用來保證全網(wǎng)所有的節(jié)點保存數(shù)據(jù)的一致性,其通過三階段節(jié)點間的互相通信來實現(xiàn);當(dāng)運(yùn)行一致性協(xié)議無法達(dá)成一致時產(chǎn)生超時事件,啟動視圖更換協(xié)議進(jìn)行視圖轉(zhuǎn)換,以保證節(jié)點之間順利達(dá)成共識;檢查點協(xié)議主要有兩個用途:一是定期清除節(jié)點的過期數(shù)據(jù),以減輕存儲壓力;二是檢查系統(tǒng)狀態(tài),將系統(tǒng)中的節(jié)點同步到一個相同狀態(tài)。目前在區(qū)塊鏈領(lǐng)域中,PBFT 共識機(jī)制主要應(yīng)用于聯(lián)盟鏈場景,例如hyperledger fabric(v0.6)、FISCO BCOS[16]等聯(lián)盟鏈平臺都在進(jìn)行該共識機(jī)制的實際部署應(yīng)用。
在PBFT 算法中,一個消息從發(fā)起到達(dá)成共識需要經(jīng)過5 個階段。圖1 中,C 代表客戶端,0、1、2、3 表示4 個參與共識的節(jié)點,其中節(jié)點3 為拜占庭節(jié)點。具體步驟如下:

圖1 PBFT算法的一致性協(xié)議
1)request階段:客戶端發(fā)送請求到主節(jié)點;
2)pre-prepare階段:主節(jié)點收到客戶端請求后將其封裝為一個pre-prepare 消息,然后將pre-prepare消息廣播給從節(jié)點;
3)prepare 階段:從節(jié)點收到pre-prepare 證書后將其封裝為prepare 消息,并廣播給其他從節(jié)點,從節(jié)點進(jìn)入pre-prepared狀態(tài);
4)commit 階段:當(dāng)系統(tǒng)中存在f 個拜占庭節(jié)點時,要求系統(tǒng)中總節(jié)點數(shù)量不能小于3f+1。若一個節(jié)點收到包括自己節(jié)點prepare消息在內(nèi)的2f+1 個prepare 消息后,則該節(jié)點進(jìn)入prepared 狀態(tài),并向其他節(jié)點廣播commit消息;
5)reply 階段:節(jié)點收到包括自己節(jié)點的commit消息在內(nèi)的2f+1個commit消息后進(jìn)入commited狀態(tài),并向客戶端返回reply響應(yīng)消息。
傳統(tǒng)拜占庭容錯算法由于指數(shù)級別的時間復(fù)雜度而難以在實際系統(tǒng)中應(yīng)用。PBFT算法則將時間復(fù)雜度降到了多項式級別,還能提供1/3 的容錯性。但PBFT算法的缺點也很明顯。一是算法在收到客戶端請求之后,需要經(jīng)過5 個階段才能達(dá)成共識。其中prepare階段與commit階段是全節(jié)點參與的廣播過程,使得共識過程產(chǎn)生巨大的通信開銷;二是PBFT算法中的主節(jié)點由所有節(jié)點依次輪流擔(dān)當(dāng),這種主節(jié)點選擇策略過于隨意,使得主節(jié)點身份可以被輕易預(yù)測,增加了其被攻擊的風(fēng)險;三是算法中的每個節(jié)點都維護(hù)了一個固定的節(jié)點列表,缺少節(jié)點的加入、退出機(jī)制,不能靈活應(yīng)對網(wǎng)絡(luò)規(guī)模的動態(tài)變化。
不同的共識算法在不同的評判項目中,具有不同的表現(xiàn)。對上述4 種共識算法,從高往低分別用5分至1分對各項評測功能點做出評測,結(jié)果如表1所示[17]。

表1 四種共識算法性能比較
除以上四種經(jīng)典共識算法外,近年來還涌現(xiàn)了多種新型共識算法,如Algorand[18]、Omniledger[19]、Rapidchain[20]、2-hop[21]。這些算法本質(zhì)上都是多種經(jīng)典共識算法融合的產(chǎn)物,它們不約而同地體現(xiàn)了同一個共識算法改進(jìn)思路:基于實際應(yīng)用場景對處理效率和規(guī)模的不同需求,將各具優(yōu)勢的共識算法相融合,取長補(bǔ)短,從而在各項指標(biāo)中取得最佳平衡。這也是本文提出的改進(jìn)方案的基本思路。
由圖1 知,PBFT 算法的一致性協(xié)議中有兩個階段(prepare 階段和commit 階段)的全節(jié)點廣播。隨著節(jié)點數(shù)量的增加,網(wǎng)絡(luò)中的通信開銷會增長迅速,影響算法的共識效率。針對此問題,結(jié)合聯(lián)盟鏈的特點,本文引入了非拜占庭容錯的共識協(xié)議,以降低節(jié)點之間的通信開銷;為了配合非拜占庭容錯的共識協(xié)議,同時提出了一種基于節(jié)點行為的選舉制度;在非拜占庭容錯協(xié)議、選舉機(jī)制、PBFT 容錯協(xié)議的基礎(chǔ)上構(gòu)建了三級共識機(jī)制。
根據(jù)模塊功能的不同,可以將一個使用PBFT共識機(jī)制的區(qū)塊鏈系統(tǒng)抽象為四個層次[22](圖2):應(yīng)用層、執(zhí)行引擎層、共識層、數(shù)據(jù)層。其中,應(yīng)用層代表各種基于區(qū)塊鏈網(wǎng)絡(luò)的應(yīng)用;執(zhí)行引擎層提供了區(qū)塊鏈網(wǎng)絡(luò)的運(yùn)行時環(huán)境;共識層定義了系統(tǒng)所使用的共識協(xié)議;數(shù)據(jù)層定義了區(qū)塊、交易等結(jié)構(gòu)以及與這些結(jié)構(gòu)相關(guān)的增刪改查操作。通過2.4節(jié)的分析可知,PBFT 共識機(jī)制的性能瓶頸主要在于準(zhǔn)備階段和提交階段的兩次全節(jié)點廣播。隨著區(qū)塊鏈網(wǎng)絡(luò)中節(jié)點數(shù)目的增多,網(wǎng)絡(luò)通信量會急劇增長,從而增加帶寬的壓力,導(dǎo)致了交易確認(rèn)時間長、吞吐量低、網(wǎng)絡(luò)擴(kuò)展性差等問題。

圖2 使用PBFT共識機(jī)制的區(qū)塊鏈系統(tǒng)架構(gòu)
針對PBFT 共識機(jī)制的性能瓶頸,本文提出以下三點舉措解決問題。
1)引入非拜占庭容錯的一致性協(xié)議。在聯(lián)盟鏈場景中,節(jié)點都是經(jīng)過一定準(zhǔn)入機(jī)制才能加入?yún)^(qū)塊鏈網(wǎng)絡(luò),這使得聯(lián)盟鏈中的節(jié)點相比公有鏈中的節(jié)點有更高的可信度。據(jù)此可以認(rèn)為聯(lián)盟鏈中大多數(shù)情況下是沒有拜占庭節(jié)點的,此時在網(wǎng)絡(luò)中運(yùn)行拜占庭容錯的一致性協(xié)議并不是十分必要。因此,可以在在共識層引入一種非拜占庭容錯的一致性協(xié)議。系統(tǒng)根據(jù)網(wǎng)絡(luò)中節(jié)點狀態(tài)來選擇執(zhí)行不同的一致性協(xié)議:當(dāng)參與共識的節(jié)點中不存在拜占庭節(jié)點時,運(yùn)行非拜占庭容錯協(xié)議;當(dāng)使用非拜占庭容錯協(xié)議無法達(dá)到一致時,運(yùn)行PBFT 的一致性協(xié)議。
2)設(shè)計基于節(jié)點行為的選舉機(jī)制。引入非拜占庭容錯協(xié)議的同時也引發(fā)了另外一個問題,即網(wǎng)絡(luò)中存在拜占庭節(jié)點時,使用非拜占庭容錯協(xié)議無法達(dá)到一致,那么就需要切換到PBFT 的一致性協(xié)議。如果在存在拜占庭節(jié)點的網(wǎng)絡(luò)中使全節(jié)點都參與非拜占庭容錯協(xié)議,實際上共識機(jī)制不僅會退化為普通的PBFT 算法,還會因為頻繁的協(xié)議切換帶了更大的共識成本。因此需要設(shè)計一種選舉機(jī)制,選出部分節(jié)點參與非拜占庭容錯協(xié)議,且選出的節(jié)點應(yīng)當(dāng)盡量避免包含拜占庭節(jié)點。
3)提出三級共識機(jī)制。在計算機(jī)結(jié)構(gòu)的三級存儲體系中,計算機(jī)的存取速度接近于緩存的速度,而存儲容量由硬盤所決定。基于這種思想,提出三級共識機(jī)制。首先由選舉出的部分節(jié)點參與非拜占庭容錯協(xié)議作為第一級共識,第一級共識無法達(dá)成一致的情況下進(jìn)入第二級共識。第二級共識是部分節(jié)點參與的PBFT 一致性協(xié)議,當(dāng)?shù)诙壒沧R無法達(dá)成一致時進(jìn)入第三級共識。第三級共識就是原始的全節(jié)點參與的PBFT共識。最終希望達(dá)到的效果就是整個網(wǎng)絡(luò)的共識效率由第一級共識決定,而系統(tǒng)的容錯性由第三級共識決定。
綜上,在共識層應(yīng)用GBFT 算法的區(qū)塊鏈系統(tǒng)架構(gòu)如圖3所示。

圖3 使用GBFT共識機(jī)制的區(qū)塊鏈系統(tǒng)架構(gòu)
3.2.1 非拜占庭容錯協(xié)議
引入非拜占庭容錯協(xié)議的目的在于簡化PBFT共識協(xié)議中prepare階段和commit階段中的全節(jié)點廣播通信,本文采用了參考文獻(xiàn)[23]中提出的簡化一致性協(xié)議,如圖4所示,具體內(nèi)容為

圖4 非拜占庭容錯協(xié)議
1)主節(jié)點廣播pre-prepare消息到從節(jié)點,從節(jié)點驗證消息內(nèi)容后向主節(jié)點回復(fù)確認(rèn)消息;
2)主節(jié)點收到所有從節(jié)點的確認(rèn)消息后,廣播confirm 消息到從節(jié)點,從節(jié)點驗證消息內(nèi)容后向主節(jié)點回復(fù)確認(rèn)消息;
3)主節(jié)點收到所有節(jié)點的確認(rèn)消息則代表達(dá)成共識,否則意味著共識失敗。
3.2.2 選舉機(jī)制
在引入非拜占庭容錯協(xié)議的系統(tǒng)中,系統(tǒng)優(yōu)先選擇非拜占庭容錯協(xié)議作為共識協(xié)議,當(dāng)非拜占庭容錯協(xié)議無法達(dá)成一致時再切換到PBFT的一致性協(xié)議。為了避免不同協(xié)議頻繁切換帶來的額外開銷,我們希望每次參與非拜占庭容錯協(xié)議的節(jié)點都是誠實節(jié)點,為此系統(tǒng)中設(shè)計了一個基于節(jié)點行為的選舉機(jī)制。
在區(qū)塊鏈網(wǎng)絡(luò)中,每個節(jié)點都由一個信用分屬性。所有節(jié)點被劃分為兩類:共識節(jié)點、非共識節(jié)點。共識節(jié)點與非共識節(jié)點的比例為1∶1。選舉模塊選取共識節(jié)點時遵循兩個原則:一是信用分高的節(jié)點優(yōu)先;二是信用分相同時編號較小的節(jié)點優(yōu)先。共識過程中,首先由共識節(jié)點參與一級共識,若達(dá)成一致,則每個參與節(jié)點可獲得2 信用分;若無法達(dá)成一致,參與節(jié)點扣3 信用分,然后進(jìn)入二級共識。若系統(tǒng)執(zhí)行二級共識達(dá)成一致,每個參與節(jié)點獲得1 信用分;若無法達(dá)成一致,每個參與節(jié)點扣2 信用分,然后進(jìn)入三級共識。三級共識執(zhí)行的是全節(jié)點參與的PBFT 一致性協(xié)議,三級共識中不再對節(jié)點信用分進(jìn)行增減。如此往復(fù),節(jié)點會因為自身行為而獲取、損失信用分,分值代表了節(jié)點的可信度。圖5 是一個節(jié)點的信用分的狀態(tài)轉(zhuǎn)換圖,其中X代表一個節(jié)點的信用分。

圖5 節(jié)點信用分狀態(tài)轉(zhuǎn)換圖
共識節(jié)點選舉機(jī)制將會在以下三種情況發(fā)生時被觸發(fā):
1)區(qū)塊鏈系統(tǒng)啟動的初始時刻。此時所有節(jié)點信用分為0,根據(jù)信用分相同時編號較小的節(jié)點優(yōu)先原則,選舉模塊將選擇編號較小的前50%節(jié)點作為共識節(jié)點。
2)發(fā)生了共識級別轉(zhuǎn)換。若某次請求的共識過程中發(fā)生了共識級別轉(zhuǎn)換,意味著共識節(jié)點集合中存在拜占庭節(jié)點。最壞情況下,該請求依然可以通過三級共識在各節(jié)點間達(dá)成一致,然而在下一個請求到來時共識節(jié)點集合中還是存在拜占庭節(jié)點,那么通過一級共識始終無法達(dá)成一致,總是要執(zhí)行共識級別轉(zhuǎn)換,帶來額外的資源消耗。因此,每當(dāng)發(fā)生了共識級別轉(zhuǎn)換,在當(dāng)前請求完成后,都要重新進(jìn)行共識節(jié)點選舉。
3)共識節(jié)點強(qiáng)制選舉計時器超時。共識節(jié)點長時間運(yùn)行一級共識會使這些節(jié)點始終處于忙碌狀態(tài),而非共識節(jié)點無法獲得信用分,沒有上升通道,也浪費了算力。為了避免這種情況的發(fā)生,在系統(tǒng)中設(shè)定一個共識節(jié)點強(qiáng)制選舉計時器。當(dāng)該計時器超時,將所有節(jié)點信用分清零,強(qiáng)制進(jìn)行共識節(jié)點選舉。共識節(jié)點編號ni由式(1)和式(2)計算得出。
其中:timestamp為共識節(jié)點強(qiáng)制選舉計時器超時時刻的時間戳,N為節(jié)點總數(shù)。
3.2.3 三級共識機(jī)制
為了進(jìn)一步提高共識效率與網(wǎng)絡(luò)擴(kuò)展性,結(jié)合非拜占庭容錯協(xié)議、PBFT 一致性協(xié)議以及選舉機(jī)制,提出的三級共識機(jī)制流程如圖6所示。

圖6 三級共識算法流程
具體內(nèi)容為
1)選舉產(chǎn)生共識節(jié)點。
2)接收來自客戶端的交易請求。
3)共識節(jié)點執(zhí)行一級共識。若達(dá)成一致,進(jìn)入6);否則,進(jìn)入4)。
4)執(zhí)行共識級別轉(zhuǎn)換,共識節(jié)點參與二級共識。若達(dá)成一致,進(jìn)入6);否則,進(jìn)入5)。
5)執(zhí)行視圖轉(zhuǎn)換,所有節(jié)點參與三級共識。若達(dá)成一致,進(jìn)入6);否則,繼續(xù)執(zhí)行5)。
6)所有節(jié)點接受共識結(jié)果,執(zhí)行客戶端請求。7)更新每個節(jié)點的信用分。
8)若發(fā)生了共識級別轉(zhuǎn)換,則選舉產(chǎn)生新的共識節(jié)點。
9)一次請求結(jié)束。
本章從吞吐量、交易確認(rèn)時延和容錯性能等三方面分別對原始PBFT 和GBFT 進(jìn)行測試。通過對照,驗證了改進(jìn)方案的有效性和可用性。
租用了一臺云服務(wù)器作為實驗平臺,在服務(wù)器上安裝了Ubuntu 操作系統(tǒng)以及docker、docker-compose、Go 語言等基本環(huán)境。然后在Hyperledger Fabric 原生的PBFT 算法的基礎(chǔ)上實現(xiàn)了GBFT。最后在服務(wù)器上分別對應(yīng)用原始PBFT 算法的Hyperledger Fabric 和應(yīng)用GBFT 算法的Hyperledger Fabric 進(jìn)行測試。實驗平臺的軟硬件配置如表2所示。

表2 實驗環(huán)境配置信息表
吞吐量是衡量系統(tǒng)運(yùn)行效率的一個重要標(biāo)準(zhǔn)。在區(qū)塊鏈網(wǎng)絡(luò)中,一般用每秒交易數(shù)(tps)來表示,即:
其中:transactions 為出塊時間內(nèi)系統(tǒng)處理交易數(shù),t為出塊時間。設(shè)計兩種共識機(jī)制在4、5、6、7、8 個節(jié)點下的對照實驗,多次測試取平均值,實驗結(jié)果如圖7所示。

圖7 兩種算法的吞吐量比較
從圖7 的實驗結(jié)果可以看出,隨著網(wǎng)絡(luò)中節(jié)點數(shù)目的增加,兩種情況下吞吐量都下降明顯。這是因為節(jié)點數(shù)目的增加使得網(wǎng)絡(luò)中通信開銷增大,導(dǎo)致網(wǎng)絡(luò)運(yùn)行效率下降。還可以看出,在節(jié)點數(shù)目相同的情況下,相比于原始PBFT 算法,GBFT 始終具有更高的吞吐量。
交易確認(rèn)時延指客戶端發(fā)送一個交易請求到客戶端確認(rèn)交易完成的時間間隔,即:
其中:Tconfirm為交易得到確認(rèn)的時間,Trequest為發(fā)送交易請求的開始時間。設(shè)計兩種共識機(jī)制在4、5、6、7、8 個節(jié)點下的對照實驗,多次測試取平均值,實驗結(jié)果如圖8所示。帶來的通信成本增加所導(dǎo)致的結(jié)果,但是原始PBFT算法的時延上升速率更大,而GBFT由于引入了非拜占庭容錯一致性協(xié)議與選舉機(jī)制,使得它的時延上升速率是隨節(jié)點數(shù)目的增加而下降的。此外,在節(jié)點數(shù)目相同的情況下,相比于PBFT,GBFT始終具有更低的交易確認(rèn)時延。

圖8 兩種算法的交易確認(rèn)時延比較
圖8 中,兩種方案的交易確認(rèn)時延都隨節(jié)點數(shù)目的增加呈上升趨勢,這同樣是由節(jié)點數(shù)目的增加
設(shè)區(qū)塊鏈網(wǎng)絡(luò)中共有N(N ≥4)個節(jié)點,其中有F 個拜占庭節(jié)點。改進(jìn)方案中,系統(tǒng)會根據(jù)節(jié)點信用度的高低選出N/2 個節(jié)點納入共識節(jié)點組,設(shè)共識節(jié)點組中的拜占庭節(jié)點數(shù)目為f(f ≤F),則有:
1)第一級共識:共識節(jié)點組參與簡化協(xié)議。若共識節(jié)點組中沒有拜占庭節(jié)點,即f=0,則順利達(dá)成一致;若f ≥1,則通過非拜占庭容錯協(xié)議無法達(dá)成一致,進(jìn)入第二級共識。
2)第二級共識:共識節(jié)點組參與PBFT 共識協(xié)議。若1 ≤f≤(N/2-1)/3,已知PBFT算法的容錯性為(N-1)/3,可知第二級共識順利達(dá)成一致;若f>(N/2-1)/3,則第二級共識無法達(dá)成一致,進(jìn)入第三級共識。
3)第三級共識:全節(jié)點參與PBFT 共識。此時共識機(jī)制退化為原始的PBFT 算法,有f=F。當(dāng)f≤(N-1)/3 時,節(jié)點之間順利達(dá)成一致;當(dāng)f >(N-1)/3,整個網(wǎng)絡(luò)無法達(dá)成一致。
以上分析證明,GBFT 的容錯性是由第三級共識的容錯性決定的。即采用GBFT 作為共識機(jī)制的區(qū)塊鏈網(wǎng)絡(luò)中共N個節(jié)點時,整個網(wǎng)絡(luò)可以提供(N-1)/3的容錯性。
基于PBFT 算法的思想,結(jié)合聯(lián)盟鏈應(yīng)用場景中節(jié)點可信度相對更高的特點,提出一種改進(jìn)的共識算法。首先在保留PBFT一致性協(xié)議的同時引入了非拜占庭容錯協(xié)議,以降共識過程中的通信開銷;為了避免兩種一致性協(xié)議的頻繁切換帶來的額外開銷,提出了基于節(jié)點行為的選舉機(jī)制;最后在非拜占庭容錯協(xié)議、選舉機(jī)制、PBFT一致性協(xié)議的基礎(chǔ)上構(gòu)建了三級共識機(jī)制。實驗結(jié)果表明,相比于PBFT 算法,本文提出的GBFT 算法有效提高了區(qū)塊鏈網(wǎng)絡(luò)的吞吐量,降低了交易確認(rèn)時延,同時還保持了PBFT 算法的容錯性。在GBFT 中,將信用分排名前50%的節(jié)點納入了共識節(jié)點集,這樣的設(shè)定可能無法適用于所有的應(yīng)用場景。下一步的工作中可以考慮將共識節(jié)點集的容量設(shè)置為一個可配置的參數(shù),以靈活調(diào)整網(wǎng)絡(luò)的去中心化程度。