安 洋,李 坤,李軍懷,王懷軍
(西安理工大學 計算機科學與工程學院,西安 710048)
食品事關國運民生,食品安全是國家安全的重要基礎,與公眾健康、生活水平、經濟發展乃至社會穩定息息相關[1].果品作為常見食品受眾面很廣,其質量安全溯源受到廣泛關注.果品質量溯源是將果品從果園培育到銷售的完整產業鏈中產生的所有數據進行管理以實現監管,這需要整個供應鏈中的參與者共同實現[2].然而,現有的主流果品質量溯源系統的溯源數據都是集中化控制管理的,數據信息存儲在中央數據庫,因此追溯數據極易被人刻意篡改且難以發現,追溯數據的采集比較單一,數據是否完整也無法被驗證[3].集中式管理數據的溯源系統并不能保證查詢數據的真實性,不能完全滿足果品溯源數據安全完整的需求.
區塊鏈去中心化等特點滿足果品質量溯源系統的需求[4].在供應流程中產生的果園基地的環境數據、施肥、防蟲、除害、加工、銷售、物流等溯源數據都可以通過物聯網設備或人工錄入的方式進行信息上鏈,一旦數據上鏈便不能修改.區塊鏈上的所有數據都需要信息背書,這樣可以有效減少人為錯誤,供應鏈上的企業能夠共同維護數據,消費者只需通過溯源碼進行鏈上數據查詢即可獲得果品溯源數據,因此可以很大程度上解決消費者對數據的不信任問題.
在基于區塊鏈的果品質量溯源系統中,所有環節產生的數據都在一個去中心化、不可偽造和不可篡改的安全環境中進行流通,共識機制是保證這些特征的區塊鏈底層技術之一[5].由于果品質量溯源系統應用于供應鏈當中,每天的交易和賬戶數據更新較為頻繁,系統需要良好的吞吐量以及低交易時延.雖然區塊鏈去中心化等特點適用于供應鏈,但共識算法存在吞吐量低、時延高、節點數不能動態變化等問題,影響了基于區塊鏈的果品質量溯源系統的整體性能.
鑒于上述原因,研究實現一種可以良好的對抗拜占庭將軍問題[6]且可以滿足高吞吐量和低延時的區塊鏈共識機制成為本文的研究重點.
追溯體系的構建需要依托溯源技術.目前,國內外的追溯技術主要是通過二維碼、RFID 技術、NFC 技術和生物DNA 等技術手段對產品標記和記錄,實現信息存儲,通過互聯網軟件系統或手持設備等手段查詢信息真偽.傳統溯源技術雖然發展比較成熟[7–9],但其存在溯源數據采集單一、易被篡改、數據完整性無法驗證等問題.區塊鏈技術的去中心化、可追溯性及不可篡改等特性能夠很好的解決傳統溯源技術存在的問題,基于區塊鏈的溯源方法成為國內外眾多學者的研究熱點[10–12].
區塊鏈的核心技術包括共識機制、分布式存儲技術、密碼學和智能合約[13].其中,共識機制主要解決分布式系統的一致性問題,保證所有節點維護的數據副本的一致性.共識算法已經有了非常豐富的實例,從區塊鏈應用衍生出來的共識算法有PoW、PoS、DPoS等;從傳統一致性算法衍生出來的共識算法有Paxos、Raft、PBFT 等.6 種共識機制具體對比結果如表1所示.通過對區塊鏈中幾種常見的共識機制對比分析,結合果品質量溯源系統的應用需求可得出:PoW和PoS雖然擁有非常良好的拜占庭容錯性但吞吐量與交易時延并不能滿足該系統的性能要求,且其資源消耗普通企業無法承擔.Raft、Paxos和Kafka 雖然都擁有良好的吞吐量、交易時延和低消耗,但均不具備拜占庭容錯能力,并不滿足果品質量溯源系統對安全性的要求.PBFT 雖然在吞吐量、交易時延和消耗都不是最優,但是其具備抗拜占庭能力,基本滿足果品質量溯源系統的需求,因此本文選擇PBFT 共識算法作為基礎,結合果品質量溯源系統的應用場景展開研究工作.

表1 6 種共識機制多指標對比
針對共識機制低吞吐、高時延和主節點隨機選擇的問題,文獻[14]提出使用投票選舉主節點的方式提高共識效率,文獻[15]通過簡化一致性協議提高共識效率,文獻[16]提出分組概念將節點分為共識節點與記賬節點,但這些方法假設所有節點都是誠實節點并未考慮拜占庭問題,且根據時間戳進行垃圾回收并不滿足果品質量溯源系統需求.本文引入積分機制[17],對抗拜占庭節點,對一致性協議步驟進行優化,通過積分來執行垃圾回收機制,以提高吞吐量、降低通信開銷,從而提高共識效率.
PBFT 共識算法的核心流程,如圖1所示,算法的核心階段分別是預準備階段(pre-prepare)、準備階段(prepare)和提交階段(commit).圖中的C 代表客戶端,N0,N1,N2,N3代表節點的編號,N3代表可能故障的節點或者是作惡節點,N0是主節點.整個過程如圖1,其中,f代表故障節點數量.
(1)從所有參與共識的節點中隨機選擇一個節點作為主節點,主節點的主要工作是負責接收客戶端信息、廣播信息以及生成新的區塊;
(2)預準備階段:主節點將從客戶端接收到的交易請求進行校驗,校驗通過后,加上自己的簽名通過對等網絡廣播至所有參與共識的從節點,并且將該交易保存在日志文件中;
(3)準備階段:所有從節點收到消息之后,首先對消息進行校驗,包括主節點簽名等,校驗通過后,將該交易保存在日志文件并向全網廣播一條準備消息;
(4)確認階段:節點對收到的準備消息進行統計,若收到2f條通過校驗且和自己信息一致的消息,就廣播一條確認消息;
(5)回復階段:節點對收到的確認消息進行統計,若收到2f+1 條確認消息,就將新區塊更新到本地賬本,并向客戶端發送消息;
(6)客戶端若收到f+1 條相同消息,共識結束.
通過對PBFT 算法共識過程的分析可以得出,PBFT 共識算法存在以下問題:1)在執行完整的一致性協議時節點間需要進行大量的通信,其時間復雜度為O(N2);2)主節點是隨機選擇的,增大了選擇異常節點的概率,從而導致視圖轉換協議調用次數增多;3)垃圾回收機制中需要確保至少f+1 個節點已經執行了待回收的舊消息,從而額外增加了節點間的通信開銷.
針對傳統PBFT 共識算法存在的問題,本文提出了一種基于積分選擇的改進PBFT 共識算法.該算法通過積分選擇,從一致性協議、視圖轉換協議、垃圾回收機制幾方面進行了優化,提高了共識算法的效率.系統中節點的積分是每個參與共識的節點在進行共識過程中根據共識行為進行相應加減.在成功執行一次一致性協議之后,對所有達成共識的節點(除主節點),將積分加5;對于未達成共識的節點,將積分減5;主節點成功完成一次區塊生成,積分加1.積分選擇協議如表2所示,根據積分賦予節點不同角色.

表2 積分選擇協議
主節點的選取依據積分選擇協議,積分越高的節點其安全性越高且更穩定不易壞,增大主節點選擇的安全性,從而降低了視圖轉化協議執行的概率,提高共識效率.通過不斷的執行共識機制,成功達成共識的節點將不斷積累積分,認為積分高的共識節點其安全性更高.
本文參考文獻[14–17]對共識算法的改進思路,進一步明確節點分組邊界.具體來說,首先將所有節點的積分從小到大進行排序,認為[(n?1)/2,n?1]范圍內的節點可信度高,作為共識節點,共識節點至少為4 個,其余節點作為記賬節點.主節點從 [3(n?1)/4,n?1]范圍內隨機選擇,算法整體流程如圖2所示.
具體步驟如下:
(1)首先將區塊鏈所有節點根據積分選擇協議的積分選擇依據進行分組,分為共識節點和記賬節點;
(2)客戶端在共識節點中根據積分區間選擇主節點N1,主節點的主要工作是負責接收客戶端信息、廣播信息以及生成新的區塊;
(3)主節點將從客戶端接收到的交易請求進行校驗,校驗通過之后,加上自己的簽名通過對等網絡廣播至所有參與共識的從節點,并且將該交易保存在日志文件中;
(4)從節點收到消息,并對消息通過簽名字段進行認證,如果認可這條消息,則將同樣的消息加上簽名發送給主節點,并保留消息內容等待二次確認;
(5)如果主節點收到的認可信息且消息內容沒有更改的數量大于等于2f,則將認可信息打包再發給所有節點,共識節點將收到的消息進行二次確認檢查信息是否正確,通過驗證后進入commit 狀態,將新區塊更新到本地賬本,并向客戶端發送消息,記賬節點接收消息更新本地賬本;
(6)如果客戶端收到f+1 條消息認為達成共識,共識結束.
算法在執行過程中,本文針對共識節點內拜占庭節點大于承載能力兩種情況,分別給出解決方法:1)若3 階段內任意階段條件為滿足,認為共識節點中存在大于f個拜占庭節點,則算法執行完整的一致性協議來解決拜占庭問題;2)若節點請求超時,認為主節點為惡意節點,則算法執行視圖轉換協議來解決主節點作惡問題.
每次執行一致性協議都會對節點積分產生影響,當積分值積累到一定程度后執行垃圾回收機制更新并重置節點積分值.優化的一致性協議通過簡化信息交互過程,降低了在共識過程中的通信開銷,并且由于引入積分機制使良好節點當選主節點的概率增高,降低使用視圖轉換協議的概率,提高了整體的效率.
PBFT 共識算法中視圖轉換協議的主要目的是當判定主節點為錯誤節點時更換主節點,具體過程如圖3所示.
從節點需要在view-change 階段相互通訊來確定主節點為惡意節點,然后在view-change-ack 階段隨機選擇新的節點成為主節點,并舍棄未完成的交易.通過積分機制,在view-change-ack 階段根據當前節點積分選擇新的主節點,可以有效降低使用視圖轉換協議的概率,達到提高共識效率的目的.
PBFT 通過3 階段協議來對請求達成共識,但各個階段產生的消息如果不進行垃圾回收的話,系統的存儲空間將會不堪重負.為此,PBFT 算法設計了垃圾回收機制來清除本地緩存.根據前面的3 階段協議,客戶端收到某個請求的執行結果的時候,表明該請求已經被至少f+1 個節點提交過,這個時候需要刪除該消息.垃圾回收機制是通過額外的通訊來提供證明,證明節點狀態正確.如果每執行結束一次一致性協議都需要生成上述證明,那么整個網絡將會消耗大量資源.
在PBFT 垃圾回收機制中,執行方式是周期性執行,目的是為了防止節點因為宕機、網絡或自身故障等原因而產生節點信息不一致從而導致系統故障.為了確保系統的正常運轉以及安全,節點在清除本地消息日志中舊消息時,必須確保至少存在f+1 個節點已經執行了這些舊消息,因此需要進行節點間是否同步的確認通信,這導致每次在執行垃圾回收機制時就會產生巨大的通信開銷.
改進的PBFT 算法在垃圾回收機制中實現了動態增加和退出節點的功能以及積分重新分配的功能.當執行一致性協議時存在節點積分大于等于閾值的情況時,完成一致性協議后運行垃圾回收機制,所有參與共識的節點會清除本地日志中已執行過的交易請求,達到降低網絡通訊消耗的目的.同時將系統中所有共識節點的信用全部清零,并對所有參與共識節點的積分在一定范圍內隨機賦值,提高了新加入網絡節點成為主節點的可能,從而達到了共識節點的動態增加和退出的目的.
本次實驗是應用改進PBFT 共識機制作為Fabric的自定義共識后端并通過Caliper 對區塊鏈框架中兩種不同事務在不同情況下進行測試,然后對測試結果進行分析討論.實驗環境配置如表3所示.

表3 實驗環境配置
分別進行提交請求和查詢請求的測試,觀察在兩種請求下系統資源占用情況與區塊鏈性能情況.表4、表5分別為在交易數量為100 時提交請求和查詢請求的內存和CPU 占用率.
由表4和表5中的信息可以看出peer1 節點的內存、CPU 等系統資源使用情況都是0,表明該節點在運行過程中并沒有對系統提交的交易做出響應,即該節點屬于錯誤節點.然而可以看出,當系統發出提交事務請求的時候,系統依舊完成了共識過程,并沒有因為某些失效節點或惡意節點造成區塊鏈系統癱瘓.因此基于積分選擇的改進PBFT 共識算法可以抵抗拜占庭錯誤,安全性高.

表4 提交請求時資源占用率

表5 查詢請求時資源占用率
表6、表7表示在提交請求下不斷增加交易數量以及查詢請求下不斷增加發送請求,得出不同情況下系統處理返回數據的TPS 以及請求時延情況(實驗數據為10 次請求的平均值).

表6 不同事務下PBFT的TPS 以及時延

表7 不同事務下本文方法的TPS 以及時延
首先分析吞吐量情況,PBFT 共識機制與本文方法提交事務與查詢事務吞吐量對比情況如圖4、圖5所示.
結果表明,在提交事務中隨著交易數量的增加吞吐量逐漸增大并趨向飽和,可以看出當交易數量達到一定程度之后吞吐量將維持在一個平穩的水平.通過優化一致性協議、視圖轉換協議以及垃圾回收機制,對比發送請求平均吞吐量從604 TPS 提升到了756 TPS提升了25%而響應處理請求的平均吞吐量從121 TPS提升到了137 TPS 提升了13%.在查詢事務中設置交易數量為5 000 在不同的請求發送速率下可得,系統響應平均吞吐量從298 TPS 提升到了350 TPS 提升了17%.
接下來分析交易請求的時延情況,傳統PBFT 共識機制與本文方法提交事務與查詢事務的時延對比情況,如圖6、圖7所示.
結果表明,在進行提交事務與查詢事務時,系統的最大時延、平均時延都隨著交易數量的增加而增加,提交事務的平均時延從3.36 s 下降到2.56 s,查詢事務的平均時延從4.96 s 下降到4.66 s,有效的提升了果品質量溯源用戶的系統使用體驗.
針對基于區塊鏈的果品質量溯源系統中存在的共識算法性能低下問題,本文對PBFT 算法進行分析并引入積分選擇協議,優化了一致性協議、視圖轉換協議以及垃圾回收機制.在保證算法容錯性的同時,降低了共識過程中的傳輸消耗,提高了吞吐量,縮短了共識達成時間.在運行垃圾回收機制時給所有節點重新分配積分,達到了動態更改節點的目的.最后,通過實驗證明了基于積分選擇的改進PBFT 共識機制的有效性.