1. 程式人生 > >拜占庭將軍問題(一)—— 引言與結論

拜占庭將軍問題(一)—— 引言與結論

拜占庭將軍問題(The Byzantine Generals Problem)是Leslie Lamport在其同名的論文1提出的一種針對分散式對等網路中的容錯問題。

一個可靠的計算機系統需要能夠處理一個或多個系統元件的失效。一個失效的元件可能會表現為傳送錯誤的資訊,或者因元件故障不發出資訊等行為。這種型別的失效問題被稱為拜占庭將軍問題。Leslie在這篇論文中對拜占庭將軍問題進行了描述並提出解決拜占庭問題的一些方法。

拜占庭將軍問題

問題描述

Leslie通過幾支拜占庭將軍領導的軍隊共同進攻敵方城池的例子描述了這個問題。

假如幾支拜占庭將軍領導的軍隊駐紮在敵方城池周圍,準備攻城。將軍們之間只能通過通訊的方式相互溝通。在觀察敵情之後,他們需要共同確定行動。但是,其中一些將軍可能是叛徒,他們會試圖阻止忠誠將軍之間達成一致行動。因此,拜占庭將軍們需要一種演算法來保證:

A. 所有忠誠的將軍能採取同樣的行動

忠誠的將軍會按照演算法行動,但叛徒會採取任何行動。因此,演算法需要保證無論叛徒幹什麼,條件A都會被滿足。

B. 一小部分的叛徒不會導致忠誠的將軍採取錯誤的行動

條件B是很難形式化的,因為它需要對錯誤的行動進行準確的描述。因此,Leslie用將軍如何作出決定來代替。

“將軍-將軍”問題 or “司令-副官”問題

令:

n: 將軍的數量
v(i): 由第i將軍發出的訊息

每位將軍採用某種函式從(v(1), …, v(n))作出決定。例如,採用Majority投票方法,選取(v(1), …, v(n))多數的行動作為最優的行動。在這種情況下,只有忠誠將軍不同行動的數量大致相等,小部分叛徒才能影響忠誠將軍的行動。

拜占庭將軍之間要想達成一致,最明顯的辦法是第i號將軍通過傳令兵向其他每個將軍發出v(i),但是,由於叛徒可能向不同的將軍發出不同的值。如果想要滿足條件A,需要滿足如下條件:

條件1:每個忠誠的將軍必須獲得相同的行動指令集合(v(1), …, v(n))

如果第i號將軍是叛徒,並向不同的將軍傳送不同的行動指令,所以條件1也暗含一個將軍不一定是從第i號將軍直接獲取v(i)。這就意味著,如果要滿足條件1,需要考慮一個將軍使用不是i號將軍發出的v(i)作為i號將軍的行動指令,即使第i號將軍是忠誠的,這與條件B是相矛盾的。例如,不能讓一部分叛徒影響忠誠將軍基於(“撤退”, …, “撤退”)作出決定,即使每個忠誠將軍發出的都是“進攻”。因此,還需要滿足下面的條件:

條件2:如果第i號將軍是忠誠的,那麼每個忠誠將軍必須用第i號將軍發出的行動指令作為v(i)

接下來,針對每個i,對條件1進行重寫:

條件 1:任意兩個忠誠的將軍使用相同的v(i)

條件1條件2都是針對第i號將軍發出的行動指令的條件。因此,可以將拜占庭將軍問題歸結為一個將軍如何傳送他的值給其他人,即一個司令官傳送命令給他的副官問題,如下:

拜占庭將軍問題: 一個司令官傳送命令給他的n-1個副官,需滿足條件:

IC1. 所有忠誠副官遵守同一命令;
IC2. 如果司令官是忠誠的,每個忠誠的副官遵守他的命令。

條件IC1IC2被稱為互動一致性條件(interactive consistency conditions)。為了解決原來的問題,第i號將軍作為將軍,採用拜占庭將軍問題的解決方法,傳送他的行動指令v(i),其他將軍作為副官進行行動。

不可能的結果

拜占庭將軍問題看起來是簡單的,但如果在每個將軍只傳輸口頭訊息(oral messages)的情況下,只有忠誠的將軍數量多於2/3,拜占庭將軍問題才有解。口頭訊息指的是發出的訊息完全由傳送者控制,這就意味著叛徒可以傳送任意訊息。還有一種是將軍之間傳輸簽名的書面訊息,在這種情況下,結論又是不一樣的。

例證

首先,Leslie論述了在傳輸口頭訊息的情況下,三個將軍中有一個是叛徒時,拜占庭將軍問題是無解的。為了簡化論述,將軍可做的行動只有“進攻”和“撤退”兩種。下面分兩種情況進行討論:

  • 假如司令是忠誠的

令副官1是忠誠的,副官2是叛徒,如Fig 1。假如司令發出的是“進攻”命令,副官2會向副官1傳送錯誤資訊——“我收到的是撤退”。由於副官1是忠誠的,如果想滿足條件IC2,副官1會執行進攻命令。

fig1

  • 假如司令是叛徒

副官1和副官2都是忠誠的,如Fig 2。司令向副官1傳送“進攻”指令,司令向副官2傳送“撤退”指令。副官2如實告訴副官1——“我收到的是撤退命令”。由於副官1分辨不出誰是叛徒,所以他判斷不出司令發給副官2的真實命令是什麼,那麼他只能遵從司令執行“進攻”。同樣地,副官2也會遵從司令執行“撤退”命令,此時就違背了條件IC1

fig2

通過上面的例子雖然可以證明在三個將軍中有一個叛徒的情況下,拜占庭將軍問題是無解的。但還需要更嚴格的形式化證明,有興趣的讀者可以參考文獻22

一般性推論

利用上面的結果,可以用反證法證明少於3m+1個將軍中有m個叛徒的情況是無解的。

思路: 假設存在一個解,使得3m或更少的將軍數量能夠處理m個叛徒,那麼用此來構建一個三將軍拜占庭將軍問題的解,這個結論在上一節中證明是不可能的。

為了避免混淆,令假設的解中的將軍為阿爾巴尼亞將軍(Albanian Generals),真實情況下的將軍還是稱為拜占庭將軍。假設3m個或更少的阿爾巴尼亞將軍能夠處理m個叛徒的情況,下面我們來構建“三”拜占庭將軍問題的解。

令“三”拜占庭將軍問題中的每個將軍模擬大約1/3數量的阿爾巴尼亞將軍的行動,即每個拜占庭將軍模擬至多m個阿爾巴尼亞將軍。也就是說,拜占庭司令官模擬阿爾巴尼亞司令官和至多m-1個阿爾巴尼亞副官,每個拜占庭副官模擬至多m個副官。

由於假設了阿爾巴尼亞將軍有解,即其滿足條件IC1IC2。根據IC1,由忠誠的拜占庭將軍模擬的阿爾巴尼亞將軍則會執行相同的行動,即“三”拜占庭將軍也滿足IC1,同理,由阿爾巴尼亞將軍滿足IC2也能推出“三”拜占庭將軍也滿足IC2,也就為“三”拜占庭將軍問題找到了一個解,這與上一節“三”拜占庭將軍問題是無解的是相矛盾的。因此,假設不成立,即少於3m+1個將軍中有m個叛徒的情況是無解的。

另外,Leslie也證明了拜占庭將軍問題的結論和將軍們達成的一致行動是不是精確的無關,此處不再論述,感興趣的讀者可以去Leslie的原著。

:在傳輸簽名書面訊息(Signed Messages)時,結論是,對於任意數量的將軍和可能的叛徒,拜占庭將軍問題都是有解的。

小結

本篇文章介紹了Leslie原著的第一、二節:

  • 拜占庭將軍問題的描述及達成一致的條件;
  • 傳輸口頭訊息時,少於3m+1個將軍中有m個叛徒是無解的。

後續的文章中,對Leslie針對口頭訊息和簽名的書面訊息兩種情況下構建的演算法進行闡述。

  1. Lamport L, Shostak R, Pease M. The Byzantine generals problem[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1982, 4(3): 382-401.
  2. Pease M, Shostak R, Lamport L. Reaching agreement in the presence of faults[J]. Journal of the ACM (JACM), 1980, 27(2): 228-234.