區塊鏈 拜占庭將軍問題 BFT

2022-01-12 21:01:46 字數 4558 閱讀 2429

拜占庭將軍問題很多人可能聽過,但不知道具體是什麼意思。那麼究竟什麼是拜占庭將軍問題呢? 本文從最通俗的故事講起,並對該問題進行抽象,並告訴大家拜占庭將軍問題為什麼在區塊鏈領域作為乙個重點研究問題。

「拜占庭將軍問題」也被稱為「拜占庭容錯」。

拜占庭將軍問題是leslie lamport(2023年的圖靈講得住)用來為描述分布式系統一致性問題(distributed consensus)在**中抽象出來乙個著名的例子。

這個例子大意是這樣的:

拜占庭帝國想要進攻乙個強大的敵人,為此派出了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。

求解拜占庭將軍問題,隱含要滿足以下兩個條件:

1)每個忠誠的將軍必須收到相同的命令值vi(vi是第i個將軍的命令)。

2)如果第i個將軍是忠誠的,那麼他傳送的命令和每個忠誠將軍收到的vi相同。

於是,拜占庭將軍問題的可以描述為:乙個傳送命令的將軍要傳送乙個命令給其餘n-1個將軍,使得:

ic1.所有忠誠的接收命令的將軍遵守相同的命令;

ic2.如果傳送命令的將軍是忠誠的,那麼所有忠誠的接收命令的將軍遵守所接收的命令。

lamport對拜占庭將軍問題的研究表明,當n>3m時,即叛徒的個數m小於將軍總數n的1/3時,通過口頭同步通訊(假設通訊是可靠的),可以構造同時滿足ic1和ic2的解決方案,即將軍們可以達成一致的命令。但如果通訊是可認證、防篡改偽造的(如採用pki認證,訊息簽名等),則在任意多的叛徒(至少得有兩個忠誠將軍)的情況下都可以找到解決方案。

而在非同步通訊情況下,情況就沒有這麼樂觀。fischer-lynch-paterson定理證明了,只要有乙個叛徒存在,拜占庭將軍問題就無解。翻譯成分布式計算語言,在乙個多程序非同步系統中,只要有乙個程序不可靠,那麼就不存在乙個協議,此協議能保證有限時間內使所有程序達成一致。

由此可見,拜占庭將軍問題在乙個分布式系統中,是乙個非常有挑戰性的問題。因為分布式系統不能依靠同步通訊,否則效能和效率將非常低。因此尋找一種實用的解決拜占庭將軍問題的演算法一直是分布式計算領域中的乙個重要問題。

在這裡,我們先給出分布式計算中有關拜占庭缺陷和故障的兩個定義:

定義1:拜占庭缺陷(byzantine fault):任何觀察者從不同角度看,表現出不同症狀的缺陷。

定義2:拜占庭故障(byzantine failure):在需要共識的系統中由於拜占庭缺陷導致喪失系統服務。

在分布式系統中,不是所有的缺陷或故障都能稱作拜占庭缺陷或故障。像宕機、丟訊息等缺陷或故障不能算為拜占庭缺陷或故障。拜占庭缺陷或故障是最嚴重缺陷或故障,拜占庭缺陷有不可**、任意性的缺陷,例如遭黑客破壞,中木馬的伺服器就是乙個拜占庭伺服器。

在乙個有拜占庭缺陷存在的分布式系統中,所有的程序都有乙個初始值。在這種情況下,共識問題(consensus problem),就是要尋找乙個演算法和協議,使得該協議滿足以下三個屬性。

1)一致性(agreement):所有的非缺陷程序都必須同意同乙個值。

2)正確性(validity):如果所有的非缺陷的程序有相同的初始值,那麼所有非缺陷的程序所同意的值必須是同乙個初始值。

3)可結束性(termination):每個非缺陷的程序必須最終確定乙個值。

根據fischer-lynch-paterson的理論,在非同步通訊的分布式系統中,只要有乙個拜占庭缺陷的程序,就不可能找到乙個共識演算法,可同時滿足上述要求的一致性、正確性和可結束性要求。在實際情況下,根據不同的假設條件,有很多不同的共識演算法被設計出來。這些演算法各有優勢和侷限。演算法的假設條件有以下幾種情況:

1)故障模型:非拜占庭故障/拜占庭故障。

2)通訊型別:同步/非同步。

3)通訊網路連線:節點間直連數。

4)資訊傳送者身份:實名/匿名。

5)通訊通道穩定性:通道可靠/不可靠。

6)訊息認證性:認證訊息/非認證訊息。

在出現位元幣之前,解決分布式系統一致性問題主要是lamport提出的paxos演算法或其衍生演算法。paxos類演算法僅適用於中心化的分布式系統,這樣的系統的沒有不誠實的節點(不會傳送虛假錯誤訊息,但允許出現網路不通或宕機出現的訊息延遲)。

中本聰在位元幣中創造性的引入了「工作量證明(pow : proof of work)」來解決這個問題,有興趣可進一步閱讀工作量證明

(猛擊!)。

通過工作量證明就增加了傳送資訊的成本,降低節點傳送訊息速率,這樣就以保證在乙個時間只有乙個節點(或是很少)在進行廣播,同時在廣播時會附上自己的簽名。

這個過程就像一位將軍a在向其他的將軍(b、c、d…)發起乙個進攻提議一樣,將軍b、c、d…看到將軍a簽過名的進攻提議書,如果是誠實的將軍就會立刻同意進攻提議,而不會發起自己新的進攻提議。

以上就是位元幣網路中是單個區塊(賬本)達成共識的方法(取得一致性)。

理解了單個區塊取得一致性的方法,那麼整個區塊鏈(總賬本)如果達成一致也好理解。

我們稍微把將軍問題改一下:

假設攻下乙個城堡需要多次的進攻,每次進攻的提議必須基於之前最多次數的勝利進攻下提出的(只有這樣敵方已有損失最大,我方進攻勝利的可能性就更大),這樣約定之後,將軍a在收到進攻提議時,就會檢查一下這個提議是不是基於最多的勝利提出的,如果不是(基於最多的勝利)將軍a就不會同意這樣的提議,如果是的,將軍a就會把這次提議記下來。

這就是位元幣網路最長鏈選擇

(猛擊!)

工作量證明其實相當於提高了做叛徒(發布虛假區塊)的成本,在工作量證明下,只有第乙個完成證明的節點才能廣播區塊,競爭難度非常大,需要很高的算力,如果不成功其算力就白白的耗費了(算力是需要成本的),如果有這樣的算力作為誠實的節點,同樣也可以獲得很大的收益(這就是礦工所作的工作),這也實際就不會有做叛徒的動機,整個系統也因此而更穩定。

礦工挖礦獲得位元幣獎勵以及記賬所得的交易費用使得礦工更希望維護網路的正常執行,而任何破壞網路的非誠信行為都會損害礦工自身的利益。因此,即使有些位元幣礦池具備強大的算力,它們都沒有作惡的動機,反而有動力維護位元幣的正常執行,因為這和它們的切實利益相關。

注:原始的拜占庭容錯系統由於需要展示其理論上的可行性而缺乏實用性。另外,還需要額外的時鐘同步機制支援演算法的複雜度也是隨節點增加而指數級增加。實用拜占庭容錯系統(pbft)

(猛擊!)降低了拜占庭協議的執行複雜度,從指數級別降低到多項式級別(polynomial),使拜占庭協議在分布式系統中應用成為可能。

總結:共識演算法的核心就是解決拜占庭將軍問題(分布式網路一致性問題)。

lamport l,shostak r,pease m.the byzantine generals problem.acm trans.on programming languages and systems,1982,4(3):382-401.

fischer,m.j.,lynch,n.a.,paterson,m.:impossibility of distributed consensus with one faulty process.j.acm 32(2),374-382(1985).

《區塊鏈技術指南》鄒均,張海寧,唐屹,李磊 著

【時間倉促,如有錯誤,歡迎指正! ||   歡迎留下您的評語!  大家一起**、學習區塊鏈!】

拜占庭將軍問題與區塊鏈共識演算法PBFT

兩軍問題中通道是不可靠的,並且其中沒有叛徒之說。解決方式 tcp的三次握手可以提供相對可靠地通道通訊。目前,區塊鏈採用的共識機制主要基於工作量證明 pow 權益證明 pos 拜占庭協議 ba 等。各類共識機制在效率 安全性等方面有利有弊,目前區塊鏈協議的效率,特別是高速處理海量資料的能力是阻礙區塊鏈...

區塊鏈共識演算法 二 拜占庭容錯演算法 BFT

1.拜占庭將軍問題簡介 拜占庭將軍問題 byzantine generals problem 主要指分布式對等網路節點間的通訊容錯問題。2.bft簡介 bft byzantine fault tolerance 即拜占庭容錯,是分布式計算領域的容錯技術,拜占庭容錯 於拜占庭將軍問題。拜占庭將軍問題是...

拜占庭將軍問題

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