瞭解過比特幣和區塊鏈的人,多少都聽說過拜占庭將軍問題,今天要分享的就是拜占庭共識的問題。
拜占庭將軍問題是什麼
拜占庭將軍問題是一個共識問題,首先由Leslie Lamport與另外兩人在1982年提出,被稱為The Byzantine Generals Problem或者Byzantine Failure。核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引申到計算領域,發展成了一種容錯理論。隨著比特幣的出現和興起,這個著名問題又重入大眾視野。
拜占庭將軍問題場景
拜占庭是東羅馬帝國的首都,這是一個國土遼闊的帝國,其用於防禦的軍隊彼此都分離的很遠,各個軍隊彼此之間靠信差傳訊息。戰爭發生時,他們無法聚在一起來商討進攻與否,只能彼此之間透過信使來傳遞彼此的決定。
困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻決定。在這種狀態下,拜占庭將軍們能否找到一種分散式的協議來讓他們能夠遠端協商,從而就進攻問題達成一致?這就是著名的拜占庭將軍問題。
背景:拜占庭派10支軍隊去圍攻一個強大的敵人,至少6支軍隊同時進攻才可以取勝,否則不進攻。
難題:其中一些將軍是叛徒,會發布假訊息或者相反的進攻意圖。
目的:所有將軍遠端協商最終達成一致。
拜占庭解決方案:
1、每個將軍給其他所有將軍傳送指令。
2、每個將軍根據自己收到的指令來決定最終的策略。
缺點:每個將軍都要向其他將軍傳送指令,如果人數很多的話,達成一致的時間比較長。
成立前提
前提1、通訊沒問題,每個將軍發出的資訊中間沒有阻斷,都順利傳達。
前提2、n≧3m+1,n代表將軍總數,m代表叛徒的數量。即如果叛徒有1人的話,總數最少3×1+1=4人,叛徒有3人的話,總數最少為3×3+1=10人。
如下圖所示,進攻命令為1,按兵不動命令為0,下面列舉其中的一種情況。
可以看出來,忠將A發出的指令的都是1,收到的指令是1、1、0,最後指令為1,即進攻
叛將B發出的都是0,收到的指令是1、1、1,正常來說應該做出1的指令,但叛將搗亂,最後指令為0,即B選擇不出兵
忠將C發出的都是1,收到的是1、1、0,最後指令為1,即進攻
忠將D發出的都是1,收到的是1、1、0,最後指令為1,即進攻
上面的事例中,叛將B發出的都是0指令,感興趣的老鐵可以試著自己推演一下,當叛將B發出其他的指令時,例如:1、1、0或者1、0、0亦或是1、1、1後結果是什麼樣的,也可以多加幾個將軍進行一下推演,經過推演你可以發現,共識總是可以達成的,要麼進攻保證成功,要麼統一不進攻,透過推演你也可以更深刻的理解拜占庭將軍的共識問題。
當然,為了說的明白一點上面只用了4個節點,實際情況下節點要多的多,複製程度也高很多,但是,只要滿足上面的情況,最後還是都能達成共識的。
需要注意的一點是,拜占庭問題最後取得的共識有可能是進攻,也有可能是不進攻,最終目的不是為了勝利,而是為了統一行動,不讓忠將因為錯誤資訊而犧牲。