韓 璐, 翟健宏, 楊 茹
(哈爾濱工業(yè)大學(xué)網(wǎng)絡(luò)空間安全學(xué)院, 哈爾濱 150001)
共識機制[1]作為區(qū)塊鏈[2]的核心技術(shù),能夠在缺乏中央控制的網(wǎng)絡(luò)中,通過自組織、大規(guī)模協(xié)作的方式實現(xiàn)賬本的分布式一致性,也是區(qū)塊鏈通過技術(shù)手段而非中心化機構(gòu)構(gòu)建去中心化“信任”網(wǎng)絡(luò)的關(guān)鍵算法。 良好的共識算法[3]有助于提高區(qū)塊鏈系統(tǒng)的性能效率,對維護系統(tǒng)的穩(wěn)定運行和節(jié)點相互信任起著重要作用。 然而,現(xiàn)有的共識算法各有優(yōu)劣,普遍存在擴展性差、交易確認時間長、應(yīng)用場景受限等問題,成為制約區(qū)塊鏈項目落地的主要因素[4]。
實用拜占庭共識算法(Practical Byzantine Fault Tolerance,PBFT)[5]作為目前聯(lián)盟區(qū)塊鏈使用較多的共識算法,不僅實現(xiàn)了節(jié)點之間狀態(tài)的信任,而且很大程度上降低了系統(tǒng)因拜占庭錯誤產(chǎn)生的巨大開銷[6],但存在對帶寬要求較高,節(jié)點數(shù)量固定等缺陷。 本課題對PBFT 算法在fabric 聯(lián)盟鏈[7]中的實現(xiàn)進行研究,利用PBFT 算法的特點,保證了網(wǎng)絡(luò)中節(jié)點的一致性。 通過部署鏈碼在docker[8]環(huán)境中對算法的性能進行檢測,并根據(jù)檢測結(jié)果對PBFT 算法進行改進。
本文對區(qū)塊鏈防作弊技術(shù)進行研究,提出了一種基于節(jié)點可信度的NRPBFT(node-reliabilitybased PBFT consensus algorithm)共識算法,主要貢獻如下:
(1)提出了NRPBFT 算法,采用選舉集群的方式,將所有的節(jié)點分成普通節(jié)點和共識節(jié)點。
(2)利用PBFT 算法的特性實現(xiàn)了共識過程的防作弊,同時優(yōu)化了算法的性能,提高了算法的效率。
(3)利用20 個端口模擬區(qū)塊鏈節(jié)點,利用tcp實現(xiàn)數(shù)據(jù)在端口之間的同步,通過實驗驗證改進后的共識算法的可行性。
本文的組織結(jié)構(gòu)如下:第1 節(jié)介紹了NRPBFT算法方案;第2 節(jié)闡述了代碼優(yōu)化的過程及結(jié)果;第3 節(jié)結(jié)合實驗說明了該方案的可行性與高效性;第4節(jié)總結(jié)了全文,并討論了后續(xù)的工作與改進之處。
針對PBFT 算法存在問題的分析,結(jié)合調(diào)研的結(jié)果和文獻資料匯總,本節(jié)提出了一種NRPBFT 算法方案。 這個方案主要是從縮小網(wǎng)絡(luò)的規(guī)模的角度出發(fā),利用選舉集群的方式,將所有的節(jié)點分成普通節(jié)點和共識節(jié)點。 利用節(jié)點可信度評估公式對節(jié)點的可信度進行評估, 并對節(jié)點的可信度進行排序,選可信度最高的前p個節(jié)點作為共識集群(2f≤p <3f,f表示網(wǎng)絡(luò)中惡意節(jié)點的數(shù)量)。 同時,對主節(jié)點的選舉做了一些改動,選取可信度最高的節(jié)點作為主節(jié)點,大大降低了惡意節(jié)點成為主節(jié)點的概率。主要從以下2 點進行改進:
(1)根據(jù)可信度將網(wǎng)絡(luò)中的節(jié)點分成2 種角色。普通節(jié)點只負責完成交易,共識節(jié)點集群中可信度最高的節(jié)點會成為主節(jié)點。 主節(jié)點接收客戶端的消息,在有p個共識節(jié)點的共識集群中進行廣播,對消息進行簽名排序后,廣播給其他所有節(jié)點。 節(jié)點收到至少p/2 個相同的消息,認為這個信息正確,寫入內(nèi)存,并將確認信息回復(fù)給主節(jié)點。
(2) 采用可信度評估的方式來選舉共識集群和主節(jié)點。 在每次共識結(jié)束后,都需要根據(jù)可信度評估算法重新計算每個節(jié)點的可信度,這樣就實現(xiàn)了節(jié)點動態(tài)加入或者退出共識集群。 對于共識集群中作惡的節(jié)點,研究在評估的時候采取相應(yīng)的懲罰機制,加上懲罰系數(shù),降低其可信度評估結(jié)果。 這種方式不僅能降低主節(jié)點隨意選取帶來的風(fēng)險,也能保證系統(tǒng)的動態(tài)性。
網(wǎng)絡(luò)拓撲設(shè)計如圖1 所示。
圖1 改進后PBFT 算法拓撲圖Fig. 1 Topological diagram of the improved PBFT algorithm
(1)客戶端c將請求信息發(fā)送到主節(jié)點,主節(jié)點驗證,提取消息摘要并簽名后廣播給所有共識節(jié)點,廣播的格式為<<PREPARE,n,S,D >,data >,其中PREPARE是命令名稱,代表信息處于的階段是主節(jié)點在共識集群中廣播信息階段,n是主節(jié)點為信息分配的序列號,S是主節(jié)點的簽名,D是主節(jié)點提取的信息摘要,data是待共識信息。
(2) 認證共識階段。 共識集群中的所有節(jié)點收到請求后,首先驗證交易簽名和摘要信息,驗證成功后將交易數(shù)據(jù)存儲到內(nèi)存中,對信息進行簽名后,將信息廣播給所有的節(jié)點, 廣播信息格式為<<AUTHENTICATION,credit_i,n,S,D >,data >, 其中AUTHENTICATION是這一階段的命令名稱,credit_i是節(jié)點的可信度的值。 信息廣播到所有節(jié)點后,進入提交階段。 如果交易信息驗證不成功,則認為主節(jié)點可能出了問題,重新對主節(jié)點進行選舉。
(3) 提交階段。 所有的節(jié)點都會收到多個由共識節(jié)點發(fā)來的信息,節(jié)點接收到信息后,對簽名和序列號進行驗證,有大于等于p/2 個信息驗證成功后,將信息存儲到內(nèi)存中,并向主節(jié)點進行提交。 信息提交的格式為<SUBMIT,n,S,D,i >,其中i是節(jié)點的編號。 主節(jié)點在一定時間內(nèi)接收到2f+1 個一致的信息,認為提交階段完成,主節(jié)點將達成共識的信息發(fā)送給客戶端,完成共識。
算法的流程如圖2 所示。 NRPBFT 算法步驟具體如下。
圖2 改進的PBFT 算法流程圖Fig. 2 Flow chart of improved PBFT algorithm
算法1 新PBFT 算法
輸入主節(jié)點編號N0,P個共識節(jié)點(N1-Np),n - p個普通節(jié)點(Np+1,Nn),節(jié)點可信度的值credit - i,客戶端發(fā)送的交易信息data
輸出:節(jié)點對客戶端的reply
1:for 主節(jié)點N0接收客戶端發(fā)送的交易信息data
2:N0提取消息摘要D,對D簽名得到S,將信息廣播給共識節(jié)點,廣播信息格式為<<PREPARE,n,S,D >,data >,其中n是消息序列號
3:共識節(jié)點Np驗證交易的簽名和摘要
4:if 簽名S和摘要D驗證成功then
5: 共識節(jié)點Np將交易信息儲存到內(nèi)存中
6: 共識節(jié)點Np對交易信息進行簽名,廣播給所有節(jié)點, 廣播格式為<< AUTHENTICATION,credit_i,n,S,D >,data >
7:else then
8: 觸發(fā)主節(jié)點更換協(xié)議,按照可信度排序更換主節(jié)點,重復(fù)步驟1
9: 普通節(jié)點Nn接收到共識節(jié)點Np的廣播信息,驗證交易的簽名和摘要
10:if 節(jié)點有P/2 個簽名S和摘要D驗證成功then
11: 普通節(jié)點Nn將交易信息儲存到內(nèi)存中
12: 向主節(jié)點N0發(fā)送確認信息,信息提交的格式為<SUBMIT,n,S,D,i >,其中i是節(jié)點的編號
13:else then
14: 重新評估節(jié)點的可信度,重新選舉共識節(jié)點集群
15:if 主節(jié)點N0接收到2f+1 個一致的信息then
16: 主節(jié)點N0將確認信息提交給客戶端
17: end
18: else then
19: 觸發(fā)主節(jié)點更換協(xié)議,按照可信度排序更換主節(jié)點,重復(fù)步驟1
還要一值的是,這里的節(jié)點1 和節(jié)點2 均屬于共識節(jié)點,節(jié)點3 屬于拜占庭節(jié)點。
節(jié)點可信度計算模塊是以往的研究中和研發(fā)團隊一起提出的方法。 可信度是信任的量化表示,表示一個節(jié)點中數(shù)據(jù)可以被另一節(jié)點接受的信任程度。 可以通過節(jié)點自身的行為來判斷節(jié)點的可信度。
將生成一個區(qū)塊的時間定義為一個評審周期,其中評審內(nèi)容包括6 項,節(jié)點每接收到一個區(qū)塊會動態(tài)更新該表格中的礦工節(jié)點、該表格中的礦工節(jié)點、節(jié)點參與驗證的區(qū)塊總數(shù)、節(jié)點正確驗證的區(qū)塊數(shù)、節(jié)點最新打包區(qū)塊字段,每個周期結(jié)束后更新信任度和新的起始區(qū)塊字段,各參數(shù)設(shè)置見表1。
表1 模型參數(shù)設(shè)置Tab. 1 Model parameters settings
將表1 中各字段值帶入式(1)中進行計算,檢驗計算結(jié)果是否達到可信度閾值:
其中,表示第i個節(jié)點在當前評審周期的可信度;τ表示在一個評審周期內(nèi)產(chǎn)生的區(qū)塊數(shù);ω表示第i個節(jié)點積極參與爭奪記賬權(quán)并投票的區(qū)塊數(shù)。 對于在該評審周期內(nèi)產(chǎn)生的第x個區(qū)塊,當?shù)趇個節(jié)點正常參與投票時,將νx設(shè)置為1,μx設(shè)置為0,否則νx設(shè)置為0,μx設(shè)置為1,σ是惡意投票對于節(jié)點可信度影響所占的比重,該值越大,懲罰權(quán)重越大。 研究可知,式(1) 主要用來衡量節(jié)點在當前評審周期內(nèi)的表現(xiàn)情況。
由于式(1)基于logistics 模型[9]提出,而該模型在對數(shù)增長期間函數(shù)值增長較快,導(dǎo)致對數(shù)增長期間節(jié)點信任度相較之前值偏高,因此使用式(2)進行修正:
其中,trust(i)cur表示當前周期的信任度,trust(i)pre表示上個周期的信任度。 通過λ來對當前周期信任度計算進行修正,添加節(jié)點信任歷史相關(guān)性,該參數(shù)可由用戶定義。 研究可知,修正方法主要是中和了該節(jié)點在上輪評審周期中的表現(xiàn)情況一旦某個節(jié)點出錯,則在下一輪對該節(jié)點可信度進行評審的時候,惡意的節(jié)點會被乘以一個特別小的系數(shù)來降低下一輪評審中此節(jié)點的可信度。
本方案的核心特點在于實現(xiàn)了一個基于可信度的PBFT 算法優(yōu)化方案、即NRPBFT,該方案具有以下優(yōu)勢:
(1)高可靠性:選可信度最高的前p個節(jié)點作為共識集群,在一定程度上保證了系統(tǒng)的安全性和可靠性。 研究中也對主節(jié)點的選舉做了一些改動,選取可信度最高的節(jié)點作為主節(jié)點,大大降低了惡意節(jié)點成為主節(jié)點的概率。 從節(jié)點接收到主節(jié)點的廣播信息后,首先會對消息的簽名、消息的序號和消息的摘要進行驗證,3 個信息都驗證通過后才能接收這個需要共識的內(nèi)容,這一過程也大大地保證了信息的可靠性和安全性。
(2)高可用性:原本的PBFT 算法在進行共識的過程中需要經(jīng)過1 次單點全廣播和2 次全點全廣播,基于可信度的PBFT 優(yōu)化算法只需要經(jīng)過一次一對多的傳輸、一次多對一的傳輸及一次全點全廣播。 區(qū)塊鏈中節(jié)點與節(jié)點之間的傳輸過程消耗的資源非常多,優(yōu)化后的方法減少了節(jié)點與節(jié)點之間信息傳輸?shù)拇螖?shù),因此可以降低達成共識的時間且提升系統(tǒng)的性能。
(3)兼容性:本方案是對區(qū)塊鏈的共識算法進行改進,共識算法是區(qū)塊鏈的核心技術(shù)之一,可以在以太坊中、聯(lián)盟鏈、或者其他區(qū)塊鏈平臺中直接進行應(yīng)用。
本方案的缺點是由于主節(jié)點一方面要接收來自客戶端的信息,另一方面還要對節(jié)點共識的結(jié)果進行統(tǒng)計并回復(fù)給客戶端,一旦節(jié)點數(shù)量非常大,主節(jié)點容易過載。 除此以外,如果主節(jié)點是惡意節(jié)點,會對整個系統(tǒng)的共識結(jié)果造成重大的影響,但是由于主節(jié)點是整個網(wǎng)路中可信度最高的節(jié)點,因此主節(jié)點是惡意節(jié)點的可能性大大降低。
本節(jié)以上一節(jié)提出的NRPBFT 算法方案為基礎(chǔ),描述了NRPBFT 算法的整體流程,給出了更詳細的設(shè)計方案,包括一些關(guān)鍵模塊的實現(xiàn)方法和代碼分析,同時介紹了Hyperledger Fabric 的搭建,以及編寫鏈碼驗證算法改進的結(jié)果。
NRPBFT 算法按照運行過程可以分成2 部分。一部分是共識過程,另一部分是視圖更換過程。 一旦共識過程出現(xiàn)問題會立即觸發(fā)視圖更換過程。 對此擬展開研究分述如下。
(1)共識過程
①準備階段。 這一步主要目的是讓客戶端知道哪個節(jié)點是主節(jié)點。 在交易請求階段,客戶端將交易發(fā)送給所有節(jié)點,節(jié)點接收到交易信息后,驗證簽名,驗證成功后判斷交易是否為query 類型的交易,如果是,則執(zhí)行智能合約,查詢本地賬本的余額信息并返回結(jié)果,這個過程就結(jié)束了。 如果是deploy 或invoke 類型的請求交易,則需要利用共識機制來得到結(jié)果。 對于需要共識的交易,普通節(jié)點是無法處理的,只有主節(jié)點可以接收并進行回復(fù),因此,在交易請求階段相當于客戶端把需要共識的交易信息發(fā)送給了所有節(jié)點,在驗證階段,只有主節(jié)點能接收,也就是選出了主節(jié)點。 主節(jié)點接收到交易信息后,對信息進行編號,提取摘要并簽名后發(fā)送給共識集群中的節(jié)點進行共識,進入認證共識階段。準備階段拓撲見圖3。
圖3 準備階段拓撲圖Fig. 3 Topology diagram of preparation phase
②認證共識階段。 在認證階段,共識集群中節(jié)點收到主節(jié)點發(fā)送的信息后,對信息的簽名、摘要、編號進行驗證,驗證通過后放入內(nèi)存,對信息進行簽名并打包生成提交報文,在整個網(wǎng)絡(luò)的節(jié)點中進行廣播,進入提交認證階段。 在任何一個階段如果驗證失敗或者接收信息超時,則認為主節(jié)點可能是惡意節(jié)點,觸發(fā)視圖更換協(xié)議對主節(jié)點和共識集群中的節(jié)點進行更換并重啟共識過程。 認證共識階段拓撲見圖4。
圖4 認證共識階段拓撲圖Fig. 4 Topology diagram of authentication consensus phase
在提交認證階段,共識節(jié)點將信息在整個網(wǎng)絡(luò)中進行廣播,普通節(jié)點收到廣播信息后,對信息的簽名、摘要、視圖編號進行驗證,驗證通過后放入內(nèi)存,一旦普通節(jié)點收到了p/2 個驗證通過的提交認證消息,生成提交報文,提交給主節(jié)點,進入確認提交階段。 在任何一個階段如果驗證失敗或者接收信息超時,則認為主節(jié)點可能是惡意節(jié)點,觸發(fā)視圖更換協(xié)議對主節(jié)點和共識集群中的節(jié)點進行更換并重啟共識過程。
③確認提交階段。 確認提交階段拓撲見圖5。
圖5 確認提交階段拓撲圖Fig. 5 Topology diagram of confirmation commit phase
(2)視圖更換過程。 觸發(fā)節(jié)點更換的條件主要有以下幾點:
①過了指定時間,普通節(jié)點或者共識集群的節(jié)點未收到主節(jié)點的共識請求。
②信息的格式不合法。
③沒有在規(guī)定時間內(nèi)完成主節(jié)點更換。
④在共識過程中,多個節(jié)點的視圖編號是舊的編號或者簽名摘要驗證失敗。
在NRPBFT 算法中,由原PBFT 算法根據(jù)節(jié)點編號順序選舉主節(jié)點改變?yōu)槔霉?jié)點的可信度來選擇主節(jié)點,這種做法避免了主節(jié)點隨意選舉帶來的風(fēng)險,同時大大降低了主節(jié)點成為惡意節(jié)點的可能性。
在主節(jié)點更換階段,視圖編號自加1 作為新的視圖編號,所有節(jié)點封裝ViewChange 報文,報文中封裝了各個節(jié)點的可信度和簽名,在網(wǎng)絡(luò)中進行廣播,如圖6(a)所示。
圖6 視圖更換拓撲圖Fig. 6 View replacement topology
節(jié)點接收到其他節(jié)點的廣播信息后,選出可信度最高的節(jié)點作為主節(jié)點,如果2f+1 個節(jié)點選出的可信度最高的節(jié)點是同一個,則認為這個節(jié)點就是下一個主節(jié)點。 在這里,每個節(jié)點都會計算除了主節(jié)點外可信度最好的p個節(jié)點,組成該視圖下的共識集群。 在主節(jié)點確認階段,新的主節(jié)點封裝newView報文并簽名,在網(wǎng)絡(luò)中進行廣播。 如此,新的主節(jié)點就更換完成,如圖6(b)所示,N2節(jié)點是可信度最高的節(jié)點,就會被選舉為下一個主節(jié)點,接下來重新進行共識過程。
整個NRPBFT 算法的代碼各部分功能見表2。
表2 NRPBFT 各模塊功能表Tab. 2 Function table of each module of NRPBFT
下面對NRPBFT 算法的具體實現(xiàn)進行描述,包括數(shù)據(jù)結(jié)構(gòu)的類型定義和相關(guān)的實現(xiàn),還有關(guān)鍵變量和關(guān)鍵函數(shù)的調(diào)用過程。
(1)數(shù)據(jù)結(jié)構(gòu)定義。 節(jié)點的定義如圖7 所示。其中,nodeID用來存儲屬于節(jié)點的編號,addr用來存儲節(jié)點的 ip 地址+端口號,rsaPrivKey和rsaPubKey分別存儲節(jié)點的公私鑰,credit存儲節(jié)點的可信度的值。
圖7 節(jié)點定義圖Fig. 7 Node definition graph
RPBFT 信息結(jié)構(gòu)的定義如圖8 所示。 其中,node存儲的是上述的節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,sequenceID存儲的是交易的序號,會隨著交易數(shù)量的增加而自增。Lock定義了一個鎖,在多線程操作的過程中可以保證獲取數(shù)據(jù)的一致性和準確性。messagePool、prePareConfirmCount、commitConfirmCount分別存儲消息本身、準備階段的消息和確認消息。isCommitBordcast是用來判斷是否進行過廣播的標志位,isReply是用來判斷是否回復(fù)信息給主節(jié)點的標志位。
圖8 RPBFT 信息結(jié)構(gòu)定義圖Fig. 8 RPBFT information structure definition diagram
(2)變量定義。 該部分介紹在代碼中定義的全局變量及其含義。 變量定義見表3。 由表3 可知,nodeCount定義了節(jié)點的數(shù)量,根據(jù)這個變量值,生成nodeCount個節(jié)點的公私鑰對。nodeCredit定義了共識集群節(jié)點的數(shù)量,在共識過程中也是根據(jù)這個值判斷是否收到了所有共識節(jié)點的消息。clientAddr定義了客戶端的監(jiān)聽地址,nodeTable和credit_nodeTable都是map類型的數(shù)據(jù),分別存儲節(jié)點和地址的鍵值對及共識集群中的節(jié)點和地址的鍵值對。primaryNode記錄主節(jié)點的id,記錄每一個視圖下主節(jié)點的id。localMessagePool是一個未定義的數(shù)組,用于存儲客戶端發(fā)送的消息。start和end分別記錄算法的開始時間和結(jié)束時間,二者作差便可以得到算法的運行時間,prefixCMDLength是命令名稱的長度,憑借這個值取得消息的前12 位,分析前12位的消息即可得出目前處于共識的哪個階段。
表3 合約變量定義表Tab. 3 Contract variable definition table
(3)功能方法。 關(guān)鍵方法定義及介紹見表4。
表4 關(guān)鍵方法定義表Tab. 4 Key method definition table
本文的Windows 實驗環(huán)境的參數(shù)見表5,基于此環(huán)境配置,利用端口號模擬節(jié)點,實現(xiàn)了NRPBFT算法的運行。
表5 設(shè)備參數(shù)表Tab. 5 Equipment parameters table
運行上一節(jié)描述的NRPBFT 算法和原PBFT 算法,這里以4 個網(wǎng)絡(luò)節(jié)點為例,分別運行優(yōu)化前后的算法。 在PBFT 算法中,N0是主節(jié)點,N1、N2、N3是普通節(jié)點。 在NRPBFT 算法中,設(shè)置4 個節(jié)點情況下,只能存在一個惡意節(jié)點,根據(jù)p的范圍為2f≤p <3f,這里選擇節(jié)點N1和節(jié)點N2組成共識集群,主節(jié)點為節(jié)點N0,節(jié)點N3是普通節(jié)點。
PBFT 算法4 個節(jié)點時的執(zhí)行時間見圖9。
圖9 PBFT 算法執(zhí)行時間Fig. 9 Algorithm execution time of PBFT
NRPBFT 算法4 個節(jié)點時的執(zhí)行時間見圖10。
圖10 NRPBFT 算法執(zhí)行時間Fig. 10 Algorithm execution time of NRPBFT
從上面的對比結(jié)果可以看出,本項研究對PBFT算法的修改可以有效減少節(jié)點之間達成共識的時間,提高了共識效率。 但是節(jié)點數(shù)量只有4 個的情況太過簡單,尤其是在NRPBFT 算法中,普通節(jié)點只有N3, 并不能很好地體現(xiàn)算法優(yōu)化的程度。PBFT 算法的特點是隨著網(wǎng)絡(luò)規(guī)模的增大,通信時延呈指數(shù)增長,因此可以增大網(wǎng)絡(luò)規(guī)模做后續(xù)進一步研究。
將節(jié)點的數(shù)量分別設(shè)置成4 個、6 個、8 個、10個、12 個、14 個、16 個、18 個、20 個,查看在不同節(jié)點數(shù)量下算法改進前后達成共識所需的時間。 節(jié)點數(shù)量和達成共識的時間見表6。
表6 改進前后算法執(zhí)行時間表Tab. 6 Algorithm execution schedule before and after improvement
將改進前和改進后的算法運行時間繪制在一張圖上,可以更直觀地看出改進前后性能的優(yōu)化,節(jié)點數(shù)量和達成共識的時間對比如圖11 所示。
圖11 改進前后PBFT 算法執(zhí)行時間與網(wǎng)絡(luò)規(guī)模關(guān)系圖Fig. 11 The relationship between the execution time of the PBFT algorithm and the network size before and after the improvement
通過實驗結(jié)果可知,NRPBFT 算法相比PBFT算法的改進效果比較明顯。 從整體上分析,在相同節(jié)點數(shù)量和相同交易信息的條件下,NRPBFT 算法的時延總是低于PBFT 的時延。 從趨勢上看,隨著網(wǎng)絡(luò)中節(jié)點數(shù)量的增加,網(wǎng)絡(luò)中節(jié)點與節(jié)點之間的通信數(shù)量增加,NRPBFT 算法和PBFT 算法的時延都增大了。 這時候影響算法效率的是節(jié)點之間的通信開銷,并且NRPBFT 算法減少通信次數(shù)的優(yōu)點也體現(xiàn)出來了。 從圖11 中可以明顯看出,隨著節(jié)點數(shù)量的增加,NRPBFT 算法時延增長速度比PBFT 的時延增長速度慢。 在4 個節(jié)點1 筆交易的條件下,NRPBFT 算法的時延為10.063 8 ms,PBFT 算法的時延為16.709 6 ms,NRPBFT 算法相對PBFT 算法時延降低了39.77%。
為了說明其防作弊的特點,這里還需要模擬惡意節(jié)點,在網(wǎng)絡(luò)中節(jié)點總數(shù)為4 的情況下進行模擬。具體來說,N0為主節(jié)點,N1和N2為正常節(jié)點,N3為惡意節(jié)點,模擬的時候故意不開啟N3,模擬節(jié)點宕機的情況。
在PBFT 中,當不開啟N3節(jié)點的時候,經(jīng)測試,節(jié)點依然可以達成共識,達成共識的時間見圖12。
圖12 有惡意節(jié)點時PBFT 算法執(zhí)行時間Fig. 12 PBFT algorithm execution time when there are malicious nodes
在NRPBFT 中,當不開啟N3節(jié)點的時候,經(jīng)測試,節(jié)點依然可以達成共識,達成共識的時間見圖13。
圖13 有惡意節(jié)點時NRPBFT 算法執(zhí)行時間Fig. 13 NRPBFT algorithm execution time when there are malicious nodes
從圖13 可以看出,在N3為惡意節(jié)點的情況下,2 個都能達成共識,并且由于在4 個節(jié)點的情況下,如果有一個惡意節(jié)點,則剩余的節(jié)點都是共識集群中的節(jié)點,和PBFT 算法沒有區(qū)別,因此達成共識的時間也非常接近。 實驗結(jié)果說明,當網(wǎng)絡(luò)中存在f(n >3f) 個節(jié)點時,2 種算法都可以防止節(jié)點作弊,在規(guī)定時間內(nèi)達成共識。
除了通信時間上有了直觀改善,在通信數(shù)量上也減少了很多。 這里定義網(wǎng)絡(luò)中節(jié)點總數(shù)為n, 定義NRPBFT 算法中共識集群中節(jié)點數(shù)量為p。
在PBFT 算法中,核心有3 個階段。 在預(yù)準備階段,主節(jié)點將待共識信息進行廣播,這一階段的通信次數(shù)為n -1 次;進入到準備階段,每個節(jié)點進行一次廣播,一共n個節(jié)點,因此這一階段的通信次數(shù)為n(n -1);進入提交階段,依然是每個節(jié)點進行廣播,通信次數(shù)為n(n -1)。 因此,PBFT 算法總的通信次數(shù)為2n2- n -1。
在NRPBFT 算法中,核心階段也是有3 個。 在認證階段,主節(jié)點向共識集群中的節(jié)點發(fā)送待共識信息,這一階段的通信次數(shù)為p次;進入到共識階段,每個共識節(jié)點進行一次廣播,一共p個共識節(jié)點,因此這一階段的通信次數(shù)為p(p -1);進入確認階段,這里是共識節(jié)點和主節(jié)點在整個網(wǎng)絡(luò)中進行廣播,通信次數(shù)為n(p+1)。 因此,NRPBFT 算法總的通信次數(shù)為p2+np+n,這里p取(2/3)n,遇到小數(shù)上取整,即總通信次數(shù)為:(10/9)n2+n。
將節(jié)點的數(shù)量分別設(shè)置成4 個、6 個、8 個、10個、12 個、14 個、16 個、18 個、20 個,查看在不同節(jié)點數(shù)量下的通信次數(shù)。 節(jié)點數(shù)量和通信次數(shù)的關(guān)系見表7。
表7 改進前后算法通信次數(shù)表Tab. 7 Algorithm communication times table before and after improvement
將改進前和改進后的算法通信次數(shù)繪制在一張圖上,可以更直觀地看出改進前后的優(yōu)化,節(jié)點數(shù)量和通信次數(shù)的時間對比如圖14 所示。
圖14 改進前后PBFT 算法執(zhí)行時間與通信次數(shù)關(guān)系圖Fig.14 The relationship between the execution time of the PBFT algorithm and the number of communications before and after the improvement
通過實驗結(jié)果可知,NRPBFT 算法相比PBFT算法的改進效果比較明顯。 從整體上分析,在相同節(jié)點數(shù)量和相同交易信息的條件下,NRPBFT 算法的通信次數(shù)總是比PBFT 的通信次數(shù)少。 從趨勢上看,隨著網(wǎng)絡(luò)中節(jié)點數(shù)量的增加,網(wǎng)絡(luò)中節(jié)點與節(jié)點之間的通信數(shù)量都在增加,但是NRPBFT 算法中通信次數(shù)增加得比較緩慢。
編寫鏈碼,進行交易的初始化和轉(zhuǎn)賬操作,部署鏈碼,進行測試。 PBFT 算法共識時間的運算見圖15。 由圖15 可知,在采用原PBFT 算法的時候,交易轉(zhuǎn)賬共識所需要的時間為0.029 s。
圖15 PBFT 算法共識時間Fig. 15 Consensus time of PBFT algorithm
NRPBFT 算法共識時間的運算見圖16。 由圖16 可知,采用優(yōu)化后的NRPBFT 算法的時候,交易轉(zhuǎn)賬共識所需要的時間為0.005 s。
圖16 NRPBFT 算法共識時間Fig. 16 Consensus time of NRPBFT algorithm
在采用原PBFT 算法的時候,交易轉(zhuǎn)賬共識過程的性能指標見圖17。
圖17 PBFT 算法性能Fig. 17 Performance of PBFT algorithm
采用優(yōu)化后的NRPBFT 算法的時候,交易轉(zhuǎn)賬共識過程的性能指標見圖18。
圖18 NRPBFT 算法性能Fig. 18 Performance of NRPBFT algorithm
從圖18 可以看出, NRPBFT 算法的吞吐量更大,性能也提升了。
在本項研究中,選舉了p個除了主節(jié)點外可信度最高的節(jié)點組成共識集群,p的取值范圍是2f≤p <3f。 接下來,對p的取值范圍進行證明,說明為什么在這個范圍內(nèi)可以保證系統(tǒng)中的節(jié)點正常達成共識。
要想證明P在2f≤p <3f的情況下能保證網(wǎng)絡(luò)在有f個惡意節(jié)點的情況下達成共識,首先要證明PBFT 滿足的如下條件:
證明假設(shè)節(jié)點總數(shù)為N,f為拜占庭錯誤節(jié)點,N滿足:N≥3f+1。
如果網(wǎng)絡(luò)中一共有N個節(jié)點,其中拜占庭節(jié)點的數(shù)量為f,那么非拜占庭節(jié)點的數(shù)量就是N - f。在共識的時候,如果一個普通節(jié)點收到N - f個信息,節(jié)點無法判斷這N - f個信息來自拜占庭節(jié)點、還是非拜占庭節(jié)點。 考慮最壞的情況,這N -f個信息中有f個信息來自拜占庭節(jié)點,在這種情況下,只有N -2f個信息來自非拜占庭節(jié)點。 對于這個普通節(jié)點,在收到2 種不同的信息,節(jié)點會按照少數(shù)服從多數(shù)的原則,選擇信息數(shù)量多的信息作為待共識信息。 因此,要想保證待共識信息是非拜占庭節(jié)點發(fā)送的信息,就需要保證N -2f >f,即N >3f,也就是N≥3f+1。
在NRPBFT 算法中,p的范圍是2f≤p <3f,在認證共識階段,主節(jié)點只會將待共識信息發(fā)送給p個共識集群中的節(jié)點進行共識。 由于這p個節(jié)點是網(wǎng)絡(luò)中除了主節(jié)點外可信度最高的p個節(jié)點,所以在一定程度上可以保證p個節(jié)點中拜占庭節(jié)點的數(shù)量比較少,也就是可以保證p - f >f,即p >2f。 在提交階段,p個節(jié)點會分別向N個節(jié)點發(fā)送信息,也就是進行p次單點全廣播的過程,當一個節(jié)點收到至少p/2 個相同的信息時,也就是至少f個相同的消息,顯然這些消息不可能全是惡意節(jié)點發(fā)出的,只能是非拜占庭節(jié)點發(fā)出的消息。 在確認階段的證明和PBFT 算法一致,這里不再重復(fù)。
由上述論證可以說明,在公式集群p的節(jié)點數(shù)量滿足2f≤p <3f時,NRPBFT 算法可以保證能在有f個惡意節(jié)點的情況下,網(wǎng)絡(luò)中的非拜占庭節(jié)點達成共識。
接下來對算法的防作弊特點進行說明。 由于本項研究中默認惡意節(jié)點數(shù)量f和網(wǎng)絡(luò)中節(jié)點總數(shù)n之間滿足n >3f的關(guān)系,且默認誠實節(jié)點一定能正常進行共識,不會出現(xiàn)信息丟失和宕機等情況,因此,本算法一定可以抵御51%攻擊。
在區(qū)塊鏈中,DDoS 攻擊的主要目的是大量占用網(wǎng)絡(luò)中的節(jié)點資源,使得這些節(jié)點無法提供正常的服務(wù),如果受害的節(jié)點過多,很可能會影響整個區(qū)塊鏈網(wǎng)絡(luò)的運行。 DDoS 攻擊是通過攻擊手段占用了受害者的大量資源,使得受害者不能提供正常服務(wù)。
在區(qū)塊鏈中,DDOS 攻擊主要是計算集群對網(wǎng)絡(luò)中的節(jié)點進行攻擊,占用節(jié)點資源,使得節(jié)點宕機,無法進行共識。 本課題中,最多只有f個節(jié)點可以遭受DDOS 攻擊,而剩余的n - f個誠實節(jié)點依然可以正常達成共識,不會對最后的結(jié)果造成影響。因此,本算法可以抵擋DDOS 攻擊。
拜占庭將軍問題所描述的正是共謀攻擊的情境,惡意節(jié)點聯(lián)合起來修改信息或者丟失信息,以此影響網(wǎng)絡(luò)中的節(jié)點達成共識。 在上述證明中,已經(jīng)說明為什么PBFT 算法和NRPBFT 算法能夠在共謀攻擊的情況下達成共識,但是前提必須是n >3f,惡意節(jié)點的數(shù)量再多,就無法抵御共謀攻擊了。
女巫攻擊是一種專門針對聯(lián)盟鏈的攻擊,惡意節(jié)點可以偽裝自己的身份來進行攻擊。 由于PBFT機制的延展性不高,一般只能用在網(wǎng)絡(luò)規(guī)模小的網(wǎng)絡(luò)中,所以更易受到女巫攻擊。 在NRPBFT 算法中,對節(jié)點的可信度進行評估,選取可信度最高的節(jié)點作為主節(jié)點,除主節(jié)點外可信度最高的p個節(jié)點作為共識集群,核心的階段都在共識集群中進行,最后只需要將共識集群共識完成的信息發(fā)送給普通節(jié)點,避免了惡意節(jié)點過多參與共識過程,減少了惡意節(jié)點作惡的機會。
從以上分析可以看出,改進后的算法繼承了PBFT 算法的優(yōu)點,且相對PBFT 算法更能抵抗女巫攻擊造成的影響,進一步防止了節(jié)點作弊。
在聯(lián)盟鏈中難以避免會有惡意節(jié)點的存在,在節(jié)點達成共識的過程中,惡意節(jié)點可以會散布不實信息,影響數(shù)據(jù)的一致性,尤其是在金融或者一些特殊應(yīng)用領(lǐng)域,分布式系統(tǒng)需要確保一致性和正確性。使用PBFT 共識算法可以有效解決惡意節(jié)點的問題,但是PBFT 算法本身還存在性能和開銷上的問題。 本課題針對聯(lián)盟鏈中應(yīng)用的PBFT 共識算法在部署鏈碼進行交易的過程中存在的問題展開了分析,通過部署鏈碼的方式實現(xiàn)交易,并根據(jù)交易過程中的性能和開銷對PBFT 算法進行改進。 提出了NRPBFT 算法,采用選舉集群的方式,將所有的節(jié)點分成普通節(jié)點和共識節(jié)點。 利用節(jié)點可信度評估公式對所有節(jié)點的可信度進行評估,并對節(jié)點的可信度進行排序,選可信度最高的前p個節(jié)點作為共識集群,選取可信度最高的節(jié)點作為主節(jié)點,大大降低了惡意節(jié)點成為主節(jié)點的概率。
未來的研究方向是將NRPBFT 算法進行進一步優(yōu)化,進一步降低系統(tǒng)的消耗,提升系統(tǒng)的性能,或者考慮一些其他方法,來降低主節(jié)點的中心化風(fēng)險。 除此以外,類似于RSA 這樣的簽名算法,簽名速度比較慢,可以考慮換成其他簽名算法來運行簽名過程和驗證過程。 還可以考慮其他的方式,使得在惡意節(jié)點數(shù)量更多的情況下,也能保證網(wǎng)絡(luò)中誠實節(jié)點達成共識。 以上所討論的問題,還有待后續(xù)進一步的研究。