實用的拜占庭容錯系統

chunlin192發表於2018-08-26

原始的拜占庭容錯系統由於需要展示其理論上的可行性而缺乏實用性。另外,還需要額外的時鐘同步機制支援,演算法的複雜度也是隨節點增加而指數級增加。實用拜占庭容錯系統(Practical Byzantine Fault Tolerance,PBFT),降低了拜占庭協議的執行復雜度,從指數級別降低到多項式級別(Polynomial),使拜占庭協議在分散式系統中應用成為可能(檢視什麼是拜占庭將軍問題)。 PBFT是一類狀態機拜占庭系統,要求共同維護一個狀態,所有節點採取的行動一致。為此,需要執行三類基本協議,包括一致性協議、檢查點協議和檢視更換協議。我們主要關注支援系統日常執行的一致性協議。 一致性協議要求來自客戶端的請求在每個服務節點上都按照一個確定的順序執行。這個協議把伺服器節點分為兩類:主節點和從節點,其中主節點僅一個。在協議中,主節點負責將客戶端的請求排序;從節點按照主節點提供的順序執行請求。每個伺服器節點在同樣的配置資訊下工作,該配置資訊被稱為檢視,主節點更換,檢視也隨之變化。 一致性協議至少包含若干個階段:請求(request)、序號分配(pre-prepare)和響應(reply)。根據協議設計的不同,可能包含相互互動(prepare),序號確認(commit)等階段。 PBFT系統通常假設故障節點數為m個,而整個服務節點數為3m+1個。每一個客戶端的請求需要經過5個階段,通過採用兩次兩兩互動的方式在伺服器達成一致之後再執行客戶端的請求。由於客戶端不能從伺服器端獲得任何伺服器執行狀態的資訊,PBFT中主節點是否發生錯誤只能由伺服器監測。如果伺服器在一段時間內都不能完成客戶端的請求,則會觸發檢視更換協議。 一個簡化的PBFT的協議通訊模式,其中C為客戶端,N0 ~N3 表示服務節點,特別的,N0 為主節點,N3 為故障節點。整個協議的基本過程如下。 1)客戶端傳送請求,啟用主節點的服務操作。 2)當主節點接收請求後,啟動三階段的協議以向各從節點廣播請求。 3)客戶端等待來自不同節點的響應,若有m+1個響應相同,則該響應即為運算的結果。 PBFT在很多場景都有應用,在區塊鏈場景中,一般適合於對強一致性有要求的私有鏈和聯盟鏈場景。例如,在IBM主導的區塊鏈超級賬本專案中,PBFT是一個可選的共識協議。 除了PBFT之外,超級賬本專案還引入了基於PBFT的自用共識協議,它的目的是希望在PBFT基礎之上能夠對節點的輸出也做好共識,這是因為,超級賬本專案的一個重要功能是提供區塊鏈之上的智慧合約,即在區塊鏈上執行的一段程式碼,因此它會導致區塊鏈賬本上最終狀態的不確定,為此這個自有共識協議會在PBFT實現的基礎之上,引入程式碼執行結果簽名進行驗證。

相關文章