背景:
拜占庭將軍問題很多人可能聽過,但不知道具體是什么意思。那么究竟什么是拜占庭將軍問題呢? 本文從最通俗的故事講起,並對該問題進行抽象,並告訴大家拜占庭將軍問題為什么在區塊鏈領域作為一個重點研究問題。
什么是拜占庭將軍問題:
“拜占庭將軍問題”也被稱為“拜占庭容錯”。
拜占庭將軍問題是Leslie Lamport(2013年的圖靈講得住)用來為描述分布式系統一致性問題(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),使拜占庭協議在分布式系統中應用成為可能。
總結:共識算法的核心就是解決拜占庭將軍問題(分布式網絡一致性問題)。
REFERENCE
-
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).
- 《區塊鏈技術指南》鄒均,張海寧,唐屹,李磊 著
【時間倉促,如有錯誤,歡迎指正! || 歡迎留下您的評語! 大家一起探討、學習區塊鏈!】
【轉載請注明出處!http://www.cnblogs.com/X-knight/】