殷 磊 孔憲光 劉洪杰 張迎冰 劉樹全
1(西安電子科技大學機電工程學院 西安 710071)2(睿蜂群(北京)科技有限公司 北京 100083)
傳統供應鏈難以實現工業品生產制造企業內部信息系統之間、企業之間、企業和用戶之間的信息匯聚及有效利用[1],致使工業品生產全過程數據追溯難,不能有效解決生產制造環節中的竄貨、質量問題責任不明、全鏈條數據可追溯等問題[2].區塊鏈技術具有不可篡改、強信任、在去中心化的條件下建立多方互信關系的特點[3],因此將區塊鏈技術應用到供應鏈的數據共享中,通過將產品數據保存在區塊鏈的分布式賬本中,使得供應鏈各個參與方通過智能合約,達成多方共識,形成多方交叉驗證機制,并形成具有公信力的防偽溯源機制,確保全過程數據可追溯.
因此,本文對供應鏈數據的安全共享問題進行探討,構建了一種基于區塊鏈的供應鏈數據安全共享模型,對傳統的PBFT共識算法作了改進,提出一種新的共識算法CEBFT(credit election Byzantine fault tolerance),優化了PBFT算法的一致性協議,并引入節點信用機制,提高共識算法的穩定性.另外,在算法中加入管理節點協調共識網絡的節點信息,控制節點加入和退出共識網絡,解決了PBFT算法無法動態刪除、添加節點的問題.最后通過實驗對CEBFT算法在通信復雜度、吞吐量以及時延等方面進行了驗證.
傳統的數據共享平臺基本都是基于第三方服務器進行數據的存儲和交換,用戶上傳數據后無法看到平臺內部的操作,只能被動地信賴第三方服務商,數據在共享過程中的完整性和機密性難以得到保障.因此本文參考文獻[4]在傳統數據共享模型的基礎上,基于區塊鏈設計了一種分布式的供應鏈數據安全共享模型,如圖1所示:

圖1 基于區塊鏈的供應鏈數據安全共享模型
該模型主要由供應鏈數據所有者、供應鏈數據消費者、客戶端、區塊鏈和IPFS分布式網絡組成.數據所有者主要通過客戶端對數據進行發布和加密.數據消費者通過客戶端根據訪問控制機制對需要的數據進行訪問.客戶端以可視化的方式為數據所有者和消費者提供面向不同終端的數據共享服務.區塊鏈網絡是基于以太坊搭建的聯盟鏈網絡,用于存儲IPFS系統的文件信息訪問地址和訪問控制策略.IPFS分布式網絡主要用來存儲數據所有者的加密數據,可以很好地解決區塊系統的存儲瓶頸問題.
在本模型架構中,主要使用基于IPFS分布式系統的鏈下存儲技術.將供應鏈質量數據存儲在IPFS系統中,IPFS根據內容返回一個哈希值,不僅可以使用這個哈希值來索引原始數據,還可以通過哈希值判定原始數據是否被篡改.鏈上存儲部分主要存儲IPFS分布式系統根據質量數據返回的哈希值和數據所有者設置的訪問控制策略.實現供應鏈數據共享分為以下3個階段:
1)數據發布.數據所有者將供應鏈中的產品數據通過客戶端的數據發布功能完成數據的加密和上傳.供應鏈數據的元數據提取后放到區塊鏈上,將數據加密后存儲到IPFS分布式網絡中,減輕區塊鏈的存儲負擔.
2)數據請求.數據消費者可以通過客戶端在系統中查找所需要的數據,并根據訪問控制方式向數據所有者發起訪問請求.
3)數據共享.如果數據消費者的自身屬性滿足數據所有者設置的訪問要求,則消費者可以通過訪問控制方式拿到所需要的數據.
實用拜占庭容錯算法[5]可以用于解決拜占庭將軍問題.實用拜占庭容錯算法中的一致性協議主要分為3個階段[6]:Pre-Prepare(預準備階段)、Prepare(準備階段)、Commit(確認階段).具體共識流程如圖2所示:

圖2 PBFT算法流程圖
1)預準備階段.主節點收到客戶端的交易請求后,為該請求分配編號,將請求封裝成預準備消息并發送給所有從節點,發送的消息為〈〈〈Pre-Prepare,n,v,d〉signature,m〉〉,其中n為序列號,v是視圖的編號,m為請求消息,d為m經過哈希運算后的摘要.
2)準備階段.從節點收到預準備消息后,對消息進行驗證并將消息添加到本地,然后構造Prepare消息并向其他從節點廣播,消息格式為:〈Prepare,v,n,d,i〉.同時該節點會不斷接收其他從節點的Prepare消息,并對其進行驗證.
3)確認階段.當從節點累計確認通過f+1個Prepare消息后,節點進入確認階段,該節點會構造Commit消息并向網絡中的其他節點發布.Commit消息格式為〈Commit,v,n,d,i〉,當從節點驗證通過f個Commit消息后,確定大部分節點都已經進入確認階段,完成了本次的共識過程.
針對聯盟鏈中PBFT算法通信時間復雜度過高、共識效率低下、不支持動態管理節點等問題,文獻[7]結合股份DPOS委托權益證明算法和PBFT算法,利用數字貨幣選出部分節點進行共識,有效降低了共識過程中的節點通信量;文獻[8]提出了協調節點的概念,利用協調節點管理整個共識網絡中的各個節點信息以及協調各個節點加入和退出共識網絡等操作,但是該算法的時間復雜度仍為O(n2),通信復雜度過高;文獻[9-10]設計了一種簡化的PBFT算法,將算法的時間復雜度降為O(n),但該算法要求共識網絡中不能存在拜占庭節點,算法的實用性不高;本文結合供應鏈數據共享場景和文獻[8,11]提出了一種適用于供應鏈聯盟鏈的CEBFT共識算法.
2.2.1 整體思想
在PBFT算法中,為了防止拜占庭節點對共識結果產生影響,共識過程中節點之間需要相互發送消息確認節點狀態,在確認過程中會產生大量通信,嚴重影響算法的共識效率.而在供應鏈的數據共享場景中,聯盟鏈中的所有節點都會經過認證審核,節點的可靠性更高.因此,本文對傳統PBFT算法的共識流程進行改進,在所有共識節點都正常的情況下,優化了一致性協議,降低節點間的通信量.同時為了保障參與共識節點的可靠性,引入信用機制,將聯盟網絡中的節點劃分為普通節點和候選節點,選擇高可靠性的節點參與共識.普通節點沒有生成和驗證區塊的權限,只負責結果存儲,候選節點信譽值較高,可以競選主節點參與共識流程.最后為了方便共識節點的加入和退出,在PBFT算法的基礎上加入管理節點,管理節點并不參與節點共識,只負責管理聯盟網絡中節點的狀態信息,控制節點加入和退出共識網絡.與PBFT算法相比,CEBFT算法更加適用于供應鏈數據共享場景,如表1所示:

表1 CEBFT共識算法與PBFT共識算法對比
2.2.2 節點信譽值
為了保障系統安全性,提高參與共識節點的可靠性,在本文算法中引入節點信用機制,給每個節點設置信譽值用于評估節點的可靠性.如果聯盟鏈中的節點在共識過程中無法正常出塊,則會通過懲罰機制降低該節點的信譽值,使得該節點在下次選舉時成為候選節點的概率下降.那些企圖在共識過程中生產非法區塊的節點很難累積信譽值,從而失去參與共識的機會,而可靠的生產節點能夠更快地累積信譽值,在選舉中更容易成為候選節點參與共識,使系統變得更加穩定可靠.
在每個共識過程結束后,根據節點的行為表現對節點信譽值重新進行評估計算,節點信譽值主要由以下因素決定:
1)節點當選為主節點,并正常完成了出塊過程,則該節點的信譽值加0.5.如果該節點沒有在系統規定時間內發起共識操作或者在確認提交階段沒有及時回饋,導致出塊失敗,則節點信譽值減0.5.
2)如果節點作為候選節點參與了本輪共識過程,在共識過程中能夠正確簽名驗證消息,則節點信譽值加0.25,反之未能在規定時間內正確簽名驗證消息,節點信譽值減0.25.
3)如果節點在本輪共識過程中成功參與投票選舉候選節點,則節點信譽值加0.25,反之節點信譽值減0.25.
2.2.3 主節點選取
為了提高算法的穩定性,在每輪共識過程中都會根據節點信譽值由高到低選取一半的節點作為候選節點參與本輪共識,然后在候選節點中選擇主節點完成本輪共識.隨著系統的運行,聯盟網絡中的節點會不斷地累積信譽值,并且成功出塊的主節點更容易累積信譽值,為了避免主節點被某高信譽值節點壟斷,本文結合follow-the-sa-toshi算法[12],根據每個節點信譽度大小從候選節點中依概率隨機確定主節點,如圖3所示,使所有的候選節點都有概率當選主節點來累積信譽值,從而使系統在一定程度上實現去中心化.

圖3 FTS樹模型
候選節點選舉完成后,將候選節點的信譽值作為權重構建Merkle樹,葉子節點的權重為某個候選節點的信譽值,非葉子節點的權重為其左右子樹的權重之和,然后節點根據一個數字隨機選擇Merkle樹的左右子樹,直到選出最終的葉子節點.
主節點選取流程:
1)候選節點選出后,統計全部候選節點的信譽值總值n,將候選節點的信譽值作為權重構建Merkle樹;
2)通過1個隨機數生成器生成1個(1,n)的隨機數rand;
3)將隨機數rand與Merkle樹子樹的權重進行比較,選擇合適子樹不斷向下遍歷,直到到達Merkle樹任意1個葉子節點,則該葉子節點的權重所代表的候選節點作為本輪的主節點產出區塊.
2.2.4 優化共識流程
PBFT共識算法的一致性協議在運行過程中需要完成2次復雜度為O(n2)的節點通信,這樣設計是為了在網絡中存在拜占庭節點的情況下,算法仍能夠完成共識.CEBFT算法在不存在拜占庭節點的情況下,對一致性協議進行優化,使其在完成復雜度為O(n)的節點通信后,算法就能夠完成共識.優化后的共識流程如圖4所示.共識過程如下:

圖4 優化共識流程
1)請求階段.客戶端節點發起交易請求,并將交易信息m發送給主節點,主節點對交易信息進行驗證,驗證通過則消息打包到區塊中,否則直接刪除消息.
2)預準備階段.主節點收到客戶端的交易請求后,為該請求分配編號,將請求封裝成預準備消息,并發送給所有的候選節點,發送的預準備消息為〈〈〈Pre-Prepare,n,v,d〉signature,m〉〉,其中n為序列號,v為視圖的編號,m為請求消息,d為m經過哈希運算后的摘要.
3)反饋階段.其他候選節點收到主節點的預準備消息后,首先通過主節點的公鑰去驗證預準備消息的簽名是否有效,然后判斷消息的視圖編號是否一致,最后對比本地的交易信息和預準備消息中的交易信息是否相同,全部驗證通過后,候選節點將該共識請求寫入日志,然后生成反饋消息發送給主節點.消息格式為〈Feedback,n,v,d〉signature,其中n為序列號,v為視圖的編號,m為請求消息,d為m經過哈希運算后的摘要,signature為候選節點對反饋消息的簽名.
4)確認階段.當主節點驗證通過所有反饋消息后,主節點構造確認消息發送給其他節點,節點收到主節點的Commit消息并對消息驗證通過后,將交易信息存入本地.Commit消息格式為〈Commit,n,v,d,a〉signature.
2.3.1 模型設計
為了方便共識節點的加入和退出,在PBFT算法的基礎上加入管理節點.管理節點并不參與節點共識,只負責管理聯盟網絡中節點的狀態信息.同時聯盟鏈中每個節點中都維持1個信息表,表中包含當前聯盟鏈中所有節點的信息,包括節點IP地址、ID信息、公鑰、節點狀態、信譽值等信息.節點的狀態分為Active和Exited 2種狀態,節點狀態為Active表示節點仍在共識網絡中參與共識;節點狀態如果為Exited,則表示當前節點已經退出共識網絡,不再參與共識.
2.3.2 節點加入流程
1)新的節點經過聯盟鏈審批后,需要在聯盟鏈CA服務器進行身份認證和注冊,節點注冊成功后,為新節點分配ID、公私鑰等信息.
2)管理節點監測到有新節點加入后,首先給新節點同步節點信息表,然后向聯盟網絡中的所有節點發布消息更新節點信息表,如表2所示:
3)管理節點將新節點的信息封裝成Join-Request消息,并向聯盟網絡中的所有節點進行廣播,Join-Request消息格式為〈Join-Request,id,pk,timestamp〉signature,id為新節點在節點信息表中的ID,ip為新節點的IP地址,用于之后的網絡通信,timestamp為新節點的加入時間,signature為管理節點對Join-Request消息的簽名.
4)聯盟網絡中的其他節點收到管理節點的Join-Request消息,驗證通過后,該節點將自己的節點編號j封裝成1條Join-Reply消息反饋給管理節點,表示認可新節點的加入,Join-Reply消息的格式為〈〈Join-reply,i,id〉signature,j〉,是該節點對Join-Reply消息的簽名.
5)管理節點收到2f+1個節點的Join-Reply消息后,通過signature對這些節點的簽名進行驗證,驗證通過后利用聚合簽名算法將這些節點的簽名聚合成1個新的簽名,然后向聯盟網絡中的所有節點發送Join-Commit消息,通知各節點更新本地節點信息表.Join-Commit消息的格式為〈Join-Commit,I,id,aggrsignature,node〉signature,aggresignature為將所有驗證通過的節點簽名聚合后生產的聚合簽名,node為所有驗證通過的節點ID列表,其他節點可以通過node集合驗證aggresignature聚合簽名的有效性.
6)聯盟網絡中的所有節點收到管理節點的Join-Commit消息后,通過node集合驗證聚合簽名有效后,更新本地節點信息表,此時新節點完成加入網絡的共識過程.節點加入過程如圖5所示:
聯盟鏈網絡節點在共識過程中產生大量通信,嚴重消耗網絡中的帶寬資源,通信開銷是衡量共識算法性能的重要指標.圖6所示為CEBFT算法和PBFT算法完成1次共識所產生的通信量:

圖6 2種算法交易通信量對比
PBFT算法的通信復雜度為O(n2),隨著節點數量的增多,節點間的通信次數呈指數增加,導致通信量快速增長.而CEBFT算法因為采用優化后的共識流程,通信復雜度可以降為O(n),通信量呈線性增長趨勢,增長緩慢.從圖6可以看出,CEBFT算法可以有效降低共享過程中的通信開銷,提高共識效率.
1)時延測試.
交易時延是衡量一種共識算法性能好壞的重要指標[13],通常是指客戶端發送交易請求到確認共識完成的時間間隔,交易時延越短區塊在共識過程中確認的速度越快,可以有效防止區塊分叉,提高系統的安全性.
本文實驗中時延數據取100次共識的平均值,測試了不同節點數量下2種算法的交易時延.
從圖7可以看出CEBFT算法的性能明顯優于PBFT算法,隨著節點數目的增多,CEBFT算法的交易時延增長緩慢,穩定性更高,優勢較為明顯.

圖7 2種算法交易時延對比
2)吞吐量測試.
吞吐量一般是指系統在單位時間內能夠完成的交易數量,是衡量共識算法性能的另一重要指標[14].本文在實驗中設置客戶端共發送1 000條數據,測試了CEBFT算法和PBFT算法在不同節點個數的情況下每秒完成的交易量.
從圖8可以看出CEBFT算法和PBFT算法的吞吐量都隨著網絡中節點的數量增加而下降,但在相同節點條件下,CEBFT算法明顯具有更高的吞吐量.

圖8 2種算法吞吐量對比
本文實驗對CEBFT算法和PBFT算法在不同節點數量下的時延和吞吐量進行了對比分析,通過時延以及吞吐量的測試可以看出,CEBFT算法在性能上較PBFT有較大的提升.
采用本文提出的數據安全共享模型和CEBFT共識算法開發了睿鏈庫,由中心應用、區塊鏈和分布式加密存儲(IPFS)3大部分組成,總體架構如圖9所示:

圖9 睿鏈庫平臺架構
睿鏈庫于2019年3月上線,至今已經接入風電、火電、水電等5個集團公司、11個省市的20多家電廠,接入裝機量850萬kW,協同備件金額9 933萬元,協同交易量377萬元,時延、吞吐量等性能指標完全滿足應用要求,形成了發電企業多業務生態.
本文對供應鏈數據共享過程中的數據安全問題進行了研究和分析,提出了一種基于區塊鏈的供應鏈數據安全共享模型,針對聯盟鏈中PBFT算法共識效率低、不支持動態管理節點、無法直接應用到供應鏈數據共享場景中等問題,引入了簡化的一致性協議和信用機制,根據信譽值投票選舉高可靠性的節點參與共識,降低了節點間的通信復雜度.另外,通過管理節點實現動態增加新節點以及動態退出共識網絡.最后通過實驗對CEBFT算法進行了分析,證實CEBFT算法在通信復雜度、吞吐量以及時延等方面都有較大的提升.