兩軍問題和拜占庭將軍問題的區塊鏈解讀(二)

2021-09-10 08:31:31 字數 2540 閱讀 2184

**:

拜占庭將軍問題是區塊鏈技術中另乙個經常被提到的模型。本篇將盡量用通俗的語言解釋拜占庭將軍問題的本質以及背後的經典演算法,不當之處請指正。

與兩軍問題一樣,拜占庭將軍問題也僅僅是提出了問題,並沒有提出解決這個問題的方案。

首先,我們需要了解什麼是拜占庭將軍問題:

在中世紀,拜占庭帝國的幾位將軍各自帶兵共同圍困一座城市。這座城市的防守非常堅固,只有他們一起進攻才能攻下來。也就是說,他們要麼一起進攻,要麼一起撤退,否則都是災難性後果。但是因為各位將軍分處城市不同方向,沒法坐在一起討論,只能通過信使告訴彼此自己投票進攻還是撤退。於是,每位將軍都是根據得到的所有別的將軍的投票,做出自己進攻還是撤退的決定。

如果所有將軍都是忠誠的,當然沒有問題,根據大多數將軍投票結果就好了。但是問題在於,將軍中可能有叛徒。假設9位將軍投票,4人投進攻,4人投撤退,剩下1人是叛徒,他選擇告訴進攻的4人他投進攻,告訴撤退的4人他投撤退,那麼結果就悲慘了。

問題的癥結在於:一群忠誠的將軍想要實現行動上的一致(一致撤退或者一致進攻),由於叛徒的存在,將軍們不知道如何達成共識,取得行動上的一致。

因此,非常有必要找到一種解決方案,以保證即使在有叛徒的情況下,各位忠誠的將軍可以在行動上取得一致。如果將軍們在有叛徒存在的情況下仍然在行動上達成了一致,我們就稱達到了「拜占庭容錯」。

以上為拜占庭將軍問題的簡單描述。拜占庭將軍問題的本質則是提出了如何在分布式系統中有節點被故意破壞的情況下達成共識的討論。

與兩軍問題不同,在研究拜占庭將軍問題的時候,我們不去考慮通訊兵是否會被截獲或者無法傳遞資訊等問題,即訊息傳遞的通道沒有問題。

但是現實中,往往會遇到因網路不暢、節點故意沉默等問題收不到資訊的情況,遇到這種情況,系統會預設節點收到了資訊,且收到的資訊統一是撤退(或者統一是進攻)。

需要強調的是,由於叛徒不受任何規則的約束,所以拜占庭將軍問題的目標是實現忠誠的將軍們在行動上取得一致,並不是所有的將軍在行動上取得一致。

但是,光靠一致就可以解決問題嗎?考慮一下,如果萬事俱備,客觀上每個忠誠的將軍只要進攻了就一定能夠勝利,但是卻因為叛徒的存在他們都一致沒有進攻;反之,條件不利,將軍們不應該進攻,但是卻因為叛徒的存在所有人都一致進攻了。

因此,對忠誠的將軍而言,光有一致性還是不夠解決問題的,還要提出乙個「正確性」要求。

需要注意的是,這裡的「正確性」並非指每個忠誠將軍給出的答案必須符合一定的正確標準,而是指雖然叛徒進行了干擾,忠誠的將軍所收到的問題答案仍然真實地反映了另一位忠誠將軍的意圖。因此,這個答案所對應的問題必須是值得斟酌的,並不是像1+1是否等於2這樣沒有任何爭議性的問題,而是像結合軍情來分析判斷是進攻還是撤退這樣的問題。對忠誠的將軍而言,由於每個人的判斷力和所處的環境不同,這類問題的答案有可能完全相同,也可能出現不盡相同的情況。

簡單來說,「正確」就是在叛徒的干擾下,每個忠誠的將軍所最終接受的另乙個忠誠將軍的答案都是相同的,並且這個答案與這位忠誠將軍的真實意圖完全一致。

反過來理解這個問題,我們就會知道,在拜占庭將軍問題中,什麼樣的將軍才算是叛徒:只有沒有表達自己真實意圖的將軍才是叛徒。

比如,如果將軍c給將軍a傳送的答案是進攻,給將軍b傳送的答案卻是撤退,那麼將軍c就沒有真實的表達自己的意圖,將軍c就是叛徒。還有,如果將軍c收到的答案是進攻,可他卻告訴別人他收到的的答案是撤退,那麼將軍c也沒有表達自己的真實意圖,將軍c也是叛徒。

還有一種情況,假如將軍c綜合了各種情況後認為應該進攻,可是他卻被敵人收買,做出了撤退的答案,並通知了其他將軍他的答案是撤退,並且將其他將軍的答案誠實地傳遞下去,那麼,這種情況下將軍c是叛徒嗎?答案是不是。因為他並沒有區分物件傳送答案,也沒有把其他將軍的答案篡改後再傳遞,所以將軍c並不是拜占庭將軍問題意義上的叛徒。

至此,我們可以將拜占庭將軍問題簡化成:所有忠誠的將軍都能夠讓別的將軍接收到自己的真實意圖,並最終一致行動。

與兩軍問題不同,在經典情形下,拜占庭將軍問題是有解的。2023年,miguel castro和barbaraliskov提出了實用拜占庭容錯演算法(pbft),能夠實現只要叛徒少於三分之一,忠誠的將軍們就一定能達成一致結果,實現拜占庭容錯。

採用pbft方法,本質上就是利用通訊次數換取信用。每個命令的執行都需要節點間兩兩互動去核驗訊息,通訊代價是非常高的。通常採用pbft演算法,節點間的通訊複雜度是節點數的平方級。

在pbft的基礎上,又出現了很多變種演算法,這些演算法往往都帶有一些額外的假設。例如:認為發起請求的客戶端一定是忠誠的,由客戶端去驗證節點是否忠誠;認為絕大部分時候將軍都是忠誠的,所以降低兩兩互動核驗訊息的次數;通過對節點進行分工,來提高整個系統的處理速度等。

對於不同型別的應用場景,有些假設是合理的,有些假設則是不合理的。例如,在類似位元幣的代幣轉賬系統中,不能認為客戶端是忠誠的,因為客戶端很可能會發起雙花交易。

那麼,區塊鏈技術是怎樣解決拜占庭將軍問題的呢?

區塊鏈解決拜占庭將軍問題的思路就是,如果要做叛徒,就付出相應的成本,而付出這個成本還不如誠實地維護這個系統利益來得大。以pow(proof of work)工作量共識機制為例,這個成本在pow機制下,就是要掌握整個網路50%以上的算力——換句話說,有50%以上的叛徒才行,這是比pbft高得多的容錯率。可是,如果真的掌握那麼大的算力的話,用這些算力維護網路獲得的收益其實會高於破壞網路。當然,pow機制也有缺陷,比如浪費了大量的算力以及產生這些算力的電、計算裝置等。

兩軍問題和拜占庭將軍問題的區塊鏈解讀(一)

說起區塊鏈,有兩個模型經常被提起,那就是兩軍問題和拜占庭將軍問題。對於這兩個模型,之前檢視了一些資料,但個人理解得仍然不是很透。儘管如此,本篇盡量用通俗的語言解釋一下這兩個模型,不當之處請指正。首先要明確,這兩個模型僅僅是用講故事的方式提出了問題,但是並沒有提出解決問題的方法。讓我們先來了解一下這兩...

區塊鏈 拜占庭將軍問題 BFT

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

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

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