拜占庭將軍問題(Byzantine Generals Problem)是由萊斯利·蘭波特(Leslie Lamport)與另外兩人在1982年提出的一個虛擬模型,并由此引申到計算領域,提出了分布式對等網(wǎng)絡的通信容錯問題。
1.問題描述
引用一個經(jīng)典的例子,相距甚遠的拜占庭將軍分別率領一支軍隊要共同圍困一座城市,將軍間必須通過投票來達成一致行動(進攻或撤退)。
每位將軍都將自己“進攻”或“撤退”的決定通過信使分別通知其他將軍,然后每位將軍根據(jù)所有的消息決定進攻還是撤退。
但是,當將軍中出現(xiàn)“叛徒”時,情況就變復雜了。叛徒不僅可以投票給錯誤的決策,還可能會選擇性地發(fā)送投票,叛徒的存在會影響一致性的建立。
如何在軍中可能有叛徒傳遞錯誤消息的情況下,保障忠誠的將軍行動一致,這就是拜占庭將軍問題。
拜占庭將軍問題的前提是假定消息傳遞的信道絕對可靠(即不存在兩軍問題),在這個前提下,拜占庭將軍問題的實質就是“一致性”和“正確性”。
“一致性”指所有忠誠將軍的行為一致;“正確性”指的是每個忠誠的將軍都真實的表達了自己的消息。
2.傳統(tǒng)解決方法
在經(jīng)典場景中,解決拜占庭將軍問題有兩種方法,口頭協(xié)議和書面協(xié)議。采用口頭協(xié)議,若叛徒數(shù)少于1/3,則拜占庭將軍問題可解。
使用口頭協(xié)議的傳遞消息時,每位將軍除了給其他將軍傳遞消息, 還會將自己收到的消息分別轉給其他將軍,最后每位將軍根據(jù)收到的所有消息選擇與大多數(shù)將軍的行為保持一致。使用口頭協(xié)議時,不能溯源,知道有叛徒也不能確定誰是叛徒。
書面協(xié)議規(guī)定在發(fā)送消息時添加發(fā)送者的簽名,偽造簽名會被發(fā)現(xiàn)并且任何人可以驗證簽名的可靠性,這使得消息可以追本溯源。
采用書面協(xié)議,叛徒人數(shù)多于1/3時,拜占庭將軍問題仍然有解。書面協(xié)議真正的實現(xiàn)需要考慮諸多問題,比如可信的簽名體系等。
3.區(qū)塊鏈解決方法
隨著時代的發(fā)展和技術的完善,區(qū)塊鏈站在巨人的肩膀上提出了拜占庭將軍問題的解決方案--共識機制和非對稱加密技術。
共識機制使得一段時間內只有一個節(jié)點發(fā)送消息,其他節(jié)點驗證即可。由于區(qū)塊鏈消息全網(wǎng)廣播,故各個節(jié)點接收到的消息是一致的。(訪問鏈接:有聲閱讀||分布式信仰的基礎--共識機制,了解更多共識機制相關內容)
非對稱加密技術保護消息內容, 同時讓消息接收方確定發(fā)送方的身份。A發(fā)給B的消息通過B的公鑰加密,B通過私鑰解密。
若A想申明自己的身份,只需要將消息使用自己的私鑰進行簽名即可,B收到消息后就可以使用A的公鑰驗證消息的來源。
由此,一個不可信的分布式網(wǎng)絡變成了一個可信的網(wǎng)絡,所有的參與者可以在某件事達成一致。





