葉翰文,歐陽思源,包振強
(揚州大學 信息工程學院,江蘇 揚州 225002)
區(qū)塊鏈技術(shù)發(fā)源于比特幣[1],是近年來最具革命性的新興技術(shù)之一[2],通過去中心化的方式建立信任,擁有非常廣闊的應(yīng)用前景,受到各國政府、科技企業(yè)、愛好者和媒體的高度關(guān)注[3,4].綜合來看,區(qū)塊鏈就是基于區(qū)塊鏈技術(shù)形成的公共數(shù)據(jù)庫,記錄過去發(fā)生的交易以及數(shù)據(jù)信息,具有不可篡改、公開透明和安全可靠的特性[5].
區(qū)塊鏈架構(gòu)是一種分布式架構(gòu)[6],節(jié)點間通過異步通信形成網(wǎng)絡(luò)集群.然而,在異步系統(tǒng)中可能會出現(xiàn)無法溝通的故障節(jié)點,節(jié)點的性能也可能會降低,網(wǎng)絡(luò)可能會擁塞.這些潛在因素可能會導致錯誤數(shù)據(jù)在系統(tǒng)內(nèi)傳播,節(jié)點無法對提案形成共識,因此需要在默認不可靠的異步網(wǎng)絡(luò)中定義容錯協(xié)議,以確保系統(tǒng)中節(jié)點間對于某個提案達成安全可靠的狀態(tài)共識[7],而共識算法就能夠確定網(wǎng)絡(luò)中選擇節(jié)點的機制,并保障系統(tǒng)滿足不同程度的一致性[8].
共識算法作為底層的核心技術(shù),直接影響區(qū)塊鏈整體的性能優(yōu)劣.根據(jù)系統(tǒng)參與方分類,區(qū)塊鏈的部署模式有公有鏈、聯(lián)盟鏈、私有鏈3種[9].多品類多用戶參與的公有鏈業(yè)務(wù)復雜,占用空間較大,且對數(shù)據(jù)的存儲要求極高[10];私有鏈專注于內(nèi)部業(yè)務(wù),雖然數(shù)據(jù)量小但不利于不同的用戶共享信息;聯(lián)盟鏈是一個典型的“多中心”架構(gòu),專注于某一個特定的群體,存儲容量合適,鏈上成員作為一個接入中心,將交易數(shù)據(jù)上傳至區(qū)塊鏈即可.聯(lián)盟連通常采用實用拜占庭容錯算法(Practical Byzantine Fault Tolerance,PBFT)進行全網(wǎng)共識[11].PBFT算法作為針對拜占庭問題的容錯算法,解決節(jié)點在存在故障和作惡條件下達成一致的問題[12],使拜占庭協(xié)議能夠在分布式系統(tǒng)中得到應(yīng)用,因此在要求強一致的聯(lián)盟鏈與私有鏈被廣泛采用.然而PBFT算法在追求去中心化的過程中,讓系統(tǒng)內(nèi)除客戶端以外的所有節(jié)點都參與共識流程,節(jié)點間需要不斷交互確認來保障一致性,導致PBFT算法通信復雜度較高,提高了系統(tǒng)運行所需的通信開銷.
針對傳統(tǒng)PBFT算法通信開銷大、可擴展性差、安全性不足[13]等弊端,本文提出了一種引入秘密共享的改進PBFT共識算法(Secret Sharing-Practical Byzantine Fault Tolerance,SSPBFT),通過引入秘密共享方案將共享的密文碎片在主節(jié)點集合里進行合理分配,對共識確認階段進行簡化,不再需要客戶端參與回復,優(yōu)化了一致性協(xié)議,從而減少視圖更換、簽名驗證等開銷.實驗分析表明,SSPBFT算法減少了節(jié)點完成共識所需要的通信次數(shù),降低了算法的通信復雜度,具有較高的安全性和運行效率.
自1999年P(guān)BFT被Miguel Castro和Barbara Liskov于文獻[14]中提出后,相繼出現(xiàn)了各種針對傳統(tǒng)PBFT算法缺陷的改進方案.文獻[15]提出一種基于距離的面向區(qū)塊鏈的共識算法,將系統(tǒng)中距離較近的節(jié)點進行分組來降低算法的通信次數(shù).然而該算法無獎懲機制,無法減少系統(tǒng)中出現(xiàn)拜占庭節(jié)點的概率,惡意節(jié)點可以反復交替執(zhí)行攻擊.文獻[16]設(shè)計了基于門限和環(huán)簽名的抗自適應(yīng)攻擊拜占庭容錯共識算法,將網(wǎng)絡(luò)劃分為眾多最小連通性網(wǎng)絡(luò)以保證在最小連通性網(wǎng)絡(luò)環(huán)境中實現(xiàn)低延遲、高魯棒性.但是該算法的共識節(jié)點固定,雖然在提案前匿名選取提案主節(jié)點以此模糊攻擊者入侵,但是職責重要的潛在提案者會被個別節(jié)點所壟斷,嚴重依賴于壟斷節(jié)點的可靠性,算法動態(tài)性不足.文獻[17]針對物聯(lián)網(wǎng)提出了G-PBFT共識算法,該算法將物聯(lián)網(wǎng)設(shè)備作為共識節(jié)點,在參與共識的同時防止女巫攻擊,降低了共識時延,但系統(tǒng)內(nèi)隱私數(shù)據(jù)易被入侵,算法安全性較低.文獻[18]引入可信計算平臺(Trusted Computing Platform,TCP),減少了系統(tǒng)運行所需的服務(wù)器數(shù)量,降低了達成一致所需的通信開銷.文獻[19]提出了SBFT(Speculative Byzantine Fault Tolerance)算法,成功將系統(tǒng)通信復雜度降至O(N),但該方案中的門限簽名機制過于依賴主節(jié)點性能,主節(jié)點被入侵會導致系統(tǒng)安全性大幅下降,導致算法魯棒性較低.2019年由NEO提出DBFT共識算法[20],通過實時投票選舉并授權(quán)每輪參與共識的節(jié)點,顯著提高了算法可擴展性,但是高通信復雜度的弊端依舊存在.文獻[21]以提高系統(tǒng)吞吐量為核心提出Tendermint算法,提升了節(jié)點投票效率,但算法性能隨著節(jié)點數(shù)增加而驟降,可擴展性較差.文獻[22]設(shè)計了一種考慮權(quán)重的簡化PoWS共識算法,在制造服務(wù)集成平臺上建立了不依賴第三方的信任框架.
綜合當前研究現(xiàn)狀,目前拜占庭容錯算法主要優(yōu)化方向是引入其他機制來改進節(jié)點選舉方式,對系統(tǒng)中的節(jié)點進行分組、篩選,通過縮小參與共識的節(jié)點數(shù)量來降低共識時延,提升算法效率.然而大部分方案仍需要節(jié)點進行兩兩交互來保持系統(tǒng)狀態(tài)一致,未能從根本解決通信復雜度高的問題,縮小節(jié)點規(guī)模也會導致系統(tǒng)更容易遭到惡意節(jié)點的自適應(yīng)攻擊,系統(tǒng)安全性得不到保障.
為了更加方便地對SSPBFT共識算法進行描述,對相關(guān)概念及假設(shè)進行如下說明:
定義1.共識節(jié)點.共識節(jié)點根據(jù)職責的不同分為候選節(jié)點、主節(jié)點與驗證節(jié)點,其中驗證節(jié)點的等級最高、候選節(jié)點的等級最低.
候選節(jié)點負責接收來自客戶端的請求,定時向主節(jié)點提案,不負責共識的實際執(zhí)行,類似預(yù)提交處理器,用字母C表示.C={C1,C2,…,Ct}代表系統(tǒng)內(nèi)t個候選節(jié)點的集合.在數(shù)據(jù)上傳至區(qū)塊鏈網(wǎng)絡(luò)后,候選節(jié)點先檢驗客戶端身份,隨后對上傳的數(shù)據(jù)進行合法性檢驗并向主節(jié)點發(fā)出提案請求,在收到主節(jié)點答復后對數(shù)據(jù)進行組裝打包,發(fā)往主節(jié)點.在確認其他類型的節(jié)點中出現(xiàn)故障節(jié)點或拜占庭節(jié)點后,候選節(jié)點可以作為候補臨時代替主節(jié)點或驗證節(jié)點執(zhí)行任務(wù),以維護算法正常運作.
主節(jié)點接收來自候選節(jié)點的打包信息,檢查數(shù)字簽名與視圖編號是否正確合法,驗證通過后參與信息的共識流程.主節(jié)點用字母M表示,M={M1,M2,…,Mn}代表系統(tǒng)內(nèi)主節(jié)點集合.
驗證節(jié)點用字母V表示,負責保障共識算法的一致性,包括記錄主節(jié)點公鑰、驗證主節(jié)點簽名、生成驗證隨機數(shù)、啟動視圖更換協(xié)議.成功通過節(jié)點V驗證的數(shù)據(jù)信息將被寫入?yún)^(qū)塊.所有的主節(jié)點有權(quán)利向驗證節(jié)點提出查詢驗證結(jié)果的請求,驗證節(jié)點在收到主節(jié)點的查詢請求后應(yīng)當在規(guī)定時間內(nèi)給予主節(jié)點答復.
定義2.消息.節(jié)點之間通過各種類型的消息完成互動與共識,根據(jù)消息發(fā)送者身份的不同的可將消息分類為:預(yù)案消息、簽名消息與驗證消息.
預(yù)案消息是指候選節(jié)點在接收到客戶端請求后,向主節(jié)點與驗證節(jié)點發(fā)出提案請求的消息.消息格式為
簽名消息指主節(jié)點在參與共識的過程中對數(shù)據(jù)信息進行數(shù)字簽名的消息,消息格式一般為
驗證消息指驗證節(jié)點對從主節(jié)點接收到的驗證消息進行一致性審核后的簽名信息.消息格式為
定義3.秘密共享.秘密共享(Secret-Sharing)屬于現(xiàn)代密碼學的一個分支,由經(jīng)典密碼理論衍生而出,是一種將秘密分割存儲的密碼技術(shù),主要用于防止關(guān)鍵信息被丟失、破壞或篡改,達到分散風險和容忍入侵的目的.秘密共享方案先將密文拆分成若干份,拆分后的每一份成為一個共享,并合理分配給不同的用戶管理,以防秘密集中被壟斷.單個用戶無法獨自還原,只有用戶特定子集共同提供各自的共享才能恢復密文.當任何用戶發(fā)生意外情況時,仍舊能還原出完整秘文.秘密共享對加密信息進行了嚴格的控制,消除單點漏洞,個人密鑰持有者不能篡改或訪問數(shù)據(jù)信息,授權(quán)子集相互協(xié)作才能還原加密信息,能有效地防止系統(tǒng)外敵人的攻擊和系統(tǒng)內(nèi)用戶的背叛,因此在數(shù)字簽名,身份驗證,密鑰管理等實際應(yīng)用中有重要作用.
本文采用秘密共享方案為(L,K)門限方案[23].在該方案中,將一份密文生成K份密文碎片后發(fā)送給不同用戶,持有其中的L份就能還原出完整的密文,少于L份碎片則無法求出原密文.門限秘密共享方案利用總數(shù)為K個共享中的至少L個共享之間的共同協(xié)作來管理關(guān)鍵密文,理論上能保護任何類型的數(shù)據(jù),主要應(yīng)用于密鑰管理以及信息保護.
定義4.驗證隨機數(shù).在SSPBFT共識算法中,主節(jié)點之間需要在區(qū)塊生成前根據(jù)秘密共享方案協(xié)作還原出驗證節(jié)點生成的驗證隨機數(shù),驗證隨機數(shù)記為R.只有在正確的驗證隨機數(shù)R數(shù)量達到指定閾值后才能完成區(qū)塊共識;若未能達到閾值則共識失敗,主節(jié)點需要重新開始共識.在共識過程中,驗證隨機數(shù)R由驗證節(jié)點隨機生成并由各主節(jié)點進行還原,理論上即使在參與共識的節(jié)點中只有一個誠實節(jié)點,其余所有拜占庭節(jié)點共謀也無法預(yù)測或偽造出相同的隨機數(shù).因此驗證隨機數(shù)R可以檢測出系統(tǒng)中是否存在拜占庭節(jié)點,從而有效地阻止惡意節(jié)點篡改或刪除數(shù)據(jù).
假設(shè)1.本文的改進共識算法的應(yīng)用場景為聯(lián)盟鏈,由生態(tài)內(nèi)多中心節(jié)點共同維護.本文假設(shè)聯(lián)盟鏈的鏈上節(jié)點并不能全部以理想性能運行,且可能存在故障節(jié)點與拜占庭節(jié)點.運行中的任何環(huán)節(jié)都可能存在故障,如通信網(wǎng)絡(luò)發(fā)生中斷、節(jié)點發(fā)生故障、系統(tǒng)被惡意入侵阻礙共識流程等.
假設(shè)2.假設(shè)聯(lián)盟鏈中參與共識的主節(jié)點總數(shù)為N(N>1),拜占庭節(jié)點數(shù)量為f,在N>3f+1的情況下能夠保證系統(tǒng)的安全性與活性.
假設(shè)3.拜占庭節(jié)點允許共謀且行為隨機,但是拜占庭節(jié)點的計算能力有限,無法在有限時間內(nèi)突破系統(tǒng)密碼機制.
假設(shè)4.鏈上節(jié)點之間的錯誤是不相關(guān)的.
假設(shè)5.系統(tǒng)內(nèi)節(jié)點之間通過異步網(wǎng)絡(luò)連接,遵循FLP(Fischer-Lynch-Patterson)定理.
假設(shè)6.節(jié)點之間傳遞的信息,第三方可以察覺,但是不能篡改、偽造內(nèi)容或破壞信息完整性.
假設(shè)7.由證書認證機構(gòu)CA(Certification Authority)頒發(fā)系統(tǒng)節(jié)點的數(shù)字證書與公鑰,各節(jié)點公鑰在系統(tǒng)內(nèi)公開,確保所有記錄信息的合法性,并及時檢測到任何篡改.
假設(shè)8.共識過程中任何操作都是原子的,且共識狀態(tài)的改變是持久的,某個操作執(zhí)行后造成的狀態(tài)變更是永久性的,不會失效.
雖然PBFT算法解決了節(jié)點在拜占庭將軍問題中達成一致的問題,但共識過程中要求節(jié)點頻繁交互來保持狀態(tài)一致,導致PBFT算法的通信復雜度高達O(N2),而通過縮小節(jié)點規(guī)模減少通信次數(shù)則會犧牲算法實用性.為了有效降低算法的通信復雜度、減少通信開銷,本文引入秘密共享方案對算法共識確認階段進行簡化,通過將共享的密文碎片在主節(jié)點集合里進行合理分配,使得當驗證節(jié)點收到滿足閾值條件的正確驗證隨機數(shù)R后,便可對信息的簽名結(jié)果進行安全驗證,從而不再需要客戶端參與回復.改進后的SSPBFT算法實現(xiàn)了對PBFT算法一致性協(xié)議的優(yōu)化,擁有比PBFT算法更優(yōu)秀的通信復雜度與運算效率.
本文提出的引入秘密共享的SSPBFT共識協(xié)議的具體過程如下所示:
首先是作為準備工作的共識初始化階段:候選節(jié)點接收客戶端發(fā)送的數(shù)據(jù)信息,進行一次哈希處理后打包并向主節(jié)點(以N個為例)與驗證節(jié)點發(fā)送預(yù)案消息.驗證節(jié)點收到預(yù)案消息后生成驗證隨機數(shù)R,隨后將R通過秘密共享方案生成N份碎片,分別用N個主節(jié)點的公鑰加密并將密文碎片分配給N個主節(jié)點(每個主節(jié)點都能收到完整的N份密文碎片);主節(jié)點通過規(guī)則驗證預(yù)案消息,舍棄不合法的數(shù)據(jù)信息,將合法的數(shù)據(jù)信息將在簽名后匯總成信息候選集.信息候選集里面還包括主節(jié)點無法確認是否合法而遺留下來的存在爭議的信息.
初始化準備完成后,主節(jié)點之間需要根據(jù)秘密共享計劃協(xié)作還原出正確的驗證隨機數(shù).在SSPBFT共識算法采用的秘密共享計劃中,密文被分割成N份密文碎片,持有大于等于log2N+1份的碎片就能還原出完整密文(實際情況中,主節(jié)點持有的碎片數(shù)須為正整數(shù)).由假設(shè)2可知,主節(jié)點數(shù)量N必定大于1,因此可以確保N≥log2N+1.主節(jié)點間通過如下流程對隨機數(shù)達成共識:
1)主節(jié)點在接收到密文碎片后,利用私鑰解密其中可解出的一份碎片密文.隨后該主節(jié)點選取在集合M中序列依次在自己后的log2N個主節(jié)點,并將自己還原出的一份碎片明文發(fā)送給這些節(jié)點(M1從M2開始依次往后選取,Mn從M1開始往后依次選取,以此類推).
2)主節(jié)點在廣播碎片明文時,還同時廣播其信息候選集中的每份信息.
3)各主節(jié)點在收到其他主節(jié)點的廣播后,判斷廣播內(nèi)容是否來自于系統(tǒng)中其他主節(jié)點,如果不是則自動忽略;如果確認無誤,則檢查信息簽名、內(nèi)容、哈希值是否合法,若通過驗證則對信息進行數(shù)字簽名.
4)每個主節(jié)點在接收到來自其他主節(jié)點的log2N份密文碎片后還原出驗證隨機數(shù)R并進行簽名.在驗證隨機數(shù)產(chǎn)生后,每個主節(jié)點合并并向驗證節(jié)點廣播步驟3中的所有數(shù)據(jù)信息,剔除只有哈希值但無法獲得詳細數(shù)據(jù)的部分.
5)驗證節(jié)點接受來自主節(jié)點的打包信息,驗證數(shù)字簽名信息的合法性,并對驗證隨機數(shù)的結(jié)果進行統(tǒng)計分析.SSPBFT算法中將一致性閾值設(shè)定為2/3,只有在獲得超過三分之二正確的驗證隨機數(shù)后,主節(jié)點簽名的信息才能完成驗證節(jié)點的驗證并被寫入?yún)^(qū)塊,否則共識失敗,轉(zhuǎn)回第一步進行共識重試.
每當一輪共識完成,系統(tǒng)就會更新本地區(qū)塊鏈賬本,以保證數(shù)據(jù)的一致性.
本文采用的SSPBFT共識屬于中性的共識機制,限制了主節(jié)點的權(quán)利,主節(jié)點不能改變數(shù)據(jù)信息,也不能人為排除某份數(shù)據(jù)信息.單個節(jié)點沒有權(quán)限拒絕正確合法的數(shù)據(jù)信息進入當前區(qū)塊,每個區(qū)塊的生成由全體節(jié)點共同參與.該模式下節(jié)點利益與系統(tǒng)利益一致,維護系統(tǒng)穩(wěn)定運行就是保護節(jié)點自身的利益.
PBFT算法的通信模式如圖1所示,SSPBFT算法的通信模式如圖2所示,圖1與圖2中N均取3,C1代表客戶端,C2代表候選節(jié)點.
圖1 PBFT算法通信模式
圖2 SSPBFT算法通信模式
由于本文的SSPBFT共識算法以聯(lián)盟鏈為基礎(chǔ),因此在第一輪共識開始之前,會從聯(lián)盟成員中預(yù)置一份信任節(jié)點名單UNL(Unique Node List)作為初始主節(jié)點,初始主節(jié)點中評價最高的節(jié)點將作為驗證節(jié)點.考慮到共識過程中可能存在網(wǎng)絡(luò)通信故障或節(jié)點被入侵導致算法無法正常運行的情況發(fā)生,為了提高系統(tǒng)的魯棒性,SSPBFT共識算法引入節(jié)點輪換機制,允許節(jié)點通過規(guī)則改變自身的身份,促進候選節(jié)點與主節(jié)點的良性循環(huán)競爭,阻止惡意節(jié)點交替進行攻擊.根據(jù)預(yù)置的主節(jié)點數(shù)量,系統(tǒng)會按照積分從集合C中選拔優(yōu)秀的候選節(jié)點替換失職或注銷的主節(jié)點.在實際應(yīng)用過程中,可根據(jù)部署系統(tǒng)的需求,對候選節(jié)點和預(yù)備節(jié)點的比例進行調(diào)整.聯(lián)盟鏈中,節(jié)點需要得到聯(lián)盟鏈的授權(quán)后才能夠加入到聯(lián)盟鏈網(wǎng)絡(luò)中,系統(tǒng)根據(jù)節(jié)點評分將新節(jié)點劃分到對應(yīng)節(jié)點集合中.為維護系統(tǒng)穩(wěn)定性,通常情況下,不將新節(jié)點直接劃為共識節(jié)點.下面詳細介紹節(jié)點輪換的具體步驟:
1)候選節(jié)點集合排序
SSPBFT 算法將節(jié)點綜合實力作為初始積分的評分依據(jù),每個節(jié)點有唯一的序號標識,一個節(jié)點的評分由節(jié)點的性能與日常的行為表現(xiàn)決定.穩(wěn)定履行自身職責的節(jié)點獲得評分獎勵,而因故障、延遲、入侵等原因未能在共識流程中及時響應(yīng)的節(jié)點會受到相應(yīng)的懲罰.所有節(jié)點在進入系統(tǒng)時均會獲得初始評分,初始評分通過綜合評價節(jié)點性能得出.集合中若兩節(jié)點積分相同,則參考節(jié)點加入聯(lián)盟鏈的累計時長進行排序,入鏈時間長的節(jié)點排在前位.系統(tǒng)固定每月根據(jù)積分實時更新一次節(jié)點評分、類別和狀態(tài),并根據(jù)評分動態(tài)調(diào)整節(jié)點身份,防止重要職位被個別節(jié)點壟斷.根據(jù)評分規(guī)則,分數(shù)過低的節(jié)點會被移出該節(jié)點集合,并降至低一級的節(jié)點集合之中.低分數(shù)的候選節(jié)點會被取消節(jié)點資格,當有候選節(jié)點被取消資格后,為了保證有足夠的節(jié)點進行算法的正常運行,系統(tǒng)會及時補充新的候選節(jié)點加入集合C中.
2)故障節(jié)點輪換
為確保能及時發(fā)現(xiàn)普通故障節(jié)點,提高算法的穩(wěn)定性,主節(jié)點與候選節(jié)點、主節(jié)點與驗證節(jié)點之間會定時互相發(fā)送安全確認消息,未按時收到對方的消息反饋則默認節(jié)點失效.如果默認失效的是主節(jié)點或驗證節(jié)點,則從候選節(jié)點集合C中選取當前位于集合最前端的候選節(jié)點臨時替換發(fā)生故障的節(jié)點,臨時替代并成功完成共識的候選節(jié)點將獲得評分獎勵,加入高一級的節(jié)點集合之中,主節(jié)點或驗證節(jié)點在修復缺陷后將被直接降至候選節(jié)點集合.
視圖轉(zhuǎn)換協(xié)議的目的在于當共識過程中節(jié)點發(fā)成故障導致未能完成區(qū)塊生成時保障各節(jié)點狀態(tài)同步,提升系統(tǒng)魯棒性.當系統(tǒng)在特定時間內(nèi)未完成來自客戶端的請求,驗證節(jié)點將啟動視圖轉(zhuǎn)換協(xié)議以避免等待響應(yīng)的時間過長.視圖轉(zhuǎn)換協(xié)議負責從節(jié)點集合中選取新的節(jié)點替換失效或故障節(jié)點,并更換新視圖,從而保障系統(tǒng)活性.具體流程如下所示:
1)失效的故障節(jié)點將被輪換,新選取的節(jié)點將取代失效節(jié)點的職能并參與到后續(xù)的流程當中.
2)驗證節(jié)點啟動視圖轉(zhuǎn)換協(xié)議,將當前視圖編號增加一位,并向主節(jié)點發(fā)送包含轉(zhuǎn)換視圖信息的驗證消息,消息格式為:
3)主節(jié)點在收到驗證消息后,同樣改變視圖編號,簽名信息并廣播至候選節(jié)點,消息格式為:
4)候選節(jié)點在收到大于主節(jié)點總數(shù)2/3數(shù)量的簽名信息后,廣播新視圖消息,重新向主節(jié)點發(fā)起提案,開啟新一輪共識,消息格式為:
在本文提出的SSPBFT算法中,攻擊者必須同時獲得一定數(shù)量的秘文碎片才能獲得密鑰,當閾值設(shè)定為2/3時,滿足假設(shè)2的條件,能夠保障系統(tǒng)的安全性與活性;另一方面,當部分秘文碎片因各種意外情況而遺失或被篡改后,利用其余的秘文碎片仍能還原出完整密文,系統(tǒng)可靠性得到保障.
由于拜占庭缺陷具有不可預(yù)測、任意性的特點,因此通過主節(jié)點、候選節(jié)點與驗證節(jié)點之間定時發(fā)送安全確認消息來應(yīng)對惡意節(jié)點生成驗證隨機數(shù)并發(fā)送碎片的情況,未能及時并準確回復的節(jié)點將根據(jù)輪換規(guī)則進行處罰.
針對惡意節(jié)點發(fā)動女巫攻擊的情況,系統(tǒng)中各節(jié)點通過CA注冊,并獲得由CA簽名的數(shù)字證書和公鑰-私鑰對,因此系統(tǒng)內(nèi)節(jié)點均具備獨一的身份標識,任何用戶都能通過CA的公鑰來檢驗證書的有效性.對于第三方權(quán)威CA機構(gòu),可以依據(jù)證書信任鏈通過上層CA證書對CA公鑰合法性進行驗證.CA需要利用自身私鑰對頒發(fā)的證書簽名,以防止出現(xiàn)公鑰或證書被他人篡改的情況.證書在超出有效期后會作廢,退出或被移出系統(tǒng)的節(jié)點會被吊銷證書文件.各節(jié)點在傳輸數(shù)據(jù)信息時用自身私鑰進行簽名,因此基于非對稱密碼學的安全性,在節(jié)點能妥善保管好自身密鑰的情況下,惡意節(jié)點不能盜用其他節(jié)點的身份發(fā)送數(shù)據(jù),以此確保所有記錄信息的合法性,并及時檢測到任何篡改,實現(xiàn)對用戶公鑰的安全分發(fā).
要實現(xiàn)絕對理想的嚴格一致性,代價很大,除非達成系統(tǒng)不發(fā)生任何故障,而且所有節(jié)點之間的通信無需任何時間的理想狀態(tài),最多只能保證一致性(Consistency)、可用性(Availability)以及分區(qū)容忍性(Partition)這3項特性中的兩項,共識協(xié)議往往需要弱化對某個特性的需求.考慮到聯(lián)盟鏈系統(tǒng)對數(shù)據(jù)一致性相當敏感,應(yīng)當做到數(shù)據(jù)真實不可篡改且安全可靠,因此本文中的SSPBFT算法選擇相對弱化可用性來保證系統(tǒng)一致性.具體表現(xiàn)為:
1)共識過程中任何操作都是原子的,所有狀態(tài)的改變都是操作成功執(zhí)行后的結(jié)果,并保持強一致,不存在中間狀態(tài),且狀態(tài)變更是永久性的,不會失效.
2)節(jié)點間操作可以并行執(zhí)行,但彼此之間互相不影響.一旦有操作失敗,則需要回退狀態(tài)到操作執(zhí)行之前.
3)驗證節(jié)點基于超時機制檢測其他節(jié)點狀態(tài),通過觸發(fā)視圖轉(zhuǎn)換協(xié)議來阻止惡意節(jié)點發(fā)起的攻擊.當觸發(fā)視圖轉(zhuǎn)換協(xié)議時,各節(jié)點廣播視圖轉(zhuǎn)換消息,只有在收到大于閾值數(shù)量的主節(jié)點簽名后才會在新視圖重新發(fā)起提案.
4)由于犧牲了一定的可用性,節(jié)點會因為處理請求超時而停止工作,直到系統(tǒng)觸發(fā)視圖轉(zhuǎn)換協(xié)議后,由候選節(jié)點重新發(fā)起共識請求.因此,當SSPBFT算法中系統(tǒng)出現(xiàn)故障時,平均修復時間(Mean Time To Repair,MTTR)較傳統(tǒng)PBFT算法更長一點.
根據(jù)假設(shè)2,假定每個驗證節(jié)點在單位時間內(nèi)收到主節(jié)點驗證信息的概率為p,主節(jié)點總數(shù)為N,可以推出驗證節(jié)點接收到q份正確驗證信息(事件X)的概率遵循二項分布,具體概率分布如公式(1)所示:
(1)
本文提出的SSPBFT算法將一致性閾值設(shè)置為三分之二,因此q ≥(2N/3),則提案成功概率如公式(2)所示:
(2)
當N取10、15、20時的概率分布如圖3所示,可見當接收驗證信息概率p大于0.8時,提案成功率接近于95%,在p等于0.9時可達到100%成功提案.
圖3 SSPBFT提案成功率
SSPBFT算法通過優(yōu)化傳統(tǒng)PBFT算法中的一致性協(xié)議來降低通信復雜度,提高算法效率.本文在此通過比較兩種算法完成一次一致性協(xié)議節(jié)點間需進行的通信次數(shù),來計算分析算法各自的通信復雜度.計算過程中統(tǒng)一假設(shè)系統(tǒng)中有n個節(jié)點參與共識,且默認所有節(jié)點均正常運作(由假設(shè)2可知,N=n-1).
1)PBFT算法通信次數(shù):
下面根據(jù)PBFT算法流程計算單次共識中節(jié)點間需要進行的通信次數(shù):
預(yù)準備階段,主節(jié)點將預(yù)準備消息發(fā)送給其他所有節(jié)點,需要進行(n-1)次通信;準備階段,各個節(jié)點需要發(fā)送準備消息給其他節(jié)點,需要進行(n-1)(n-1)次通信;確認階段,各個節(jié)點將確認消息廣播給其余節(jié)點,又需要n(n-1)次通信.因此完成一次PBFT共識,總共需要的通信次數(shù)如公式(3)所示:
N1=2n(n-1)
(3)
由式(1)可知傳統(tǒng)PBFT算法通信復雜度為O(N2).
2)SSPBFT算法通信次數(shù):
在本文提出的SSPBFT共識算法中,主節(jié)點選取集合M中節(jié)點編號依次往后的log2N個主節(jié)點進行通信廣播,從而降低通信復雜度.下面根據(jù)SSPBFT共識算法的流程計算單次共識節(jié)點間進行的通信次數(shù):
共識初始化接段,候選節(jié)點接收并處理客戶端發(fā)送的數(shù)據(jù)信息,隨后發(fā)往主節(jié)點,需要進行n次通信.
初始化完成后,驗證節(jié)點生成驗證隨機數(shù),分成N份碎片后發(fā)往主節(jié)點,需要進行(n-1)次通信.主節(jié)點之間需要根據(jù)秘密共享計劃協(xié)作還原出正確的驗證隨機數(shù),在此過程中,主節(jié)點選取在集合M中序列依次在自己后的log2N個主節(jié)點進行信息廣播,共計需要進行(n-1)log2n次通信.主節(jié)點還原出隨機數(shù)R后向驗證節(jié)點提交驗證,驗證成功則生成區(qū)塊,需要進行(n-1)次通信.因此完成一次SSPBFT共識,總共需要的通信次數(shù)如公式(4)所示:
N2=(3+log2n)(n-1)+1
(4)
由式(4)可知,本文提出的SSPBFT算法的通信復雜度為O(Nlog2N),優(yōu)于PBFT算法的通信復雜度O(N2).假設(shè)2中規(guī)定主節(jié)點總數(shù)大于1,因此上式中n≥3(驗證節(jié)點屬于參與共識的n個節(jié)點),故(3+log2n)<2n,(n-1)≥2,可以得出N2 本文SSPBFT算法與其他PBFT優(yōu)化算法的性能對比如表1所示. 表1 拜占庭容錯算法性能對比 本文實驗均采用Intel(R)Core(TM)i7 處理器,16 GB 內(nèi)存的硬件平臺,在 Hyperledger Fabric框架的基礎(chǔ)上實現(xiàn)SSPBFT算法,利用四節(jié)點的網(wǎng)絡(luò)拓撲部署初始節(jié)點,保證實驗環(huán)境相同的情況下采用Caliper工具對系統(tǒng)吞吐量及共識時延進行測試.本文選取吞吐量(TPS)與共識時延(Delay)兩種性能指標,在相同實驗環(huán)境下比較SSPBFT算法與傳統(tǒng)的PBFT共識算法的效率與性能. 吞吐量指在單位時間內(nèi)系統(tǒng)模型能夠處理的請求數(shù)量,系統(tǒng)TPS表示如公式(5)所示: TPS=TradeΔt/Δt (5) 公式(5)中,Tradet為單位時間內(nèi)系統(tǒng)模型處理的請求次數(shù),Δt為單位時長.本文設(shè)置節(jié)點數(shù)量為自變量,將節(jié)點數(shù)由4逐步增加至30,實驗結(jié)果如圖4所示. 圖4 系統(tǒng)吞吐量對比 共識時延指從客戶端發(fā)送請求到整個共識過程完成所需要的時間,算法共識時延如公式(6)所示: Delay=Tfin-Tsta (6) 公式(6)中,Tfin為共識結(jié)束時間,Tsta為共識開始時間.本文同樣通過改變節(jié)點數(shù)量測試兩種算法的運行效率,節(jié)點數(shù)由4逐步增加至30,實驗結(jié)果如圖5所示. 圖5 算法共識時延對比 可以看出,由于擁有較低的通信復雜度,本文采用的SSPBFT共識在節(jié)點數(shù)量改變的整個過程中,吞吐量始終大于PBFT算法,證明SSPBFT共識算法具有更良好的處理性能.在共識時延方面,當節(jié)點數(shù)量較少時,SSPBFT與PBFT兩種共識策略時延相差無幾,但是隨著節(jié)點數(shù)量的逐步增加,SSPBFT算法的時延增長率更小,保持了比PBFT算法更優(yōu)秀的時延穩(wěn)定性與可擴展性. 本文設(shè)計了引入秘密共享的改進PBFT共識算法,利用秘密共享機制解決了傳統(tǒng)PBFT算法通信復雜度高、可擴展性差的弊端,用實驗證明SSPBFT算法比傳統(tǒng)PBFT有更優(yōu)秀的共識時延與吞吐量.然而,強一致性要求會導致系統(tǒng)非拜占庭節(jié)點不能確保在有限時間內(nèi)完成對操作請求的應(yīng)答.當系統(tǒng)中的網(wǎng)絡(luò)發(fā)生分區(qū)故障,可能會影響到系統(tǒng)的正常服務(wù).如何在保證系統(tǒng)高性能的同時降低犧牲的可用性能是日后重要的研究課題.4.5 實驗結(jié)果與分析
5 總 結(jié)