段 靚,呂 鑫,b,劉 凡,b
(河海大學 a.計算機與信息學院; b.海岸災害及防護教育部重點實驗室,南京 210098)
區塊鏈作為一種去中心化的分布式系統,鏈上的數據需要在全網節點間進行一致性分發和冗余存儲,以此保證數據無法被篡改或偽造[1]。這一特性是區塊鏈技術的優勢,但也是區塊鏈應用的瓶頸。區塊鏈系統需要消耗大量的計算、存儲和網絡資源實現全網節點間的數據和業務協同,這使得區塊鏈系統在業務處理上的性能遠低于傳統中心化的系統[2],而且網絡規模越大,這種差異就越明顯。
公有鏈的共識算法主要是從PoW(Proof of Work)和PoS(Proof of Stake)這2種算法上派生演化的,而聯盟鏈共識算法則大多基于經典分布式一致性算法CFT(Crash Fault Tolerance)和BFT(Byzantine Fault Tolerance)[3-4]。無論是公有鏈還是聯盟鏈,采用分片技術和并行技術都可以解決區塊鏈平臺擴展性問題。分片技術包括計算分片、通信分片和存儲分片,例如公有鏈采用的多鏈、跨鏈等混合共識機制[5],聯盟鏈采用的分組、分層共識機制等[6]。
本文提出一種基于信任委托的分層共識優化機制。該機制將共識網絡劃分成不同的子區域,子區域內的節點根據可信程度選舉出代理人委托其參與全局共識。
本文重點研究聯盟鏈的共識算法,這是因為公有鏈目前最廣泛的應用場景還是開放環境中的加密貨幣,而在政府和企業級應用場景中,節點都是經過身份認證的,因此多采用聯盟鏈架構[7]。
聯盟鏈中最通用的共識協議就是實用拜占庭容錯(Practical Byzantine Fault Tolerance,PBFT),其本質是一種基于投票的共識機制[8]。當節點數增大時,共識交互消息會成幾何倍數增長。如果節點分布在互聯網上,網絡延時會導致共識協議時間迅速增加,嚴重影響共識服務的吞吐量。為解決這一問題,業界主要從優化共識協議和改進共識架構兩方面開展研究[9]。
1)優化共識協議。文獻[10]提供一種基于聚合簽名的優化方法dBFT,將m條消息簽名聚合為1條,空間復雜度降為原先的1/m,但計算復雜度提升為O(3m)。文獻[11]提出一種基于環簽名的PBFT區塊鏈共識算法改進方案,節點在環簽名時自行組成環,使PBFT算法能夠支持節點的動態加入與退出,從而提高超時導致的共識效率低下問題。文獻[12]提出一種基于投票機制的優化算法VPBFT。通過引入投票證明將共識節點分成投票人、管理人、候選人和普通用戶,候選人由投票人選舉產生。生產節點根據任期內是否生成有效的數據塊來獲得相應的分數,分數高的節點將允許進入下一輪投票。該方法消耗的帶寬是PBFT的2/3。文獻[13]提出一種基于Gossip協議的PBFT算法。該算法將PBFT的消息廣播改為利用Gossip協議,節點自行選擇鄰近節點進行信息交換。通過主動探測故障節點,使共識網絡可以容錯一半的節點,達到XFT容錯能力。文獻[14]提出一種不依賴計算能力的共識算法C-BFT。在主從多鏈模型中,使用時間閾值來約束各鏈之間的共識協作,動態調整節點間的通信延遲,確保主鏈節點在時間閾值內寫入數據。另有一些算法采用基于DAG的分布式賬本改進性能,通過節點中非同步的平行共識來加快數據傳輸。文獻[15]提出一種基于Lachesis協議的PBFT算法ONLAY,使用分層和層次化的DAG圖對數據進行異步排序以保障共識完成的時間。基于該算法的Fantom平臺能達到300K TPS的吞吐量。
2)改進共識架構。無論是采用橫向分片還是縱向分層擴展,其本質上都是將節點劃分為各自獨立的空間。文獻[16]針對聯盟鏈提出一種多中心動態共識機制,設計了一種主從多鏈結構,全局區塊鏈鏈接多個主體區塊鏈。每個主體(即中心)包含若干區塊鏈節點,維護本主體的交易區塊鏈(即從鏈),所有主體再共同維護全局區塊鏈(即主鏈)。當構建全局區塊時,每一輪都要由一個全局主節點從全網選出下一輪的全局節點,采用并行方式構建Merkle樹。該方法采用驗證群組來解決數據全局一致性的問題。文獻[17]提出一種基于“組”的層次結構,將所有節點劃分為若干組,每組有一個主節點。層次共識分為局部和全局2個階段。首先,客戶節點將請求廣播給所有節點,每一個分組都要在組內進行一次請求的局部共識;然后,各個分組的主節點再進行一次全局共識,至此,整個請求才算完成。文獻[18]提出一種可伸縮動態多代理層次化的PBFT算法SDMA-PBFA,可以將共識過程中的通信消息復雜度從O(n2)降至O(n·k·logkn)[18]。其基本思想是將節點劃分為若干組,每個組選出一個節點作為代理人。客戶節點請求先分發給所有代理人,代理人再在分組內部完成共識過程,最后由各個代理人通知客戶節點請求完成。文獻[19]同樣采用節點分組的方式,每個分組有一個領導人,PRE-PREPARE、PREPARE和COMMIT 3個階段都需要本組節點和其他組領導人節點參與。文獻[20]采用樹形拓撲構建共識網絡,引入信譽模型降低錯誤節點在共識過程中的影響,但共識消息仍要通過子網的父節點分發到子網內進行三階段共識。
盡管上述研究通過采用分片技術和代理人節點能夠降低共識消息復雜度,提升共識性能,但卻沒有很好地解決以下問題:即如何對成員可靠性進行檢測和評估,確保選出可信的委員會成員,以保障共識網絡拓撲的穩定;如果委員會成員是高可信的,分片共識協議能否進一步簡化,以提升共識網絡的吞吐量,如果委員會成員行為異常,共識協議能否采取主動干預機制,以減輕共識請求時間的波動。
針對上述問題,本文提出一種基于信任委托的分層共識優化機制,在保證整體共識過程滿足PBFT協議有效性、一致性和完整性要求的同時,降低每個階段參與共識的節點數量,提升共識網絡的吞吐量。
本文的設計思想包含信任、層次化和委托3個核心概念。下文分別定義這3個概念的內涵。
1)信任。在社會治理領域,聯盟鏈是更適合政府和企業構建行業應用的區塊鏈方案。這是因為加入聯盟鏈的節點需要經過審核和授權,節點的行為狀態相對穩定,可以建立信任關系[21]。這里的“信任關系”不是主觀設定的關系,而是根據節點在生成區塊過程中的行為進行客觀地評價。運行速度快、能和大多數節點形成一致共識的節點,其信任度就高;經常響應超時、共識消息發生錯誤的節點,其信任度就低。將節點依據信任度劃分成不同類型的節點后,就可以為不同節點分配共識過程中不同的任務。
2)層次化。在各行各業的分布式業務系統中,業務節點的交互和數據都存在局部現象。這是因為社會網絡作為一種復雜網絡,宏觀上有“小世界”,中觀上有“群聚特性”,微觀上有“中心性”“聚類性”等特征。聯盟鏈在實際場景中,節點也同樣具有小世界現象。例如大型機構設立分支機構,省局下設地市和區縣分局,中心節點和邊緣節點協同處理業務請求。基于此思想,可以將區塊鏈平臺在同一平面內的節點進行層次化,劃分成若干個相互獨立的子區域。節點的信任度只要根據節點與子區域內節點交互的行為進行評價,即只需得到子區域內的節點認可。
3)委托。委托是在完成節點層次化和建立的節點信任度之后進行的。每個子區域有信任度的節點能被其他節點委托參與共識,經常故障或狀態異常的不可信節點不得參與共識。信任度高的節點可以作為子區域的代表,被委托參與各個子區域之間的協調共識。
本文的層次化不同于基于分片技術的共識算法。分片通常是指針對鏈上數據進行劃分,構建不同的子鏈,而本文是針對節點的交互范圍對節點進行劃分,降低共識過程的網絡復雜度。此外,基于信任度的劃分,使得共識算法可以充分考慮節點的時延、抖動、吞吐量、失敗率等性能指標,從而確保共識服務質量。
本文提出的共識機制是一個基于“監控-評價-反饋”的流程,包含狀態監控、信任度評價、委托代理人和分層共識4個部分,如圖1所示。其中,節點狀態監控是基礎,信任度評價是核心,委托代理人是手段,分層共識是目標,4個階段相互關聯,循環往復。

圖1 監控-評價-反饋系統流程Fig.1 Procedure of monitor-evaluate-feedback system
狀態監控包括節點狀態監控和共識過程監控。前者主要檢測節點的網絡和服務狀態,例如服務是否在線、節點是否宕機等;后者則監控節點共識過程中的行為,例如完成消息的時間、共識的結果等。
信任度評價根據狀態監控的數據計算節點信任度的各個影響因子,進而對當次共識過程中節點的表現進行評價。信任度更新則是結合節點過往信任度,合理穩健地更新節點的信任度,保障節點信任狀態的穩定。
委托代理人則依據各個節點的信任度,選舉出不同級別的代理人參與分層共識。在分層共識的過程中,共識算法還會依據節點的信任狀態動態選擇可靠的共識節點,識別故障或惡意節點,并提前干預,從而改善共識算法的性能,提升系統共識效率。

對共識節點可信度的評價主要基于節點的3種行為,即正常、故障和惡意行為。節點的不同行為會導致信任度發生相應變化。在上一輪評估信任度的基礎上,正常行為會增加信任度,故障行為會減少信任度,一旦發現惡意行為,信任度直接歸0。
根據信任度的大小進一步將節點分成4種類型。使用3個閾值Ctrust、Cnormal和Cabnormal分別表示可信節點、普通節點和故障節點的信任度下限,也就是各類型節點的信任度閾值,其值滿足Ctrust>Cnormal>Cabnormal。Ctrust默認值為0.8,Cnormal默認值為0.5,Cabnormal默認值為0.2。系統初始化時節點狀態均為普通節點,如果某節點長期穩定運行,性能優越,則隨著其可信度增高,節點將會升級為可信節點;如果某節點運行不穩定,可信度會逐步降低,節點降級為故障節點;如果節點故障長時間得不到修復,可信度降至Cabnormal之下,或者被檢測存在惡意行為,則將被立刻標記為惡意節點,并拒絕其參與共識過程。
信任度的計算基于對節點行為的評估,節點行為可以從不同角度描述。例如有的節點活躍度高,頻繁參與共識,有的節點運行不穩定,經常超時等等。這些不同的表現可通過節點活躍情況、總體運行狀況、事務影響程度、節點行為等因素來體現。這些因素可以統稱為信任度因子。將這些相關因子以不同權重加入信用度的計算中,就可以通過信用度評價共識過程中節點的行為狀態。
定義1(節點活躍度) 指節點在一定時間T內參與共識的頻度,反映了節點在系統中的活躍程度。節點活躍度ρ(n)表示為:
(1)

定義2(節點共識完成率) 指節點完成其所參與共識的頻度,反映了節點在共識網絡中的運行狀況。節點共識完成率γ表示為:
(2)
其中,s表示成功完成的共識次數,n為總共參與共識的次數,γ值隨s與n比值增大而增大,γ越大表示節點越穩定。
定義3(節點歷史影響度) 指節點歷史信任度對當前信任度的影響程度。節點歷史影響度ω(Δt)表示為:
(3)

定義4(事務重要級別因子) 用于標識請求事務的重要程度。設交易重要性參數為m,則事務影響函數F(m)可表示為:
(4)
其中,M0為交易重要性參數的閾值,本文取3,F(m)的值隨m值增大而增大,F(m)越大表示事務重要程度越高。
定義5(行為評價值) 對節點參與共識過程的行為進行綜合評價,行為評價值E表示為:
(5)

在每次共識過程完成后,系統會對各節點在本次過程中的表現進行評價。子區域i中節點j的信任度評價Sij表示為:
(6)
其中,Cinit為節點信任度初值,ρ(n)為節點活躍度,γ為共識完成率,ω(Δt)為歷史影響度,F(m)為事務重要級別因子,E為行為評價值。該模型可以準確地反映節點在本次共識過程中的表現。如果節點活躍度高且共識的完成情況好,或者完成級別較高的事務獲得較好的評價,都會使節點獲得較高的信任度評價。反之,如果節點活躍度較低,無法完成共識過程,則會導致節點獲得較低的信任度評價。
在完成對節點行為的評價后,需要以一定的策略更新節點的信任度,從而更新節點的信任類型。
設節點在開始共識前的信任度為Tij,本次共識過程完成后,節點信任度的評價值為Sij,則節點信任度按式(7)的規則更新:
(7)
其中,θ為信任度更新調節因子,若節點本次信任度評價高于往次,可適當調高信任度,反之則調低信任度。
如果節點因故障發生離線,信用度Cij會逐步衰減,即每次共識評價值Sij值為Cinit,直至Cij∈[0.9·Cinit,1.1·Cinit]或節點重新恢復服務。如果節點有惡意行為,信任度會變為0,后續該節點將被禁止參與共識。
信任度更新調節因子θ按式(8)的規則更新:
(8)
當本次信用度評價與前次評價值相差較大時,較小的信用度所占權重較大。這是因為當信用度評價值突然變大時,很有可能是節點在利用重要級別事務惡意提升自己的信任度,而該因子調節方式可以抑制信用度異常變化行為。
當節點完成信任度評估并確認信任類型后,就可以依據信任度進行委托選舉。
PBFT協議本質上是一種基于投票的共識機制,下面參照選舉制度為例來闡述節點委托的概念。圖2是一個三層的樹狀共識網絡,其中節點包含4種類型:1)三級代理人節點,由信任類型為普通的節點組成,如果把每個子區域看做一個州,其類似于州一級的議員;2)二級代理人節點,從其直接子節點(即圖2中三級代理人節點)中的信任類型為可信的節點中選出,可以代表其所有子節點,類似于國會議員;3)一級代理人節點,從全網二級代理人節點中選出,具有最高的共識權重,類似于大選中獲勝的總統;4)非共識節點,通常是故障或惡意節點,不參與共識過程,由于選舉是自下而上的,當低一級代理人升級為高一級代理人之后,其空缺的位置將根據節點信任度排名自動遞補。

圖2 分層共識網絡架構Fig.2 Hierarchical consensus network architecture
在系統初始化階段,根據應用需求、網絡環境等條件預先規劃樹狀網絡結構,并根據節點的處理能力設置初始時各級代理人節點。在節點完成組網后,各級別節點分工合作,實現對全網節點請求事務的共識過程。類似于各級議員和總統分工合作實現對國家事務的治理。
為降低全網共識過程的通信復雜度,將共識分為局部和全局兩級共識過程。首先是各個子區域內的節點進行局部共識,子區域的二級代理人節點負責定時生成區塊,二級和三級代理人節點會先對區塊進行一次局部共識過程,類似州議員投票形成一個州議案。全網所有的二級代理人和一級代理人再對區塊進行一次全局共識過程,對區塊進行最終確認。其他子區域的二級代理人節點將區塊異步地分發給各自區域內的三級代理人節點,更新其節點的賬本數據庫。類似國會議員和總統對州議會的提案進行投票,形成全國性的法案,并將法案分發給其他各州執行。
與其他基于分組的PBFT共識機制不同之處在于,由于采用了基于節點信任度的授權,參與全局共識的節點是可信節點,可以代表其所在區域的所有節點進行共識投票,這樣極大地降低了共識的通信復雜度。
平臺將根據各級節點在共識過程中的表現(如完成共識的時間)確定節點的信任度。當某個代理人節點的信任度低于特定的閾值或因故障不能正常提供服務時,平臺將重新選舉新的代理人。當重新選舉時,如果是二級代理人節點,則僅需要本區域內的節點完成一次選舉;如果是一級代理人節點,則需要全網節點重新進行選舉。



定義9(代理人節點狀態) 代理人節點分為:1)正常狀態,即節點可以在規定時間內完成共識過程;2)故障狀態,即節點因為服務器宕機或網絡中斷導致的故障狀態,該故障狀態如果能在指定時間內恢復正常狀態,則可以不重新選舉代理人節點;3)異常狀態,即節點被檢測出惡意破壞和攻擊PBFT共識過程,此時,該節點被排除出共識網絡,系統重新選擇代理人節點替代其職能。
定義10(法定選舉票數) 共識網絡完成共識過程需要的全網節點的最少票數。一個共識節點只有一張選票,但二級代理人節點在全局共識時可以擁有子區域內的所有選票,類似大選中的贏者通吃策略。
定義11(票數權重) 一級和二級代理人節點在進行全局共識過程中代表其子節點票數的權重。如某個二級代理人節點下有10個三級代理人節點。當權重為100%時,其全局共識算作10張選票。當權重為50%時,其全局權重算作5張選票。票權隨著節點信用度的變化而改變。
定義12(區塊) 區塊鏈上的區塊由一組請求事務及其哈希值組成,表示為B=([tx1,tx2,…,txk],h)。區塊在全局有唯一的序號s。
定義13(局部共識) 每個子集合內的節點執行PBFT協議,完成共識過程,得到一個局部合法的區塊。
定義14(全局共識) 代表各個子集的二級代理人節點和一級代理人節點執行PBFT協議,對局部共識進行二次共識過程,得到最終全局合法的區塊。
本文提出的基于信任授權的分層共識協議TDH-PBFT,其核心思想是通過對共識節點進行劃分后,利用不同子區域的局部共識和委托代理人的全局共識降低傳統PBFT協議連接的節點數量,從而降低完成共識的時間,提高系統的吞吐量。
在聯盟鏈共識網絡中,各級代理人節點可以由管理方預先設定,也可以隨機從節點中選擇。當節點運行一段時間,更新節點信任度之后,即可以依據信任度定期選舉各級代理人節點。
代理人選舉算法如算法1所示。
算法1TDH-PBFT代理人選舉算法
輸入對等數量n,對等節點N[n],組數m,節點組數G[m][n],三級代理人節點數TD_number[m],投票人權重FD_weight,SD_weight[m]
全局變量:FD,SD[m],TD[m][n],FD_credit,SD_credit[m],TD_credit[m][n]
1.procedure TDHPBFT_ELECTION()
2.for I ← 0,m do
3.TD[i][n]←delegatorElection(G[i][n],TD_number[i]+1)
4.end for
5.SD[m] ← delegatorElection(TD[m][n],1)
6.FD,k ← delegatorElection(SD[m],1)
7.SD[k] ← delegatorElection(TD[k][n],1)
8.TD[k][n] ← delegatorElection(G[k][n],1)
9.end procedure
H-PBFT初始化算法首先從各個子集中選取三級代理人節點。這里選擇的數量要比指定的三級代理人數量多一個,因為被選出的三級代理人節點將再執行一次delegatorElection,推舉出二級代理人節點。同樣,二級代理人節點將選舉出擁有最高共識權重的一級代理人節點。假設被選中的一級代理人來自第k個集合,此時,由于k集合二級代理人晉升導致其崗位空缺。該集合將先從三級代理人中補選一個二級代理人,再從普通節點中增補一個三級代理人。
不同信任狀態的節點擁有不同的權限。可信節點權限最大,通常是一級、二級代理人節點,或者有機會作為候選人被選為一級、二級代理人節點。普通節點作為三級代理人節點正常參與局部共識過程。故障節點雖然狀態不穩定,但仍然可以參與共識。但是一旦共識消息響應超過時限,二級代理人節點可以在滿足允許的容錯節點數量前提下,主動放棄等待其返回的消息。惡意節點不參與共識,應及時通知系統管理員進行故障修復。
TDH-PBFT分層共識協議分為本地共識和全局共識2個階段執行:
階段1(子集內部的本地共識階段) 子集內的二級代理人節點發起本地共識。由于子集內有不少于4個節點參與共識,即節點數大于3f+1,因此可以抵御f個惡意節點的拜占庭攻擊。共識過程分為PROPOSE、WRITE和ACCEPT 3步。二級代理人節點首先向其他節點廣播PROPOSE消息。其他節點驗證PROPOSE消息后就進入WRITE階段,廣播WRITE消息。當各節點接收到2f+1個WRITE消息后,節點進入ACCEPT階段,廣播ACCEPT消息。當各節點接收到2f+1個ACCEPT消息后,表示大部分節點對二級代理人節點發起的請求達成了共識。此時,階段1的本地共識完成。
階段2(子集間的全局共識階段) 在本地共識階段完成后,接收到足夠數量消息的二級代理人節點,將作為成員參加全局共識過程。首先向一級代理人節點和各個子集的二級代理人節點廣播PROPOSE消息。這里各子集二級代理人不需要再將消息轉發到子集內部進行本地共識,而是作為各自子集的全權代表對消息進行投票,具體代表的票數通過投票權數控制。例如,某個子集內有4個節點,投票權重為100%,二級代理人節點擁有4張票權,若投票權重為50%,則擁有2張票權。按照此規則,各節點開始廣播WRITE消息。當各節點接收到2f+1個WRITE消息后,節點進入ACCEPT階段,并廣播ACCEPT消息。當各節點接收到2f+1個ACCEPT消息后,表示大部分節點對二級代理人發來的請求達成了共識。此時,階段2的全局共識完成,一級和二級代理人將區塊寫入賬本。各子集的二級代理人通知子集內部其他節點,各節點更新本地區塊鏈賬本,實現共識網絡數據的最終一致性。
分層共識協議消息示意圖如圖3所示。

圖3 分層共識協議消息示意圖Fig.3 Schematic diagram of hierarchical consensus protocol messages
分層共識算法如算法2所示。
算法2TDH-PBFT分層共識算法
1.Initialisation
2.s ← 0
3.B ← ⊥
4.D ← ⊥
5.accepted ← {⊥}
6.
7.Local propose phase
8.send LOCAL_PROPOSE
9.
10.Upon LOCAL_PROPOSE
11.s ← sp
12.B ← Bp
13.begin Local write phase
14.
15.Local write phase
16.D ← digest(B)
17.send LOCAL_WRITE
18.wait for majority of LOCAL_WRITE
19.send LOCAL_ACCEPT
20.
21.Upon LOCAL_ACCEPT
22.if Dp= D then
23.accepted ← accepted {delegator}
24.if accepted contains majority of delegators then
25.begin Global propose phase
26.
27.Global propose phase
28.send GLOBAL_PROPOSE
29.
30.Upon GLOBAL_PROPOSE
31.s ← sp
32.B ← Bp
33.begin Global write phase
34.
35.Global write phase
36.D ← digest(B)
37.send GLOBAL_WRITE
38.wait for majority of GLOBAL_WRITE
39.send GLOBAL_ACCEPT
40.
41.Upon GLOBAL_ACCEPT
42.if Dp=D then
43.accepted ← accepted {delegator}
44.if accepted contains majority of delegators then
45.decided on B
在經典PBFT算法中,一個節點只擁有一張票權。建立可變票權機制可以進一步優化共識算法,增強共識算法的容錯能力。
節點的投票權數是根據節點的信任狀態決定的。可信節點通常具有更高的票權,用Vtrust表示為:
(9)
其中,Nabnormal為故障節點數量,Ntrust為可信節點數量,N為參與共識的節點總數。從式(9)可以看出,故障節點數增加或可信節點數減少都會提升可信節點的投票權數。
普通節點投票權用Vnormal表示為:
(10)
其中,Nnormal為普通節點數量,其權重同樣受到故障節點和普通節點數量的影響。如果當前系統內沒有可信節點,可以進一步提升普通節點的票權,如式(11)所示:
(11)
故障節點投票權用Vabnormal表示為:
(12)
故障節點投票權數主要取決于故障節點占共識總節點數的大小。故障節點越多,其票權就越低。惡意節點沒有投票權,則不參與共識過程。
利用節點的信任度,可以在共識開始前和WRITE、ACCEPT消息完成后進一步優化共識過程。
如圖4所示,當共識過程開始時,二級代理人節點先將各節點按信用度高低排序。排除惡意節點,將可信節點、正常節點和異常節點作為本次共識的節點。

圖4 基于信任度的共識過程優化示意圖Fig.4 Schematic diagram of consensus process optimization based on trust degree
在WRITE階段,三級代理人節點將WRITE消息廣播給其他共識節點,當二級代理人節點收到2f+1個確認消息后,進入ACCEPT階段。如果此時有節點的消息沒有正常返回,或者有惡意消息,在保證2/3共識節點數量的前提下,該節點將被移除,不再參與后續共識。二級代理人節點通過ACCEPT消息的附加屬性將移除的節點通知其他三級代理人節點。
在ACCEPT階段,三級代理人節點將WRITE消息廣播給其他共識節點,當二級代理人節點收到2f+1個確認消息后共識達成。二級代理人記錄各節點在共識過程中的行為和狀態,計算并更新節點信用值和節點信用狀態,再將各節點最新信任度表廣播給各個三級代理人節點。
下文證明采用TDH-PBFT協議實現分布式一致性,并且滿足分層共識網絡的活性和安全屬性。

證明由于TDH-PBFT協議包含了局部共識和全局共識2個階段,下面將通過分析2個階段中協議的執行過程來證明TDH-PBFT可以實現分布式一致性。

綜上所述,TDH-PBFT共識過程是2個連續的PBFT過程,且區塊序號在2次協議執行中保持不變。由于PBFT協議已被證明實現了分布式一致性,因此TDH-PBFT在全局共識協議中實現了一致性,滿足區塊鏈網絡的有效性、一致性、完整性和全序關系等屬性。
引理1TDH-PBFT協議滿足分層共識網絡有效性Validity。

1)如果二級代理人SDi未被錯誤懷疑,則所有參與全局共識的節點都會對區塊B達成共識,即所有無故障的二級代理人節點都會獲得B,并將該區塊分發給各自區域內的節點進行提交。如果某個二級代理人發生故障,它會先根據全局故障恢復機制得到處理,并最終獲取區塊B。因此,請求tx將最終在共識過程中被提交。

引理2TDH-PBFT協議滿足分層共識網絡一致性Agreement。
證明如果某個子區域i內的節點N提交一個請求tx,根據分布式共識服務的“連續序號”和“不重復請求”屬性,則有:1)該節點所在區域的二級代理人節點SDi必然提交了包含tx且序號為s的區塊B;2)區塊B必然已經完成了一次全局共識;3)各級節點必然已經獲取了所有小于序號s的區塊;4)沒有任何小于序號s的區塊會包含tx。由此可得,在分層共識網絡中,如果正常狀態的代理人節點接收到序號為s的區塊B和序號為s′的區塊B′,若s=s′,則B=B′。
引理3TDH-PBFT協議滿足分層共識網絡完整性Integrity。
證明假設某二級代理人節點SDi發送了序號為s+1的區塊Bs+1,根據分布式共識服務的“連續序號”和“不重復請求”屬性,則必然有某二級代理人節點SDj已經提交了序號為s的區塊Bs,且該區塊已經完成全局共識,并被各節點提交至賬本。二級代理人節點SDi在發起請求s+1前,使用哈希函數對本地賬本數據庫存儲的前一個區塊s進行簽名,將得到的哈希值H(B)和最新的tx事務一起打包。這樣新的區塊Bs+1必然滿足哈希鏈完整性。
引理4TDH-PBFT協議滿足分層共識網絡全序關系Total order。
證明假設來自子區域i和j的2個客戶節點ci和cj分別發起了事務請求txi和txj。子區域i和j各自的二級代理人SDi和SDj將對txi和txj打包成區塊Bi和Bj。下面分兩種情況來說明該引理成立。
1)如果ci和cj位于同一個子區域,則SD將按照請求提交的時間對txi和txj進行排序。接下來txi和txj可能都被按序打包進序號為s的區塊B中,當區塊完成全局共識分發至各節點后,txi必將先于txj被提交至賬本。txi和txj還有可能分別打包進序號為s的區塊Bs以及序號為s+1的區塊Bs+1。由分布式共識服務的“連續序號”屬性可知,Bs將先于Bs+1完成全局共識并被提交,則txi也將先于txj被提交至賬本。
2)如果ci和cj位于不同的子區域,則有txi和txj分別被SDi和SDj打包至區塊Bi和Bj中。
(1)由于客戶節點ci在執行請求事務時,必須選擇至少包含FD、SDi和TDki在內的3個代理人節點。3個節點返回的事務執行結果必須相同,即保證賬本數據庫在全局和局部完全一致,客戶節點才會將請求發送給SDi,從而開始2次共識過程。
(2)一級代理人節點FD擁有的全局事務視圖,是協調各個子區域請求事務順序的關鍵。
SDi在將事務tx打包成區塊B時,將詢問FD其區域允許打包事務的開始和結束區間。當區間內沒有鍵值修改沖突時,例如txi先于txj修改了鍵為k的值,SDi將按照預定的區塊大小或默認時間間隔進行打包。這樣,Bi先于Bj被提交參與共識,可確保Bi中的事務txi先于txj被提交至賬本;否則,假設txj先于txi修改了鍵為k的值,SDi將打包至SDj修改k的前一次修改事務到區塊Bi,SDj將從修改k的事務開始打包Bj。此時,當Bi和Bj完成全局共識后,Bj中的事務txj先于txi被提交至賬本。
綜上可得,TDH-PBFT協議滿足分層共識網絡的全序關系要求。
為深入了解TDH-PBFT模型的運行機制,使用SimPy模擬器對其運行流程進行建模。SimPy是基于進程的離散事件模擬器,它包含實體(Process)、事件(Event)和資源(Resource)3個主要概念。在TDH-PBFT中,實體主要是各級代理人節點,事件包括局部和全局共識的PROPOSE、WRITE、ACCEPT等。為了便于對比參照,還使用SimPy實現了標準的PBFT算法以及單純采用分組的H-PBFT算法。H-PBFT算法中,各分組的頭結點用于轉發其他分組的消息,而并非像TDH-PBFT算法,代表組內節點直接參與共識。
首先比較3種共識算法在系統節點數為17、49、97這3種情況下的性能,主要考察吞吐量和延時2個指標,PBFT的性能數據是實驗的基準線。從圖5和圖6可以看出,PBFT算法性能隨著節點數的增多而下降。吞吐量從3 164 TPS迅速下降至1 233 TPS,下降了61%。事務請求平均延時從750 ms增大到1 103 ms。基于分組的H-PBFT共識算法性能有所改善,這得益于分組降低了全網共識消息。TDH-PBFT的吞吐量是三者中最優的,隨著共識節點數從17增大到97,吞吐量僅下降了14.7%。節點數為97時的事務請求平均延時為762 ms,接近PBFT算法在節點數為17時的延時。該實驗展現了TDH-PBFT共識算法具有良好的伸縮性能,可以有效緩解當共識網絡節點數增大時,消息數量爆炸導致的性能下降。

圖5 不同共識算法下系統吞吐量的對比Fig.5 Comparison of system throughput under different consensus algorithm

圖6 不同共識算法下系統延時的對比Fig.6 Comparison of system delay under different consensus algorithm
然后比較區塊大小對系統性能的影響。分別選取0.5 MB、1 MB、2 MB和4 MB 4種取值,這也是實際系統部署時常選取的4種取值。從圖7可以看出,當區塊大小從0.5 MB增大到2 MB時,系統吞吐量從6 023 TPS增加到7 989 TPS,增加了33%。但單個事務請求的平均延時從608 ms增大到753 ms。這是因為增大區塊大小可以減少共識次數,提升系統的整體處理能力,但對于個別請求,等待打包的時間增加了其請求時長。當區塊大小從2 MB增大到4 MB時,系統吞吐量增加了2%,系統延時也進一步增大。可以看出,此時增加區塊大小對系統性能提升的作用已不顯著,2 MB是TDH-PBFT算法首選的區塊大小值。

圖7 區塊大小對系統吞吐量和延時的影響Fig.7 Influence of block size on system throughput and latency
最后比較共識節點部署在不同類型網絡下的系統性能差異。選取17個節點的共識網絡,第1類場景模擬所有節點全部都在局域網環境內,節點之間使用百兆網絡互連。第2類場景模擬節點混合部署,即一級和二級代理人之間的全局共識網絡使用10兆網絡互連,二級和三級代理人之間的局部共識網絡使用百兆網絡互連。第3類場景模擬所有節點全部都在互聯網環境內,節點之間使用10兆網絡互連。從圖8可以看出,3種算法在有節點處于互聯網環境時,隨著共識時間變長,吞吐量均會下降。但無論在哪種網絡類型下,TDH-PBFT的吞吐量都是最優的。即使在完全互聯網環境中,TDH-PBFT的性能也優于H-PBFT在完全局域網環境的性能。分層共識算法減少了共識消息的數量,使網絡帶寬對共識算法性能的影響降到最低。

圖8 網絡對系統吞吐量的影響Fig.8 Influence of network on system throughput
為優化大規模聯盟鏈網絡的共識過程,本文提出一種基于信任委托的分層共識優化機制。根據節點運行狀態建立信任度,選舉出可信的代理人節點進行局部和全局2次共識過程,從而降低消息廣播的數量,提升共識網絡吞吐率。實驗結果表明,該模型能夠滿足聯盟鏈平臺的性能擴展性需求,當全網節點數增大時,系統依然可以保持較好的性能。在TDH-PBFT共識算法中,二級與三級節點配比、權重票數和全局共識閾值等參數均對系統性能產生顯著影響,后續將對參數的作用做進一步研究。