中本聰和拜占庭將軍問題

2021-08-15 15:58:51 字數 3984 閱讀 8525

拜占庭將軍問題很多人可能聽過,但不知道是什麼意思,本文從非專業的角度來講講,拜占庭將軍問題到底是說什麼的。

拜占庭將軍問題(byzantine generals problem),首先由leslie lamport與另外兩人在2023年提出,很簡單的故事模型,卻困擾了計算機科學家們數十年。

故事大概是這麼說的:

拜占庭帝國即中世紀的土耳其,擁有巨大的財富,周圍10個鄰邦垂誕已久,但拜占庭高牆聳立,固若金湯,沒有乙個單獨的鄰邦能夠成功入侵。任何單個鄰邦入侵的都會失敗,同時也有可能自身被其他9個鄰邦入侵。拜占庭帝國防禦能力如此之強,至少要有十個鄰邦中的一半以上同時進攻,才有可能攻破。

然而,如果其中的乙個或者幾個鄰邦本身答應好一起進攻,但實際過程出現背叛,那麼入侵者可能都會被殲滅。

於是每一方都小心行事,不敢輕易相信鄰國。這就是拜占庭將軍問題

在拜占庭問題裡,各鄰國最重要的事情是:所有將軍如何能過達成共識去攻打拜占庭帝國。

達成共識並非坐下來開個會那麼簡單,有的將軍心機深不可測,口是心非,如果有叛徒,可能會出現各種問題:

叛徒可能欺騙某些將軍自己將採取進攻行動。

叛徒可能慫恿其他將軍行動。

叛徒可能迷惑其他將軍,使他們接受不一致的資訊,從而感到迷惑。

針對拜占庭問題的深入研究,科學家們得出乙個結論:如果叛徒的數量大於或等於1/3,拜占庭問題不可解。

解釋過程可以用乙個副官模型來解釋:

假設只有3個人,a、b、c,三人中如果其中乙個是叛徒。當a發出進攻命令時,b如果是叛徒,他可能告訴c,他收到的是「撤退」的命令。這時c收到乙個「進攻」,乙個「撤退「,於是c被資訊迷惑,而無所適從。

如果a是叛徒。他告訴b「進攻」,告訴c「撤退」。當c告訴b,他收到「撤退」命令時,b由於收到了司令「進攻」的命令,而無法與c保持一致。

正由於上述原因,在只有三個角色的系統中,只要有乙個是叛徒,即叛徒數等於1/3,拜占庭問題便不可解。

當然,只要叛徒數小於1/3,問題還是可解的。

科學家們提出了口頭資訊方案和書面協議兩個方案。

口頭資訊即使將軍們派人用口信傳達訊息,口頭傳達訊息的實際含義指的是:

每個被傳送的訊息都能夠被正確投遞

資訊接受者知道訊息是誰發的

沉默(不發訊息)可以被檢測

口頭協議的演算法很簡單,如果其中乙個節點,比如1發布訊息出去,210都接受到1的訊息,然後210也分別轉告給其他的節點,每個節點都是資訊的轉達者,一輪下來,每個節點手上都會有10個資訊(進攻或者撤退),有叛徒的話,那資訊可能有進攻或者不進攻的不一致訊息。每個人相當於手裡有一本訊息的賬本,該怎麼決策呢?如果有一半以上的人說進攻,那麼採取進攻行動就是能成功的,所以這時即便有叛徒,只要聽大部分人的,少數服從多數來行動即是有利的。

可以假設10個國家,每個國家都可以派人向各個國家派信,比如一起約定 「某天早上六點,大家一起進攻拜占庭,同意就簽個字」。收到信的國家如果同意的話,就可以在原信上簽名蓋章。

書面協議相比口頭協議,實際說的是在這個多人的將軍模型中加了了個隱含條件:

將軍們能夠使用簽名技術,簽名不可偽造,一旦篡改即可發現。

同時任何人都可以驗證簽名的可靠性。

書面協議相比口頭協議,所有的訊息都是有記錄的,解決了追根溯源的問題。

但在現實中仍然可能面臨各種問題:

中世紀的鄰邦之間溝通只能靠信使騎馬,將軍們互不信任,也不可能親自聚在一起開會,物理距離導致資訊傳輸延遲。

真正可信的簽名體系難以實現。簽名造假的問題也沒法避免。

簽名訊息記錄的儲存難以擺脫中心化的機構。

另外,倘若每個國家都各自向其他9個國家派出信使,在這個網路即需要90次的傳輸才能完成一輪資訊交流,但是每個國家可能回饋不同的進攻時間,在這種非同步通訊的條件下,要能協商一致是個大問題。

也就是如果能夠依賴中心化可信的機構,也許能通過多方的簽名記錄整合在一起,更容易地實現9個國家的意見統一,但這是個偽假設,因為前提是這個網路就是互不信任的。

這就是乙個由互不信任的各個鄰邦國家所構成的分布式網路,要獲得最大的利益,又必須一起努力才能完成,如何達成一致的共識,變成了乙個難題。

萊斯利·蘭伯特提出了「拜占庭將軍問題」,但真正解決這以難題的是——中本聰。

如果10個將軍中的幾個同時發起訊息,勢必會造成系統的混亂,造成各說各的攻擊時間方案,行動難以一致。

誰都可以發起進攻的資訊,但由誰來發出呢?中本聰巧妙地在個系統加入了傳送資訊的成本,即:一段時間內只有乙個節點可以傳播資訊。

它加入的成本就是」工作量「——節點必須完成乙個計算工作才能向各城邦傳播訊息,當然,誰第乙個完成工作,誰才能傳播訊息。

當某個節點發出統一進攻的訊息後,各個節點收到發起者的訊息必須簽名蓋章,確認各自的身份。中本聰在這裡引用現代加密技術為這個資訊簽名。

這種加密技術——非對稱加密完全可以解決古代難以解決的簽名問題:

訊息傳送的私密性

能夠確認身份

簽名不可偽造、篡改

非對稱加密演算法的加密和解密使用不同的兩個金鑰.這兩個金鑰就是我們經常聽到的」公開金鑰」(公鑰)和」私有金鑰」(私鑰).

公鑰和私鑰一般成對出現, 如果訊息使用公鑰加密,那麼需要該公鑰對應的私鑰才能解密; 同樣,如果訊息使用私鑰加密,那麼需要該私鑰對應的公鑰才能解密.

非對稱加密的作用是:保護訊息內容, 並且讓訊息接收方確定傳送方的身份.

比如,將軍a想給將軍b傳送訊息,為防止訊息洩露,將軍a只需要使用b的公鑰對資訊加密,而b的公鑰是公開的,b只需要用只有他自己只的私鑰解密即可。

將軍b想要在信件上宣告自己的身份,他可以自己寫一段」簽名文字「,並用私鑰簽名,並廣播出去,所有人可以根據b的公鑰來驗證該簽名,確定的b的身份。

由此,乙個不可信的分布式網路變成了乙個可信的網路,所有的參與者可以在某件事在達成一致。

寫到這裡,同時終於明白了工作量證明(proof of work)的意義。有人說挖礦浪費了巨大的社會資源,但建立信任的成本可不是0,挖礦是維護位元幣網路可靠性的最好辦法。

工作量證明,簡單的理解就是乙份證明,現實中的畢業證、駕駛證都屬於工作量證明,它用以檢驗結果的方式證明你過去所做過了多少工作。

在拜占庭的系統裡,加入工作量證明,其實就是簡單粗暴地引入了乙個條件:大家都別忙著發起訊息,都來做個題,看誰最聰明,誰就有資格第乙個發起訊息。

這個題必須是絕對公平的,中本聰在設計位元幣時,它採用了一種工作量證明機制叫雜湊現金,在乙個交易塊這要找到乙個隨機數,計算機只能用窮舉法來找到這個隨機數,可以說,能不能找到全靠運氣,所以對於各個節點來說,這個世界上,只有隨機才是真正的公平,實現隨機的最好辦法是使用數學,所有的將軍在尋找共識的過程,借助了大家都認可的數學邏輯。

如果不同的將軍先後解出了題,各自先後向這個網路發布訊息,於是各個節點都會收到來自不同節點發起的進攻或者不進攻的訊息,那怎麼辦的?只有時間最早的發起者才是有效的。中本聰巧妙的設計了乙個時間戳的東西,為每個將軍在解好題的時間(出塊時間)蓋上時間印章。

將軍們那又憑什麼要一起做工作量證明呢?中本聰也完全可以設定乙個獎勵機制,位元幣的獎勵機制是每打包乙個塊,目前是獎勵25個位元幣,當然,拜占庭將軍問題的獎勵機制可以是瓜分拜占庭獲得的利益。

對了,如果有出現背叛怎麼辦?

在這個分布式網路裡:

每個將軍都有乙份實時與其他將軍同步的訊息賬本。

賬本裡有每個將軍的簽名都是可以驗證身份的。如果有哪些訊息不一致,可以知道訊息不一致的是哪些將軍。

儘管有訊息不一致的,只要超過半數同意進攻,少數服從多數,共識達成。

由此,在乙個分布式的系統中,儘管有壞人,壞人可以做任意事情(不受protocol限制),比如不響應、傳送錯誤資訊、對不同節點傳送不同決定、不同錯誤節點聯合起來幹壞事等等。但是,只要大多數人是好人,就完全有可能去中心化地實現共識(consensus)。

區塊鏈上的共識機制主要解決由誰來構造區塊,以及如何維護區塊鏈統一的問題。

拜占庭容錯問題需要解決的也同樣是誰來發起資訊,如何實現資訊的統一同步的問題。

到這裡也可以知道了,基於網際網路的區塊鏈技術,它克服了口頭協議與書面協議的種種缺點,使用訊息加密技術、以及公平的工作量證明機制,建立了一組所有將軍都認可的協議,這套協議的出現,拜占庭將軍問題也就完美的得到了解決。

偉大的創新往往是站在前人的肩膀上,中本聰就是各種前沿技術的整合者,古老的疑難雜症在這種整合創新下,就變得不再是問題了。

拜占庭將軍問題

前進中的可信計算 拜占庭將軍問題 閔應驊 乙個可信的計算機系統必須容忍乙個或多個部件的失效。失效的部件可能送出相互矛盾的資訊給系統的其他部件。這正是目前網路安全要對付的情況,如銀行交易安全 存款安全。美國2001 9 11遭恐怖襲擊之後,大家普遍認識到銀行的異地備份非常重要。紐約的一家銀行可以在東京...

拜占庭將軍問題

假設有4個將軍圍攻乙個敵人,只有三個將軍同時出擊才可以將敵人擊敗,任意兩個或者乙個將軍出擊均會被敵人擊敗,4個將軍通過一對一的通訊機制協商共同出擊時機,同時4個將軍中有乙個是內奸,他會混淆通訊結果,避免3個將軍協商出統一的出擊時機。拜占庭將軍 pbft 問題既指在這種情況下將軍們如果達成共識,共同擊...

拜占庭將軍問題

拜占庭將軍問題 byzantine failures 是由萊斯利 蘭伯特提出的點對點通訊中的基本問題。含義是在存在訊息丟失的不可靠通道上試圖通過訊息傳遞的方式達到一致性是不可能的。因此對一致性的研究一般假設通道是可靠的,或不存在本問題。在很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼...