1. 程式人生 > >區塊鏈技術公司談什麼是拜占庭將軍問題

區塊鏈技術公司談什麼是拜占庭將軍問題

  接觸區塊鏈的同學,多少都聽說過拜占庭將軍問題,經常看到或聽到某某區塊鏈使用某某演算法解決了拜占庭將軍問題,那麼究竟什麼是拜占庭將軍問題呢?

  也被稱為“拜占庭容錯”、“拜占庭將軍問題”。 拜占庭將軍問題是Leslie Lamport(2013年的圖靈講得住)用來為描述分散式系統一致性問題(Distributed Consensus)在論文中抽象出來一個著名的例子。

  拜占庭帝國是5~15世紀的東羅馬帝國,即現在的土耳其伊斯坦布林。拜占庭城邦擁有巨大的財富,令它的十個鄰邦垂涎已久。但是拜占庭高牆聳立,固若金湯,沒有一個單獨的鄰邦能夠成功入侵。任何單個城邦的入侵行動都會失敗,而入侵者的軍隊也會被殲滅,使得其自身反而容易遭到其他九個城邦的入侵。這十個城邦之間也互相覬覦對方的財富並經常爆發戰爭。拜占庭的防禦能力如此之強,十個鄰邦中的至少一半同時進攻,才能攻破。也就是說,如果六個或者更多的鄰邦一起進攻,他們就會成功並獲得拜占庭的財富。然而,如果其中有一個或者更多鄰邦發生背叛,答應一起入侵但在其他人進攻的時候又不幹了,會導致只有五支或者更少的軍隊在同時進攻,那麼所有的進攻軍隊都會被殲滅,並隨後被其他鄰邦所劫掠。

  因此,這是一個由不互相信任的各個鄰邦構成的分散式網路,每一方都小心行事,因為稍有不慎,就會給自己帶來災難。為了獲取拜占庭的鉅額財富,這些鄰邦分散在拜占庭的周圍,依靠士兵相互通訊來協商進攻目的及進攻時間。這些鄰邦將軍想要攻克拜占庭,面臨著一個困擾,也就是拜占庭將軍問題:鄰邦將軍不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,將軍們能否找到一種分散式協議來進行遠端協商,達成統一共識機制,進而贏取拜占庭城堡攻克戰役的勝利呢,這就是拜占庭將軍問題。

  這個例子大意是這樣的:

  拜占庭帝國想要進攻一個強大的敵人,為此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。這10支軍隊在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊(一半以上)同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通訊兵騎馬相互通訊來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們才能保證有多於6支軍隊在同一時間一起發起進攻,從而贏取戰鬥?

  拜占庭將軍問題中並不去考慮通訊兵是否會被截獲或無法傳達資訊等問題,即訊息傳遞的通道絕無問題。Lamport已經證明了在訊息可能丟失的不可靠通道上試圖通過訊息傳遞的方式達到一致性是不可能的。所以,在研究拜占庭將軍問題的時候,已經假定了通道是沒有問題的.

  單從上面的說明可能無法理解這個問題的複雜性,我們來簡單分析一下:

  先看在沒有叛徒情況下,假如一個將軍A提一個進攻提議(如:明日下午1點進攻,你願意加入嗎?)由通訊兵通訊分別告訴其他的將軍,如果幸運中的幸運,他收到了其他6位將軍以上的同意,發起進攻。如果不幸,其他的將軍也在此時發出不同的進攻提議(如:明日下午2點、3點進攻,你願意加入嗎?),由於時間上的差異,不同的將軍收到(並認可)的進攻提議可能是不一樣的,這是可能出現A提議有3個支持者,B提議有4個支持者,C提議有2個支持者等等。

  再加一點複雜性,在有叛徒情況下,一個叛徒會向不同的將軍發出不同的進攻提議(通知A明日下午1點進攻, 通知B明日下午2點進攻等等),一個叛徒也會可能同意多個進攻提議(即同意下午1點進攻又同意下午2點進攻)。

  叛徒傳送前後不一致的進攻提議,被稱為“拜占庭錯誤”,而能夠處理拜占庭錯誤的這種容錯性稱為「Byzantine fault tolerance」,簡稱為BFT。