1.背景
1.1 場景描述
拜占庭帝國想要進攻一個強大的敵人,爲此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。基於一些原因,這10支軍隊不能集合在一起單點突破,必須在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通信兵相互通信來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們能否找到一種分佈式的協議來讓他們能夠遠程協商,從而贏取戰鬥?這就是著名的拜占庭將軍問題。
注意:拜占庭將軍問題中並不去考慮通信兵是否會被截獲或無法傳達信息等問題,即消息傳遞的信道絕無問。
- 其最終目的就是:能夠各方達到某一個命令的一致,這裏的各方指的是忠誠的一方,那些叛軍是不需要算在一起的。
1.2 與兩軍問題的區別
1.2.1 兩軍問題的定義
拜占庭將軍問題和兩軍問題實質是不一樣的,不能混爲一談。其中兩軍問題如下圖所示:
兩軍問題描述:
白軍駐紮在溝渠裏,藍軍則分散在溝渠兩邊。白軍比任何一支藍軍都更爲強大,但是藍軍若能同時合力進攻則能夠打敗白軍。他們不能夠遠程的溝通,只能派遣通信兵穿過溝渠去通知對方藍軍協商進攻時間。是否存在一個能使藍軍必勝的通信協議,這就是兩軍問題
1.2.2 區別
和拜占庭將軍問題有一定的相似性也有不同之處,所以我們必須注意的是:
通信兵得經過敵人的溝渠,在這過程中他可能被捕,也就是說,兩軍問題中信道是不可靠的,並且其中沒有叛徒之說(這裏有沒有並不是關鍵問題,根本性問題是信道的不可靠,同時也是它和拜占庭將軍問題的根本區別);
由此可見,大量混淆了拜占庭將軍問題和兩軍問題的文章並沒有充分理解兩者。
兩軍問題的根本問題在於信道的不可靠,也就是信號做不到真正的同步,那麼想要做到真正的同步唯一的辦法就是量子通信——畢竟遇事不決量子搞定😝🐶
-
不過其實也是有一定的理論基礎的:
- 處於量子糾纏態的兩個粒子,無論相隔多遠都能夠彼此同步,光是直觀的來看,這個效應可以用來實現保密通訊;
- 由於測不準原理,一測量粒子狀態就會改變其狀態,所以通訊時還必須通過這個信道發送另一條信息,從而使這個不可靠信道變爲可靠信道。
1.3 問題的本質
到底是一個關於一致性和正確性的算法問題。針對的是忠誠的將軍,因爲叛徒可以做出任何超出約定的判斷。我們就是要在有叛徒的干擾下,找到一個抗干擾的算法。
-
一致性(IC1)
每一個忠誠的將軍必須得到相同的()指令向量或者指令集合。
-
正確性(IC2)
若將軍是忠誠的,其他忠誠的將軍必須以他送出的值作爲
1.4 現有解決方案思路
類似TCP/IP的三次握手,我們也同樣的是採用容錯機制,通過限制一部分條件最後使得在有叛徒的情況下依然能夠得到信息的真實性。
2.方案說明
2.1 方案相關背景說明
失效說明:
所謂拜占庭失效指一方向另一方發送消息,另一方沒有收到,或者收到了錯誤的信息的情形。將其統一的進行分類(同時也是滿足分佈式系統的失效分類,因爲拜占庭將軍問題其實也是屬於分佈式的一種情況):
1.進行算法的另一步時失效,即崩潰失效;
2.無法正確執行算法的一個步驟;
3.執行了任意一個非算法指定的步驟。
2.2 方案1——口頭協議(OM(m)算法)
2.2.1 協議內容
滿足以下三個條件的方式稱爲口頭協議:
- A1:每個被髮送的消息都能夠被正確的投遞
- A2:信息接收者知道是誰發送的消息
- A3:能夠知道缺少的消息
注意:口頭協議並不會告知消息的上一個來源是誰,也就是沒有經過簽名
2.2.2 算法實現過程
1.算法描述:
對於正整數和,當圖是-正則的是,定義算法OM(m, p):
算法: OM(m, p)
(0) 選取司令的一個正則鄰居集,其中包含個副官;
(1) 司令發送他的值給中的每個副官;
(2) 對於中的每個,令爲副官從司令接收到的值;如果沒有從司令收到指令,默認選擇RETREAT。副官發送給每個其他的副官,如下:(A) 如果,按照路徑發送值。其中,路徑的存在由定義1的(a)(ii)部分保證。
(B) 如果,副官當作司令,再除去已經檢測出來叛亂者圖中運行算法。——副將得到信息一致就說明司令沒有叛亂,否則已經叛亂,這時候都可以去除已經叛亂的,遞歸一次(3) 對於每個和中的每個,且,令爲副官在第(2)步中從副官處收到的值;如果沒收到值,則爲RETREAT。副官使用作爲他的值,其中。
2.算法圖示過程
-
無法判斷的情況
m=1,n=3中司令忠誠而副官2是叛徒的情形:
-
可以進行判斷的情況
- m=1,n=4中司令忠誠而副官3是叛徒的情形:
- m=2,n=7中司令忠誠而副官5和副官6是叛徒的情形:
- 以下圖表示司令忠誠時副官1在OM(1)中得到的信息
因爲A2收到司令1的信肯定不會聽信一面之詞,他需要看別人收到的是否一致
2.3 方案2——書面協議(SM(m)算法)
2.3.1 協議內容
在算法中,司令官發送一個簽名的命令給他的每個副官。然後,每個副官添加他的簽名到命令上,併發送給其他副官,收到命令的副官再添加他的簽名發送給其他副官…
算法還假定了一個choice函數,作用在一個命令的集合上來獲得一個單獨的命令。choice函數需要滿足:
- 如果命令集合只包含一個元素,那麼.
- 如果命令集是,那麼.
例如,choince函數可以是取有序集合的中位數。
2.3.2 算法實現
1.算法描述
令指由將軍簽名的命令值,指命令指由將軍簽名後再由將軍簽名。令將軍爲司令官,每個副官維護一個命令集,包含他收到的被正確簽名的命令值。(如果司令官是忠誠的,這個值集的元素不會超過一個)。
Algorithm SM(m)
初始化
(1) 司令官簽名併發送他的命令給每個副官;
(2) 對於每個:(A) 如果副官從司令官接收到一個形式的消息,並且他還沒有接收到過任何命令,那麼:
(i) 令;
(ii) 發送給每個其他的副官。(B) 如果副官接收到形如的消息,且不在中,那麼:
(i) 他將添加到中;
(ii) 如果,那麼他發送消息給不同於的每個副官。(3) 對於每個副官: 當副官不再接收到消息,他將遵從行動。
2.算法圖示過程
口頭協議解決不了通過書面協議去解決的兩個圖示:
n=3,m=1,其中司令是叛徒:
如果是口頭協議的話肯定就行不通,因爲司令和副官都可以進行篡改——沒有簽名機制在裏面;
有了簽名機制在裏面,僅僅只能是司令進行篡改,因爲副官是沒法篡改司令簽名過的信息;
m=2,n=4中司令和副官3是叛徒:
只要經過忠誠的副將轉手之後便經過了簽名就不可更改,所以當兩個或者兩個以上是忠誠的時候,那麼這兩個肯定統一
- 在第二步的時候,節點接收到信息並不是馬上就相信他這個糟老頭子說傳的話😏,而是會詢問其他節點他傳的信息是什麼,是否是一致,通過統計那種信息最多就相信誰,所以經過忠誠的傳遞之後的是不能篡改的,那麼忠誠的信息一定是統一的
3. 結論
口頭協議:將軍總數爲n,叛徒數量爲m,OM(m)可以實現,在n>3m(至少3m+1)的情況下;
書面協議:對於任意m,最多隻有m個背叛者情況下,算法SM(m)能解決拜占庭將軍問題;
使用了簽名的情況下,只要知道了叛徒數量,我們就可以利用SM(m)算法解決拜占庭將軍問題,同理口頭協議也是需要知道叛徒數量的。
書面協議的結論非常令人興奮,這不是解決了拜占庭將軍問題了嗎?但請注意我們在A1~A4中實際上是添加了一些條件的,這使得拜占庭將軍問題在這些假設下能夠解決,但是在實際狀況中卻會有一些問題。觀察A1-A4,我們做了一些在現實中比較難以完成的假設,比如:
- 沒考慮傳輸信息的延遲時間;
- 書面協議的簽名體系難以實現;
- 簽名消息記錄的保存難以擺脫一箇中心化機構而獨立存在。