一、N>=3f+1就可以解決拜占庭問題
首先。我們先來理解拜占庭將軍問題能夠被解決的客觀限制N>=3f+1。也就是說,如果拜占庭將軍問題的節點數為N<=3f,那麼拜占庭將軍問題將無法解決,我們以3個節點為例來推導:
在左邊的場景中,下屬P3有故障;對於右邊的情況,司令P1有故障。我們可以看到兩個回合的資訊交換:司令傳送的值和兩個中尉相互傳送的值。數字字首表面訊息來源,並且給出不同的回合數。
在左邊的場景中,P2接受到了2個不同的值(v,u),但是不知道那個是司令傳來的。因此無法做出決策。
在右邊的場景中,司令有錯誤傳送了2個不同的值。P3也收到了2個不同的值,因此P3也無法判斷哪一個是正確的。
當解決拜占庭將軍問題的節點數量為N>=3f+1時,我們再來推導一下上述的問題,以N>=4,f=1的場景為例:
當出現左圖的場景時,majority函式(最多返回為最終結果)可以取最多數值作為下屬的最終決定值。因此下屬可以就決策達成一致:
l P2 決定 majority(v,u,v)=v
l P4決定majority(v,v,w)=v
在右圖的場景中,司令是錯的,但是正確的3個下屬節點可以達成一致:
P2, P3, P4決定majority(u,v,w)= ⊥(表示沒有佔多數的值存在)
這個推導由Lamport教授在1982年時完成,看到這裡我們很容易理解,從邏輯的角度解決拜占庭問題的方法其實非常簡單,我們只需要決策的節點數量為 N>=3f+1即可。
但是,為什麼拜占庭系統在這麼多年內中沒有被廣泛的使用和認知呢?
儘管拜占庭系統可以就人類信任決策的問題達成最終一致共識,有很大的商業應用場景,但是當我們想應用時,卻發現系統是非常低效的。我們知道每一輪決策的代價是訊息傳遞的輪數以指數級的方式增長,因此使用這個辦法解決拜占庭問題,因為效率的影響也無法在實際業務中得到應用。
二、拜占庭系統的技術演進
PBFT拜占庭系統
隨著時間的發展,效率問題一直是拜占庭系統技術演進的主要方向,Castro 和Liskov 在1999 年提出了Practical Byzantine Fault Tolerance(PBFT)系統,首次將拜占庭協議的複雜度從指數級降低到多項式級別,使拜占庭協議在分散式系統中應用成為可能。
PBFT 的一致性協議如圖所示,每一個客戶端的請求需要5 個階段才能完成。其透過採用兩次兩兩互動的方式,在伺服器達成一致之後再執行客戶端的請求。由於客戶端不能從伺服器端獲得任何伺服器執行狀態的資訊,因此PBFT 協議中主節點是否發生錯誤只能由伺服器監測。如果伺服器在一段時間內都不能完成客戶端的請求,則會觸發檢視更換協議(即節點切換)。
PBFT 採取的設計思路是將所有的工作都放在伺服器端進行,例如達成一致性、監測拜占庭主節點等等。因此它的問題就是,儘管複雜度相對於Lamport模型已經降低了,但是一致性協議設計依然很複雜,其中有兩個階段需要伺服器之間的兩兩互動,資料的處理量大,而且計算複雜。
HQ拜占庭系統
於是Cowling等人在2006年HQ來改進PBET,下圖為HQ模型的原理圖:
我們會看到在HQ協議通訊模型中,取消了主節點選擇的問題。客戶端向所有的節點發出請求,並在Write 1階段中檢查是否有3f+1個節點(最少決策節點數)中的2f+1,有共同的返回值。如果有,那麼就判定伺服器處於相同的狀態中。
在HQ模型中,將請求分成2個階段。第一個階段,當客戶端傳送請求的同時收集伺服器的狀態,如果有2f+1臺以上的伺服器處於相同狀態,並能夠執行客戶端的請求,那麼客戶端才執行第二階段的操作,暨傳送指令,讓伺服器執行的客戶端請求。否則說明請求遇到競爭,將執行PBFT的流程。
所以HQ協議通訊模型並沒有改變PBFT的架構,只是當客戶端傳送請求,並且沒有競爭的情況出現時,這個模式才有效。
基於Speculation的拜占庭系統
Dahlin 等人在2007 年提出了Zyzzyva 和Zyzzyva5 協議,將Speculation 技術引入了拜占庭協議。因為Zyzzyva協議客戶端不需要等待伺服器互動確認,所以極大程度的提高了拜占庭系統的效能。
其主要思想是:伺服器絕大部分時間處於正常的狀態,因此不用每一個請求都在達成一致性之後再執行,只需要在錯誤發生之後再達成一致性即可。
與傳統的協議相比,Speculation 機制的不同主要在於一致性協議部分。下圖為Speculation 的執行流程,伺服器收到客戶端的請求之後,並不像傳統的協議一樣首先進行代價較大的兩兩互動,而是直接執行了客戶端的請求。
只要客戶端接收到所有伺服器反饋的資訊(執行結果、伺服器狀態、執行歷史等),並且這些資訊是一致的,客戶端認為結果正確,並返回給上層應用;否則,客戶端在接收到 2f+1 伺服器反饋的資訊後,就執行一個序號確認的階段,告訴至少f+1 臺非拜占庭伺服器,已經有至少f+1 臺非拜占庭伺服器執行了請求。
總的來說,在Speculation 中,如果伺服器執行結果是一致的,那麼客戶端採用這個結果。如果不一致,那麼客戶端丟棄這個結果,並且反饋給伺服器觸發檢視更換協議切換主節點。這樣雖然可能暫時導致系統不一致,但是並不會影響非拜占庭的客戶端請求的執行。
如果客戶端是拜占庭的,那麼即使系統結果不一致也沒有關係。如果客戶端是非拜占庭的,發現系統不一致之後,一定會觸發檢視更換協議將系統重新調整,從而確保系統的一致性狀態。
Speculation技術單一請求所需的階段數較少,從理論上來說達到了最優,降低了系統的響應延時。除了基於客戶端的Speculation技術以外,2009年時也提出了基於客戶端的Specutaion技術,其本質是改進型的Zyzzyva 演算法,核心思想是客戶端不需要收到所有的服務端返回再執行操作,客戶端再收到的第一個伺服器請求後,就執行響應。當系統沒有拜占庭節點時,這極大的最佳化了系統的效率,但是當拜占庭節點出現時,大規模的部署中依然存在效率問題。所以儘管有廣闊的商業前景,拜占庭系統一直沒有受到主流媒體的追捧。
三、區塊鏈對拜占庭將軍問題的最佳化
我們知道,區塊鏈的很大創新就是進一步最佳化了解決大規模節點部署時的拜占庭系統的效率。
拜占庭將軍問題的難點在於,任意時間,一個節點都要考慮面對多個提案進行決策的問題。
區塊鏈最佳化了這個模型,引入了POW機制,在同一時刻透過競爭出塊的方式,只允許一個節點發出請求。同時透過非對稱加密技術,保證了訊息接受方可以確認傳送方的身份,系統也變成了可信的分散式網路。
此外,與以往的純粹演算法演進來最佳化拜占庭問題的方式不同。區塊鏈同時引入了經濟模型,讓拜占庭的犯錯成本為負數。我們知道在安全領域的一個基本觀點是,攻擊的收益必須大於成本。
在區塊鏈中,下一個節點由誰作為將軍,由POW工作量證明來決定。如果要做叛徒,攻擊整個網路,需要付出相應的成本,而這個成本在比特幣的PoW(Proof of Work)工作量共識機制下,就是要掌握整個網路50%以上的算力。換句話說,有50%以上的叛徒才行,這是比PBFT高得多的容錯率。從經濟學的角度來說,如果真的掌握那麼大的算力的話,用這些算力維護網路(誠實地挖礦)獲得的收益其實會高於破壞網路。
更多區塊鏈資訊:http://www.qukuaiwang.com.cn/news