1. 程式人生 > >拜占庭將軍問題(三)——書面協議

拜占庭將軍問題(三)——書面協議

在上篇文章中,對口頭訊息演算法OM(m)進行了闡述,OM(m)演算法能夠處理在大於3m個將軍中至多存在m個叛徒的拜占庭將軍問題。Leslie的論文1中,對將軍之間傳送不可篡改的簽名訊息的情況進行分析,闡述書面協議演算法SM(m)

拜占庭將軍問題

假設

為了限制叛徒傳送的訊息,從而使拜占庭將軍問題更加簡單。一種方法是讓每位將軍傳送不可偽造的簽名訊息。更準確的來說,在假設A1-A3的基礎上新增如下假設:

A4 (a) 忠誠將軍的簽名不能被偽造,並且任何針對他簽名訊息的篡改都能被檢測到;
(b) 任何將軍都可以驗證將軍簽名的真實性

注意,我們並沒有對叛徒的簽名進行限制,也就是說一個叛徒的簽名可以被其他叛徒偽造,進而叛徒可以進行串謀作惡。

引入了簽名訊息之後,三將軍問題也就不在成立了。現在給出一個演算法,在任意數量將軍中有m個叛徒的情況。

SM(m) 演算法

在演算法中,司令官傳送一個簽名的命令給他的每個副官。然後,每個副官新增他的簽名到命令上,併發送給其他副官,收到命令的副官再新增他的簽名傳送給其他副官……

演算法還假定了一個choice函式,作用在一個命令的集合上來獲得一個單獨的命令。choice函式需要滿足:

  1. 如果命令集合V只包含一個元素v,那麼choince(V)=v.
  2. 如果命令集是,那麼choince()=RETREA
    T
    .

例如,choince函式可以是取有序集合V的中位數。

在下面的演算法中,令x:i指由將軍i簽名的命令值xv:j:i指命令指v由將軍j簽名後再由將軍i簽名。令將軍0為司令官,每個副官i維護一個命令集Vi,包含他收到的被正確簽名的命令值。(如果司令官是忠誠的,這個值集的元素不會超過一個)。

Algorithm SM(m)

初始化 Vi=

(1) 司令官簽名併發送他的命令給每個副官;
(2) 對於每個i:

(A) 如果副官i從司令官接收到一個v:0形式的訊息,並且他還沒有接收到過任何命令,那麼:

(i) 令Vi={v};
(ii) 傳送v:0:i給每個其他的副官。

(B) 如果副官i接收到形如v:0:j1:...:jk的訊息,且v不在Vi中,那麼:

(i) 他將v新增到Vi中;
(ii) 如果k<m,那麼他傳送訊息v:0:j1:...:jk:i給不同於j1:...:jk的每個副官。

(3) 對於每個副官i: 當副官i不再接收到訊息,他將遵從choice(Vi)行動。

注意,在第二步中,副官i將忽略任意值已經在Vi出現的訊息。通過對k的歸納,對於每個副官序列j1,...,jk, 且k<m,每個副官至多收到一條v:0:j1:...:jk訊息。在第(3)步中可以使用超時來判斷沒有訊息再回到來。

舉例: m=1, n=3

下圖描述了當將軍是叛徒時,傳送訊息的情況:

在第(1)步,司令傳送傳送“attack”給副官1併發送“retreat”給副官2;
在第(2)步,每個副官將收到兩個命令值,即V1=<