原始的拜占庭容錯系統因爲須要展現理論上的可行性而缺少實用性。另外,算法的複雜度也是隨節點的增長而呈指數級增長。實用拜占庭容錯系統(Practical Byzantine Fault Tolerance, PBFT)下降了拜占庭協議的運行復雜度,從指數級別下降到多項式級別,使拜占庭協議在分佈式系統中應用成爲可能。算法
實用拜占庭容錯系統是一類「狀態機」拜占庭系統(這裏的狀態機能夠理解爲「系統狀態」,以區塊鏈記帳爲例,系統每新增一個區塊,帳本就更新到一個新的狀態。前面講過,拜占庭容錯系統是一個強一致性協議,每次記帳後系統都會達成新的狀態。),要求系統全部節點共同維護一個狀態,全部節點採起的行動一致。服務器
實用拜占庭容錯系統須要運行三類基本協議:分佈式
咱們主要關注支持系統平常運行的一致性協議。區塊鏈
一致性協議至少包含請求(request)、序號分配(pre-prepare)、響應(reply)三個階段。根據協議設計的不一樣,可能包含相互交互(prepare) 、序號確認(commit)等階段。spa
PBFT系統一般假設故障節點個數爲m個,而整個服務節點數爲3m+1個。操作系統
上圖顯示了一個簡化的 PBFT 的協議通訊模式,其中C爲客戶端,N0~N3爲服務節點,N0爲主節點,N3爲故障節點。協議的節本過程以下:設計
當主節點接收請求後,啓動三階段的協議以向各從節點廣播請求rem
在 n ≥ 3m + 1 的情況下一致性是可能解決的,其中,n爲總節點數,m爲惡意節點總數。咱們模擬一下PBFT:it
n = 4, m = 0table
節點 | 獲得數據 | 最終結果 |
---|---|---|
A | 1111 | 1 |
B | 1111 | 1 |
C | 1111 | 1 |
D | 1111 | 1 |
n = 4, m = 1
節點 | 獲得數據 | 最終結果 |
---|---|---|
A | 1110 | 1 |
B | 1101 | 1 |
C | 1011 | 1 |
D | 0111 | 1 |
n = 4,m = 2
節點 | 獲得數據 | 最終結果 |
---|---|---|
A | 1100 | NA |
B | 1001 | NA |
C | 0011 | NA |
D | 0110 | NA |
由此能夠看出,實用拜占庭容錯系統可以容納將近1/3的拜占庭節點。
實用拜占庭容錯系統在不少場景都有應用,在區塊鏈應用中,通常適合於對強一致性有要求的私有鏈和聯盟鏈場景。例如,在IBM主導的區塊鏈超級帳本項目中,實用拜占庭容錯系統是一個可選的共識協議。