【分佈式共識二】拜占庭將軍問題----口頭協議

區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者彙集地算法

做者:吳壽鶴網絡

來源:區塊鏈兄弟分佈式

原文連接:http://www.blockchainbrother.com/article/7函數

著權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。區塊鏈

拜占庭將軍問題是一個共識問題: 首先由Leslie Lamport與另外兩人在1982年提出,被稱爲The Byzantine Generals Problem或者Byzantine Failure。核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引伸到計算領域,發展成了一種容錯理論。隨着比特幣的出現和興起,這個著名問題又重入大衆視野。spa

關於拜占庭將軍問題,一個簡易的非正式描述以下:遞歸

拜占庭帝國想要進攻一個強大的敵人,爲此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。基於一些緣由,這10支軍隊不能集合在一塊兒單點突破,必須在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通訊兵相互通訊來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不肯定他們中是否有叛徒,叛徒可能擅自變動進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們可否找到一種分佈式的協議來讓他們可以遠程協商,從而贏取戰鬥?這就是著名的拜占庭將軍問題。get

應該明確的是,拜占庭將軍問題中並不去考慮通訊兵是否會被截獲或沒法傳達信息等問題,即消息傳遞的信道絕無問題。Lamport已經證實了在消息可能丟失的不可靠信道上試圖經過消息傳遞的方式達到一致性是不可能的。因此,在研究拜占庭將軍問題的時候,咱們已經假定了信道是沒有問題的,並在這個前提下,去作一致性和容錯性相關研究。同步

attachments-2017-07-aNZUwMvv5969a75ddbca4.png

拜占庭容錯算法it

咱們已經瞭解了拜占庭將軍問題的場景,而且明確了這個問題的解決是創建在通訊兵能夠正確的傳達信息的基礎上的,即信道絕對可信。接下來,咱們將探討拜占庭將軍問題的實質。

拜占庭容錯算法是解決在同步網絡,任意失敗模型狀況下達成一致性共識。

​拜占庭將軍問題實質

回顧問題,一羣將軍想要實現某一個目標(一致進攻或者一致撤退),可是單獨行動行不通,必須合做, 達成共識;因爲叛徒的存在,將軍們不知道應該如何達到一致。注意,這裏「一致性」纔是拜占庭將軍問題探討的內容,若是原本叛徒數量就已經多到了問題不可解的地步,這個就是「反叛」的問題了;同時,咱們的目標是忠誠的將軍可以達成一致,對於這些忠誠的將軍來講,進攻或者撤退都是能夠的,只要他們可以達成一致就行。

可是,光靠「一致」就能夠解決問題嗎?考慮一下,若是萬事俱備,客觀上每一個忠誠的將軍只要進攻了就必定可以勝利,可是卻由於叛徒的存在他們都「一致的」沒有進攻;反之,條件不利,將軍們不該該進攻,可是卻由於叛徒的存在全部人都「一致的」進攻了。

能夠發現,只有「一致性」是不足以解決拜占庭將軍問題的,咱們還須要提出一個「正確性」要求。這個要求是值得斟酌的,由於若是客觀來看或許會有「絕對正確的」判斷,可是針對每個將軍,你們的判斷或許都不相同,咱們如何定義「正確」呢?咱們或許能夠簡單地說,正確就是每一個忠誠的將軍都正確的表達了本身的意思,不會由於叛徒讓別的將軍認爲忠誠的將軍是叛徒而不採用他傳達的消息。

至此,咱們將拜占庭將軍問題簡化成了,全部忠誠的將軍都可以讓別的將軍接收到本身的真實意圖,並最終一致行動;而形式化的要求就是,「一致性」與「正確性」。

若是將問題推廣開來,能夠發現針對一致性和正確性的算法並不要求命令必須是「進攻/撤退」或是「1/0」,而能夠是「發送消息1/發送消息2/待機」或「x/y/z/w」,這意味着拜占庭將軍問題算法能夠爲多種分佈式系統提供啓發,好比電力系統或網絡系統。

因而可知,這個問題說究竟是一個關於一致性和正確性的算法問題,這個算法是針對的是忠誠的將軍,由於叛徒能夠作出任何超出約定的判斷。咱們就是要在有叛徒的干擾下,找到一個抗干擾的算法。要解決這個算法問題,咱們須要將形式化要求具體化。

口頭協議推演

下面的這個截圖是從Lamport發表的論文中截取的:

attachments-2017-07-4niKBl885969a77bc38ca.png

對於這個算法須要說明的是:

(1) 在第一輪 將軍會把消息發送給全部的副官,第i個副官收到的記爲 Vi。如 1(這裏表明的是Attack)

(2) 在第二輪裏面,Li(即第i個副官)會懷疑將軍發來的消息Vi是對仍是錯,因而他會問其他的副官。這樣他就會獲得剩下的(n-2)個副官的值。 i從1到n-1,因此每一個副官都會獲得剩餘的n-2個副官手裏的Vi。在這一步驟裏,忠誠的副官j會直接將本身的 Vj發送給其它人。叛徒則會發假消息。

在n=7,m=2的時候 若是將軍是忠臣的話,那麼在第二輪忠誠的副官確實已經能夠判斷出要作的決定,由於他們會收到(1 1 1 0 0 )再加上將軍發來的1就是 1 1 1 1 0 0 可是這個算法是遞歸的全部必需要到第三輪。而且若是將軍是個叛徒的話,那麼第二輪有情形是作不出決定的。

這裏對進入第三輪的解釋是,如L1收到其它L2~L6發來的Vj, 可是他要懷疑準確性,好比L1會想L2發給本身是不是正確的呢?那麼就進入第三輪進行投票。

(3)在第三輪裏面,接着(2)中後面的問題。L1會依次詢問L3,4,5,6 ,問他們上一輪L2給他們發了什麼,而後L1會獲得在(2)中 L2->L3, L2->L4,L2->L5, L2->L6的值 這樣再結合本身的L2->L1的值,從這5個裏面用majority函數投出決定獲得L2發給本身的消息值。依次再進行L3,L4,L5,L6在第二輪中發給本身的消息的確認。

這樣L1就完成了第二輪的確認。以後L1再從第一步中將軍發給本身的vi和第二輪中肯定的5個值中投出本身的決定。

其他的L2,L3.等等也進行一樣的步驟。

若是仍是沒清晰的話,直接看下面的過程:

attachments-2017-07-KlzHgnSj5969a790c4934.png

這裏須要注意的是:Lamport提出的容錯的兩個條件

IC1:即全部的忠誠的副官要遵照同一個命令,即達成一致;

IC2:假如將軍是忠誠的,那麼每個忠誠的副官都應該按照將軍的意思行事。

這裏將軍是叛徒,因此只要知足IC1條件便可。

Step1 : C給L1~L6 依次發 A R A R A X  (A,R表明攻擊和撤退,這裏由於C是叛徒,因此能夠隨便發給L1-L5消息,這裏只是一個例子,能夠用其餘的值,只要最後知足IC1就能夠)

Step2: L1爲例,L1會懷疑將軍發給本身的消息,因而會問L2-L6

 

  L2(R) L3(A) L4(R) L5(A) L6(X) A(L1)
L2 R R R R A R
L3 A A A A R A
L4 R R R R A R
L5 A A A A R A
L6 R A R A A A

Step3:其實在第三步中 L1會依次確認在step2中, L2~L6發給本身的信息. 例如確認L2時 會問L3-L6,在Step2中L2發給大家了什麼

最後獲得 R, R, R,X (由於L6這時候確定又說謊) 再結合本身的R , L1肯定在Step2中收到L2發來的是R,以後又確認了L3-L6。你們能夠本身在草稿紙上畫出。

其實由於L1-L5都是忠誠,他們不會在Step2中撒謊,因此只需投票L6便可 ,(A R A R A )是L6發給L1-L5的信息,最後投出發的是A , 將A修改到step2中L1-L5收到的

信息中其他的信息能夠不用改。

最後獲得L1-L5均是 4個A, 2個R。 以L1爲例=R  A  R  A  A  A 

即L1~L5達成了一致。

文章發佈只爲分享區塊鏈技術內容,版權歸原做者全部,觀點僅表明做者本人,毫不表明區塊鏈兄弟贊同其觀點或證明其描述

相關文章
相關標籤/搜索