實用拜占庭容錯
PBFT 由 Miguel Castro 與 Barbara Liskov 於 1999 年發表,是第一個快到足以運行真實服務、而非僅停留在理論的拜占庭容錯一致性協議。它假設一組固定且已知的 n = 3f + 1 個副本,以及一個部分同步的網路——訊息終會送達,但你無法精確界定何時。在這些條件下,它提供確定性最終性:一旦請求被提交,便永遠無法回復,不需要機率式的等待。
每一輪都指定一個副本為主節點(領導者),協議分三個投票階段進行。在預備(pre-prepare)階段,主節點為下一個請求提出一種排序。在準備(prepare)階段,副本廣播它們接受該排序;收集到 2f + 1 個一致的準備訊息(含自己)便證明全網對順序達成共識。在提交(commit)階段,副本廣播它們已準備好最終化,2f + 1 個一致的提交訊息使該請求可執行且不可逆。這兩個全體對全體的投票階段,正是為了擊敗主節點的兩面行為,使誠實副本無法被分裂到互相衝突的決定上。
若主節點故障——沉默,或提出衝突的排序——逾時的副本會觸發視圖更換(view change),輪換到新的主節點,並把任何可能已提交的請求一併帶過去,從而在領導者更替之間維持安全性。代價在於通訊量:每個階段都是全體對全體,因此訊息複雜度為 O(n 平方),這也是傳統 PBFT 適用於數十到一兩百個節點、卻不適用於數千節點開放網路的原因。Tendermint 與 HotStuff 等現代區塊鏈 BFT 引擎,正是 PBFT 的直系後裔,削減了此開銷並加入以權益為基礎的成員資格。
phase 1 PRE-PREPARE : primary → all (order request m as seq n) phase 2 PREPARE : all → all (collect 2f+1 prepares ⇒ order agreed) phase 3 COMMIT : all → all (collect 2f+1 commits ⇒ m final, execute) # on primary timeout: VIEW-CHANGE → new primary, re-propose uncommitted
兩輪全體對全體的投票,把領導者的提案化為 3f+1 個副本之間不可逆的一致。
PBFT 的 2f+1 法定人數正是安全性的保證:在 3f+1 個副本中,任兩個大小為 2f+1 的法定人數至少在一個誠實副本上重疊,因此無法各自認證兩個互相衝突的值。