原始的拜占庭容錯系統因爲須要展現理論上的可行性而缺少實用性。另外,算法的複雜度也是隨節點的增長而呈指數級增長。實用拜占庭容錯系統(Practical Byzantine Fault Tolerance, PBFT
)下降了拜占庭協議的運行復雜度,從指數級別下降到多項式級別
,使拜占庭協議在分佈式系統中應用成爲可能。git
實用拜占庭容錯系統是一類「狀態機」拜占庭系統(這裏的狀態機能夠理解爲「系統狀態」,以區塊鏈記帳爲例,系統每新增一個區塊,帳本就更新到一個新的狀態。前面講過,拜占庭容錯系統是一個強一致性協議,每次記帳後系統都會達成新的狀態。),要求系統全部節點共同維護一個狀態,全部節點採起的行動一致。github
實用拜占庭容錯系統須要運行三類基本協議:算法
咱們主要關注支持系統平常運行的一致性協議。json
一致性協議至少包含請求(request)、序號分配(pre-prepare)、響應(reply)三個階段。根據協議設計的不一樣,可能包含相互交互(prepare) 、序號確認(commit)等階段。服務器
PBFT系統一般假設故障節點個數爲m個,而整個服務節點數爲3m+1個。
app
上圖顯示了一個簡化的 PBFT 的協議通訊模式,其中C爲客戶端,N0~N3爲服務節點,N0爲主節點,N3爲故障節點。協議的節本過程以下:curl
當主節點接收請求後,啓動三階段的協議以向各從節點廣播請求分佈式
在 n ≥ 3m + 1 的情況下一致性是可能解決的,其中,n爲總節點數,m爲惡意節點總數。咱們模擬一下PBFT:
n = 4, m = 0區塊鏈
節點 | 獲得數據 | 最終結果 |
---|---|---|
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 | 1 |
B | 1001 | 1 |
C | 0011 | 1 |
D | 0110 | 1 |
git clone https://github.com/bigpicturelabs/consensusPBFT.git
go build main.go
新打開 5 個終端
./main Apple ./main MS ./main Google ./main IBM curl -H "Content-Type: applicaton/json" -X POST -d '{"clientID":"ahnhwi","operation":"GetMyName","timestamp":859381532}' http://localhost:1111/req