拜占庭容錯系統簡介
原始的拜占庭容錯系統由於需要展示理論上的可行性而缺乏實用性。另外,演算法的複雜度也是隨節點的增加而呈指數級增加。實用拜占庭容錯系統(Practical Byzantine Fault Tolerance, PBFT)降低了拜占庭協議的運行複雜度,從指數層級降低到多項式層級,使拜占庭協議在分布式系統中應用成為可能。
什麼是實用拜占庭容錯系統
實用拜占庭容錯系統是一類“狀態機器”拜占庭系統(這裡的狀態機器可以理解為“系統狀態”,以區塊鏈記賬為例,系統每新增一個區塊,賬本就更新到一個新的狀態。前面講過,拜占庭容錯系統是一個強一致性協議,每次記賬後系統都會達成新的狀態。),要求系統所有節點共同維護一個狀態,所有節點採取的行動一致。
實用拜占庭容錯系統需要運行三類基本協議:
- 一致性協議:解決如何達成共識
- 檢查點協議:類似於作業系統的還原點
- 視圖更換協議:系統的每個伺服器節點在同樣的配置資訊下工作,該配置資訊被稱為“視圖”。配置資訊由主節點確定,主節點更換,視圖也隨之變化。
我們主要關注支援系統日常啟動並執行一致性協議。
PBFT 的 一致性協議
一致性協議至少包含請求(request)、序號分配(pre-prepare)、響應(reply)三個階段。根據協議設計的不同,可能包含相互互動(prepare) 、序號確認(commit)等階段。
PBFT系統通常假設故障節點個數為m個,而整個服務節點數為3m+1個。
顯示了一個簡化的 PBFT 的協議通訊模式,其中C為用戶端,N0~N3為服務節點,N0為主節點,N3為故障節點。協議的節本過程如下:
- Request:用戶端發送請求,啟用主節點的服務作業
當主節點接收請求後,啟動三階段的協議以向各從節點廣播請求
- Pre-Prepare:主節點給請求賦值一個序號n,廣播序號分配訊息和請求訊息,並構造PRE-PREPARE訊息給各從節點
- Prepare:從節點接收PRE-PREPARE訊息,並向其他服務節點廣播PREPARE訊息
- Commit:各節點對視圖內的請求和次序進行驗證後,廣播COMMIT訊息,執行收到的用戶端的請求並給用戶端以響應
- Reply:用戶端等待來自不同節點的響應,若有m+1個響應相同,則該響應即為運算的結果
PBFT 示範
在 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 |
NA |
B |
1001 |
NA |
C |
0011 |
NA |
D |
0110 |
NA |
由此可以看出,實用拜占庭容錯系統能夠容納將近1/3的拜占庭節點。
實用拜占庭容錯系統在很多情境都有應用,在區塊鏈應用中,一般適合於對強一致性有要求的私人鏈和聯盟鏈情境。例如,在IBM主導的區塊鏈超級賬本項目中,實用拜占庭容錯系統是一個可選的共識協議。