拜占庭將軍問題(二)——口頭協議
在上一篇文章中,介紹了拜占庭將軍問題的描述、條件和結論。在傳輸口頭訊息(Oral Messages)時,少於3m+1個將軍中有m個叛徒時,拜占庭將軍問題是無解的。Leslie在原文1中, 提出了一種傳輸口頭訊息時拜占庭將軍問題的一種解法。
定義
首先,為定義口頭訊息,拜占庭將軍訊息系統具有以下假設:
A1. 每個訊息被正確傳送。
A2. 訊息的接收者知道是誰傳送的訊息
A3. 可以被檢測到缺少訊息
假設A1和A2防止叛徒干擾其他兩個將軍的通訊,假設A3防止叛徒通過不發訊息干擾一致性達成。
另外,口頭協議演算法要求每個將軍可以與其他任意將軍直接進行通訊,Leslie在其原文中的第五章中描述了不需要滿足這個條件的演算法。
OM(m)演算法
Leslie針對口頭訊息(Oral Messages)的情況,提出了口頭協議演算法OM(m),其中m為非負。OM(m)演算法是一個遞迴演算法,用來處理在3m+1個將軍中至多存在m個叛徒的情況。
預設行動:副官如果在指定時間內收不到來自司令的命令,則預設採取“撤退”行動。這是為了防止司令官為叛徒時,通過不發出命令來阻礙達成共識。
行動函式:演算法假設使用majority方法作為行動函式,即當的大多數為v時,則
注:其實對於行動函式,有兩種比較容易想到的選擇:
- 的大多數值v,如果不存在大多數採取預設行動——“撤退”;
- 如果是個有序的集合,採用其中位數。
OM(m)演算法:採用遞迴定義,下面分別說明OM(0)和OM(m)的內容。
當時,
OM(0)演算法
(1) 司令傳送他的值給每個副官;
(2) 如果副官收到司令的值,使用這個值;否則,使用預設值——“撤退”。
當時,
OM(m)演算法
(1) 司令傳送他的值給每個副官;
(2) 對於每個,令為副官從司令接收到的值;如果沒有收到值,則採用預設值——“撤退”。在OM(m-1)演算法中,副官作為司令向另外n-2個副官(不包括OM(m)中的司令)傳送值。
(3) 對於每個,對於每個的,令為副官在第(2)步中從副官接收的值;如果沒有接收到值,則使用預設值——“撤退”。副官用作為其值。
舉例:m=1, n=4
- 當一個副官是叛徒時
假設副官3是叛徒,下圖針對副官2收到的訊息對OM(1)進行闡述。
第一步:司令向每個副官傳送他的值給每個副官;
第二步:副官1執行OM(0),作為司令向副官2傳送;由於副官3是叛徒,其執行OM(0)向副官2傳送了不同的值,假設為;
第三步:副官2擁有的行動值集為,採用majority函式,副官2採取的行動值為。
同理,副官1採取的行動指令也是,即滿足拜占庭將軍問題一致性條件IC1和IC2。
注:拜占庭將軍問題一致性條件為:
IC1. 所有忠誠副官遵守同一命令;
IC2. 如果司令官是忠誠的,每個忠誠的副官遵守他的命令。
- 當司令為叛徒時
下圖描述了當司令為叛徒,三位副官是忠誠的情況對OM(1)演算法進行闡述。
第一步:司令為了阻止忠誠副官達成一致,分別向三位副官傳送值;
第二步:每個副官從司令收到的值作為自己的值,並執行OM(0)向其他副官傳送;
第三步:在第三步中,每個副官擁有的值集均為,因此,副官執行行動函式majority得到的結果是一樣的。
由於三位忠誠的將軍採取同樣的行動,滿足拜占庭將軍一致性條件IC1。
從m=1, n=4的例子可以看出,OM(m)演算法能夠處理拜占庭將軍問題。在OM(m)演算法中,獨立執行了n-1次OM(m-1),且每個OM(m-1)演算法獨立執行了n-2次OM(m-2)……這就意味著,每個副官可能獨立傳送多輪訊息。為了避免混淆,需要區分每輪訊息。最易想到的方法是,每個副官在為第(2)步的值新增字首。可以看出,演算法OM(m-k)將被呼叫次,傳送擁有個副官序號字首的值。
OM(m)演算法證明
本節採用歸納法證明OM(m)演算法能夠解決拜占庭將軍問題。
引理
為了證明OM(m)演算法,我們首先來證明一條引理:
對於任意的和,如果在多於個將軍中至多存在個叛徒,則OM(m)演算法滿足條件IC2。
證明: 歸納法,針對引數進行歸納。
當時,根據假設A1和OM(0)演算法,易得如果司令是忠誠的,忠誠的將軍按照司令的指令行動,引理是成立的。
當時,假設在