拜占庭將軍問題與PBFT算法和POW共識

1 拜占庭將軍問題

Leslie Lamport(萊斯利·蘭波特)在論文《The Byzantine Generals Problem》提出拜占庭將軍問題:

一組拜占庭將軍分別各率領一支軍隊共同圍困一座城市。爲了簡化問題,將各支軍隊的行動策略限定爲進攻或撤離兩種。因爲部分軍隊進攻部分軍隊撤離可能會造成災難性後果,因此各位將軍必須通過投票來達成一致策略,即所有軍隊一起進攻或所有軍隊一起撤離。因爲各位將軍分處城市不同方向,他們只能通過信使互相聯繫。在投票過程中每位將軍都將自己投票給進攻還是撤退的信息通過信使分別通知其他所有將軍,這樣一來每位將軍根據自己的投票和其他所有將軍送來的信息就可以知道共同的投票結果而決定行動策略。

出現的問題:

  1. 假如有5支部隊,低於3支部隊則無法攻打下來反而會被反攻,有2支部隊選擇進攻,2支選擇撤退,這時候出現一個叛徒,對其中2支選擇進攻的部隊送信說要進攻,選擇進攻的部隊一看有3支部隊選進攻則進攻;叛徒對2支選擇撤退的部隊送信說要撤退,選擇撤退的部隊一看有3支部隊選撤退則撤退了,最終3支部隊攻城失敗,整個部隊失敗。一致性遭到破壞。
  2. 也可能送信的過程中,送信人被敵人截殺,部隊一直不能收到所有其他部隊傳遞過來的消息。

2 分佈式計算機系統

以上問題放到計算機系統中,各支部隊便是計算機,信差便是通信系統。

3 PBFT(Practical Byzantine Fault Tolerance)實用拜占庭容錯

PBFT算法的核心理論是N>=3F+1,其中N是總節點數,F是故障節點(故障包括叛徒或不響應)。假如有F個故障節點,至少有3F+1個節點才能保證整個系統正確運行。

算法要求至少要4個參與者ABCD,1個爲總司令,3個師長

沒有叛徒:

  1. 4個將軍分別爲ABCD,選舉A爲總司令,總統(終端用戶)向A說進攻
  2. A對BCD說進攻
  3. BCD都各自對其他節點說進攻
  4. 每個節點都收到其他人說進攻的指令,則進攻

假如出現1個叛徒D:

  1. A對BCD說進攻
  2. D對BC說撤退
  3. 對B而言,A和C說進攻(2票)大於D說撤退(1票),進攻

假如出現2個叛徒CD:

  1. A對BCD說進攻
  2. CD對B說撤退,撤退
  3. A又進攻,一致性失敗

所以當有4個節點時,只能容許1個節點出問題,該問題可能是叛徒(僞造消息)或者沒有消息(無響應)

實際上PBFT會更復雜一些,分爲預準備(pre-prepare)、準備(prepare)和確認(commit)

 

 

  1. request:總統Z向A發消息
  2. pre-prepare:服務端A收到Z的請求後進行廣播,擴散至ABC
  3. prepare:BCD,收到後記錄並再次廣播,B->ACD,C->ABD,D因爲宕機無法廣播
  4. commit:ABCD節點在Prepare階段,若收到2F(F爲可容忍錯誤個數)個或以上和自己相同的請求,則進入Commit階段,廣播Commit請求
  5. reply:ABCD節點在Commit階段,若收到2F+1個的相同請求,則對Z進行反饋

加入出現1個僞裝節點D,對於B號節點來說,有A、C號節點和自己相同,大於等於2F個即2個,則進入commit階段,並告知其他節點;同理對於A號節點和C號節點也會進入commit階段。最終有ABC三個節點進入commit階段,3個請求滿足2F+1個即3個,它們會對Z進行反饋。

  • 爲什麼是3F+1

容錯,就是不需要等待的數量,當有4個節點,只需要有3個節點反饋數據就立即決策了,那麼3個有可能是一個是有僞裝的,這種情況下也能保證系統一致性(節點不能無限制的等待所有其他節點都發數據過來,他只需要等待N-F即2F+1個反饋)。

  1. 如果未接到反饋的恰好是叛徒節點,剩下的全都保持一致,沒有問題。
  2. 如果未反饋的是好節點,叛徒節點只有1票,則2個好節點>1個叛徒,系統正常。
  3. 3F+1。系統只等N-F個就做決策。極端情況下,所有的F個叛徒都先發數據,那麼剩下的必須必須是F+1個正確的節點才能保證 F+1個叛徒 > F個叛徒,那麼所有N的節點爲(F+1個收到的節點 + F個未收到節點 + F個叛徒)也就是3F+1個。

4 比特幣POW(Proof Of Word)工作量證明

比特幣通過工作量證明來解決一致性問題,通過數學的方式,讓其中一個節點成爲當前情況下的總司令,後續所有的命令都是根據該結果來進行。

舉例來到將軍問題,先假定某個數序規則Puzzle需要將軍的軍師平均花一天即24小時的時間才能解開。每次算出來的將軍可以獲得總司令給的軍械獎勵。

  1. 任何一個將軍都可以說6天后進攻或撤退,然後根據‘6天后進攻’或者‘6天后撤退’內容按照Puzzle規則進行計算。
  2. 將軍A花了23個小時率先發現‘天行健’和‘6天后進攻’符合Puzzle規則,於是他送信給其他將軍。
  3. 其他將軍收到該信息之後,下一步‘攻擊東城門’或者‘攻擊西城門’,根據‘6天后進攻&天行健&A#攻擊東城門’或‘6天后進攻&天行健&A#攻擊西城門’作爲內容按照Puzzle規則進行計算。
  4. 將軍B花了25個小時率先發現‘天圓地方’和‘6天后進攻&天行健&A#攻擊東城門’符合Puzzle規則,於是他送信給其他將軍。
  5. 其他將軍收到該信息之後,下一步‘使用雲梯’或者‘使用攻城錘’,根據‘6天后進攻&天行健&A#攻擊東城門&天圓地方&B#使用雲梯’或‘6天后進攻&天行健#攻擊東城門&天圓地方&B#使用攻城錘’作爲內容按照Puzzle規則進行計算。
  6. 一直重複以上4、5。

爲了獲得獎勵,他們一般都是誰先到這裏就根據誰的算。並且誰的指令最長最有可能被司令認可獲得獎勵軍械,這樣,所有的將軍都會在第六天進行進攻。

其中的問題:

  1. 在步驟2將軍Z也花了23個小時發現‘自強不息’和‘6天后撤退’符合Puzzle規則,也送信給其他將軍。那麼其他將軍一部分根據將軍A的結果往下算,一部分根據將軍Z的結果往下算,在第二天誰最先解開Puzzle那麼極有機會率先通知其他將軍。結果將軍B率先發現第二個Puzzle,並通知了70%的將軍的時候,這70%的將軍解開第三個Puzzle的概率遠遠大於剩下的30%的將軍解開第三個Puzzle。到第四個Puzzle的時候就可能變成90%:10%,第五個Puzzle的時候變成98%:3%,第六個Puzzle的時候變成99.99%:0.01%。這樣差不多所有將軍都會進行進攻。(即爲比特幣的6次確認可以判定交易真實)
  2. 也可能將軍Z勝出,只不過上面的比例反過來,那麼內容變成‘6天后撤退&人之初&Z#向東撤退5公里&趙錢孫&Y#紮營做飯&弟子規&X’等。但是並不影響第6天他們集體進攻還是撤退。

5 總結

  1. PBFT算法要求知道節點數是確定的,比如22個節點,那麼F可以爲7,有15個節點的數據即可做決定,適合聯盟鏈
  2. POW共識不限定節點數,不是實時結算的,一般而言6次確認之後基本上沒有問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章