提到區(qū)塊鏈的共識機制,就來談談拜占庭將軍問題。拜占庭將軍問題也是一個共識問題,有興趣的可以繼續(xù)深究,解決方案也很多。
1.拜占庭領軍問題
首先由Leslie Lamport與另外兩人在1982年提出,被稱為The Byzantine Generals Problem或者Byzantine Failure。核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引申到計算領域,發(fā)展成了一種容錯理論。隨著比特幣和區(qū)塊鏈的出現和興起,這個著名問題又重入大眾視野。關于拜占庭將軍問題,一個簡易的非正式描述如下:拜占庭帝國想要進攻一個強大的敵人,為此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵御5支常規(guī)拜占庭軍隊的同時襲擊?;谝恍┰?,這10支軍隊不能集合在一起單點突破,必須在分開的包圍狀態(tài)下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通信兵相互通信來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態(tài)下,拜占庭將軍們能否找到一種分布式的協議來讓他們能夠遠程協商,達成共識,從而贏取戰(zhàn)斗?這就是著名的拜占庭將軍問題。
應該明確的是,拜占庭將軍問題中并不去考慮通信兵是否會被截獲或無法傳達信息等問題,即消息傳遞的信道絕無問。Lamport已經證明了在消息可能丟失的不可靠信道上試圖通過消息傳遞的方式達到一致性是不可能的。所以,在研究拜占庭將軍問題的時候,我們已經假定了信道是沒有問題的,并在這個前提下,去做一致性和容錯性相關研究。如果需要考慮信道是有問題的,這涉及到了另一個相關問題:兩軍問題。
2.兩軍問題
正如前文所說,拜占庭將軍問題和兩軍問題實質是不一樣的,兩軍問題是用來解決通信通道的可靠性,而拜占庭將軍問題是來解決共識機制的。兩軍問題:白軍駐扎在溝渠里,藍軍則分散在溝渠兩邊。白軍比任何一支藍軍都更為強大,但是藍軍若能同時合力進攻則能夠打敗白軍。他們不能夠遠程的溝通,只能派遣通信兵穿過溝渠去通知對方藍軍協商進攻時間。是否存在一個能使藍軍必勝的通信協議,這就是兩軍問題。
看到這里您可能發(fā)現兩軍問題和拜占庭將軍問題有一定的相似性,但我們必須注意的是,通信兵得經過敵人的溝渠,在這過程中他可能被捕,也就是說,兩軍問題中信道是不可靠的,并且其中沒有叛徒之說,這就是兩軍問題和拜占庭將軍問題的根本性不同。由此可見,大量混淆了拜占庭將軍問題和兩軍問題的文章并沒有充分理解兩者。
兩軍問題的根本問題在于信道的不可靠,反過來說,如果傳遞消息的信道是可靠的,兩軍問題可解。然而,并不存在這樣一種信道,所以兩軍問題在經典情境下是不可解的,為什么呢?
倘若1號藍軍(簡稱1)向2號藍軍(簡稱2)派出了通信兵,若1要知道2是否收到了自己的信息,1必須要求2給自己傳輸一個回執(zhí),說“你的信息我已經收到了,我同意你提議的明天早上10點9分準時進攻”。然而,就算2已經送出了這條信息,2也不能確定1就一定會在這個時間進攻,因為2發(fā)出的回執(zhí)1并不一定能夠收到。所以,1必須再給2發(fā)出一個回執(zhí)說“我收到了”,但是1也不會知道2是否收到了這樣一個回執(zhí),所以1還會期待一個2的回執(zhí)。
雖然看似很可笑,但在這個系統(tǒng)中永遠需要存在一個回執(zhí),這對于兩方來說都并不一定能夠達成十足的確信。更要命的是,我們還沒有考慮,通信兵的信息還有可能被篡改。由此可見,經典情形下兩軍問題是不可解的,并不存在一個能使藍軍一定勝利的通信協議。
不幸的是,兩軍問題作為現代通信系統(tǒng)中必須解決的問題,我們尚不能將之完全解決,這意味著你我傳輸信息時仍然可能出現丟失、監(jiān)聽或篡改的情況。但我們能不能通過一種相對可靠的方式來解決大部分情形呢?這需要談到TCP協議。事實上,搜索“兩軍問題與三次握手”,您一定可以找到大量與TCP協議相關的內容。若您是通信方面的專家,權當筆者是班門弄斧,這里僅用最淺顯易懂的方式科普TCP協議。
3. 拜占庭將軍問題實質
回顧問題,一群將軍想要實現某一個目標(一致進攻或者一致撤退),但是單獨行動行不通,必須合作, 達成共識;由于叛徒的存在,將軍們不知道應該如何達到一致。注意,這里“一致性”才是拜占庭將軍問題探討的內容,如果本來叛徒數量就已經多到了問題不可解的地步,這個就是“反叛”的問題了;同時,我們的目標是忠誠的將軍能夠達成一致,對于這些忠誠的將軍來說,進攻或者撤退都是可以的,只要他們能夠達成一致就行。
但是,光靠“一致”就可以解決問題嗎?考慮一下,如果萬事俱備,客觀上每個忠誠的將軍只要進攻了就一定能夠勝利,但是卻因為叛徒的存在他們都“一致的”沒有進攻;反之,條件不利,將軍們不應該進攻,但是卻因為叛徒的存在所有人都“一致的”進攻了。
可以發(fā)現,只有“一致性”是不足以解決拜占庭將軍問題的,我們還需要提出一個“正確性”要求。