拜占庭將軍問題(一)

一、什麼是拜占庭將軍問題

拜占庭將軍問題(Byzantine Generals Problem,是由萊斯利·蘭波特在其同名論文[1]中提出的分佈式對等網絡通信容錯問題。在分佈式計算中,不同的計算機通過通訊交換信息達成共識而按照同一套協作策略行動。但有時候,系統中的成員計算機可能出錯而發送錯誤的信息,用於傳遞信息的通訊網絡也可能導致信息損壞,使得網絡中不同的成員關於全體協作的策略得出不同結論,從而破壞系統一致性。拜占庭將軍問題被認爲是容錯性問題中最難的問題類型之一。

萊斯利·蘭波特在其論文中描述瞭如下問題:

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

系統的問題在於,將軍中可能出現叛徒,他們不僅可能向較爲糟糕的策略投票,還可能選擇性地發送投票信息。假設有9位將軍投票,其中1名叛徒。8名忠誠的將軍中出現了4人投進攻,4人投撤離的情況。這時候叛徒可能故意給4名投進攻的將領送信表示投票進攻,而給4名投撤離的將領送信表示投撤離。這樣一來在4名投進攻的將領看來,投票結果是5人投進攻,從而發起進攻;而在4名投撤離的將軍看來則是5人投撤離。這樣各支軍隊的一致協同就遭到了破壞。

由於將軍之間需要通過信使通訊,叛變將軍可能通過僞造信件來以其他將軍的身份發送假投票。而即使在保證所有將軍忠誠的情況下,也不能排除信使被敵人截殺,甚至被敵人間諜替換等情況。因此很難通過保證人員可靠性及通訊可靠性來解決問題。

假始那些忠誠(或是沒有出錯)的將軍仍然能通過多數決定來決定他們的戰略,便稱達到了拜占庭容錯。在此,票都會有一個默認值,若消息(票)沒有被收到,則使用此默認值來投票。

上述的故事映射到計算機系統裏,將軍便成了計算機,而信差就是通信系統。雖然上述的問題涉及了電子化的決策支持與信息安全,卻沒辦法單純的用密碼學與數字簽名來解決。因爲不正常的電壓仍可能影響整個加密過程,這不是密碼學與數字簽名算法在解決的問題。因此計算機就有可能將錯誤的結果提交去,亦可能導致錯誤的決策。在分佈式對等網絡中需要按照共同一致策略協作的成員計算機即爲問題中的將軍,而各成員計算機賴以進行通訊的網絡鏈路即爲信使。拜占庭將軍問題描述的就是某些成員計算機或網絡鏈路出現錯誤、甚至被蓄意破壞者控制的情況。

二、拜占庭將軍問題解決方案

1. 問題分析

如何讓忠誠的將軍們能達成行動的一致。

對於拜占庭問題來說,假如節點總數爲 N,叛變將軍數爲 F,則當N>=3F+1時,問題纔有解,即 Byzantine Fault Tolerant (BFT) 算法。

例如,N=3,F=1 時。

提案人不是叛變者,提案人發送一個提案出來,叛變者可以宣稱收到的是相反的命令。則對於第三個人(忠誠者)收到兩個相反的消息,無法判斷誰是叛變者,則系統無法達到一致。

提案人是叛變者,發送兩個相反的提案分別給另外兩人,另外兩人都收到兩個相反的消息,無法判斷究竟誰是叛變者,則系統無法達到一致。

更一般的,當提案人不是叛變者,提案人提出提案信息 ,則對於合作者來看,系統中會有 N-F 份確定的信息1,和 F 份不確定的信息(可能爲1或0,假設叛變者會盡量干擾一致的達成),N-F > F,即 N > 2F 情況下才能達成一致。

當提案人是叛變者,會盡量發送相反的提案給 N-F 個合作者,從收到1的合作者看來,系統中會存在 \(\frac{N-F}{2}\) 個信息1,以及\(\frac{N-F}{2}\)個信息0;從收到0的合作者看來,系統中會存在\(\frac{N-F}{2}\)個信息0,以及 \(\frac{N-F}{2}\)個信息1;

另外存在 F-1 個不確定的信息。合作者要想達成一致,必須進一步的對所獲得的消息進行判定,詢問其他人某個被懷疑對象的消息值,並通過取多數來作爲被懷疑者的信息值。這個過程可以進一步遞歸下去。

Leslie Lamport 證明,當叛變者不超過 1/3 時,存在有效的算法,不論叛變者如何折騰,忠誠的將軍們總能達成一致的結果。如果叛變者過多,則無法保證一定能達到一致性。

多於 1/3 的叛變者時有沒有可能有解決方案呢?設想f個叛變者和g個忠誠者,叛變者故意使壞,可以給出錯誤的結果,也可以不響應。某個時候f個叛變者都不響應,則g個忠誠者取多數既能得到正確結果。當f個叛變者都給出一個惡意的提案,並且g個忠誠者中有f個離線時,剩下的 g-f 個忠誠者此時無法分別是否混入了叛變者,仍然要確保取多數能得到正確結果,因此,g-f > f,即 g > 2f,所以系統整體規模要大於3f。

能確保達成一致的拜占庭系統節點數至少爲 4,允許出現 1 個壞的節點。

2. Byzantine Fault Tolerant 算法

面向拜占庭問題的容錯算法,解決的是網絡通信可靠,但節點可能故障情況下的一致性達成。

最早由 Castro 和 Liskov 在 1999 年提出的 Practical Byzantine Fault Tolerant(PBFT)是第一個得到廣泛應用的 BFT 算法。只要系統中有 1/3 的節點是正常工作的,則可以保證一致性。

PBFT 算法包括三個階段來達成共識:Pre-Prepare、Prepare 和 Commit。

3. 新的解決思路

拜占庭問題之所以難解,在於任何時候系統中都可能存在多個提案(因爲提案成本很低),並且要完成最終的一致性確認過程十分困難,容易受干擾。但是一旦確認,即爲最終確認。

比特幣的區塊鏈網絡在設計時提出了創新的 PoW(Proof of Work) 算法思路。一個是限制一段時間內整個網絡中出現提案的個數(增加提案成本),另外一個是放寬對最終一致性確認的需求,約定好大家都確認並沿着已知最長的鏈進行拓寬。系統的最終確認是概率意義上的存在。這樣,即便有人試圖惡意破壞,也會付出很大的經濟代價(付出超過系統一半的算力)。

後來的各種共識系列算法,也都是沿着這個思路進行改進,採用經濟上的懲罰來制約破壞者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章