拜占庭將軍問題(三)——書面協議
在上篇文章中,對口頭訊息演算法OM(m)進行了闡述,OM(m)演算法能夠處理在大於3m個將軍中至多存在m個叛徒的拜占庭將軍問題。Leslie的論文1中,對將軍之間傳送不可篡改的簽名訊息的情況進行分析,闡述書面協議演算法SM(m)。
假設
為了限制叛徒傳送的訊息,從而使拜占庭將軍問題更加簡單。一種方法是讓每位將軍傳送不可偽造的簽名訊息。更準確的來說,在假設A1-A3的基礎上新增如下假設:
A4 (a) 忠誠將軍的簽名不能被偽造,並且任何針對他簽名訊息的篡改都能被檢測到;
(b) 任何將軍都可以驗證將軍簽名的真實性
注意,我們並沒有對叛徒的簽名進行限制,也就是說一個叛徒的簽名可以被其他叛徒偽造,進而叛徒可以進行串謀作惡。
引入了簽名訊息之後,三將軍問題也就不在成立了。現在給出一個演算法,在任意數量將軍中有m個叛徒的情況。
SM(m) 演算法
在演算法中,司令官傳送一個簽名的命令給他的每個副官。然後,每個副官新增他的簽名到命令上,併發送給其他副官,收到命令的副官再新增他的簽名傳送給其他副官……
演算法還假定了一個choice函式,作用在一個命令的集合上來獲得一個單獨的命令。choice函式需要滿足:
- 如果命令集合只包含一個元素,那麼.
- 如果命令集是,那麼.
例如,choince函式可以是取有序集合的中位數。
在下面的演算法中,令指由將軍簽名的命令值,指命令指由將軍簽名後再由將軍簽名。令將軍為司令官,每個副官維護一個命令集,包含他收到的被正確簽名的命令值。(如果司令官是忠誠的,這個值集的元素不會超過一個)。
Algorithm SM(m)
初始化
(1) 司令官簽名併發送他的命令給每個副官;
(2) 對於每個:(A) 如果副官從司令官接收到一個形式的訊息,並且他還沒有接收到過任何命令,那麼:
(i) 令;
(ii) 傳送給每個其他的副官。(B) 如果副官接收到形如的訊息,且不在中,那麼:
(i) 他將新增到中;
(ii) 如果,那麼他傳送訊息給不同於的每個副官。(3) 對於每個副官: 當副官不再接收到訊息,他將遵從行動。
注意,在第二步中,副官將忽略任意值已經在出現的訊息。通過對的歸納,對於每個副官序列, 且,每個副官至多收到一條訊息。在第(3)步中可以使用超時來判斷沒有訊息再回到來。
舉例: m=1, n=3
下圖描述了當將軍是叛徒時,傳送訊息的情況:
在第(1)步,司令傳送傳送“attack”給副官1併發送“retreat”給副官2;
在第(2)步,每個副官將收到兩個命令值,即