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