共識算法定義了一系列動作,通過這些動作,獨立代理在分布式系統(tǒng)的各個部分上(至少在大多數(shù)代理中)獲得了相同的觀點。例如,這可以由某個客戶端(不參與協(xié)商共識)確定,該客戶端可以從任何(或至少大多數(shù))協(xié)商共識參與者那里獲得關于系統(tǒng)協(xié)商共識狀態(tài)查詢的相同結果。
通常,共識算法用于解決以下問題:
· 領袖選舉(在所有共識參與者中選擇代理人,有權更新系統(tǒng)的全球狀態(tài))
· 原子交換(不能根據(jù)事件的內(nèi)部屬性確定其順序事件的確切順序)
· 狀態(tài)復制(維護所有或大多數(shù)代理共享的全局狀態(tài))
這是共識算法的三個主要用例是高度相關的。例如,狀態(tài)復制可以通過狀態(tài)更改的適當順序(即原子廣播)來解決,而適當?shù)念I導人選舉過程本身可能允許有序的原子廣播(但是,在沒有領導人選舉過程的情況下,有達成相同結果的共識)。
從歷史上看,共識算法起源于多處理器計算的研究;它們解決的是處理器可能出現(xiàn)故障(即變得無響應)時的全局狀態(tài)問題。在這些情況下通信是同步的,即受一些已知的時間上限。
后來,隨著電信和計算機網(wǎng)絡的發(fā)展,出現(xiàn)了另外兩個問題:未知的通信延遲和對手的存在。前者導致了部分新的研究同步和異步共識算法和創(chuàng)建算法可以容忍任意代理行為(拜占庭行為)——即所謂的拜占庭容錯算法(或BFT共識)。
隨著互聯(lián)網(wǎng)的廣泛應用,對手的問題變得更加嚴重。如果在多處理器環(huán)境或電信基礎設施中可以識別每個代理,那么在Internet的許多情況下就不能這樣做。因此,出現(xiàn)了一種新的公共(或無許可)共識,共識算法必須成為一種協(xié)議,其中嵌入了識別和排除拜占庭式代理的規(guī)則和程序——就像一些附帶機制降低了此類代理進一步參與協(xié)議的經(jīng)濟能力一樣。這種制度以POW 和POS的名義引起了公眾的注意。我們將以經(jīng)濟激勵(BFT- ei)命名這些協(xié)議。在許多情況下,異步性和無許可性要求犧牲其他共識品質(zhì),比如決定論或適用于領導人選舉場景的能力。
在此基礎上,可以根據(jù)不同的準則對共識算法進行分類。
1. 共識的主題:原子廣播、領袖選舉、國家復制(或者,另一種選擇,基于領袖和無領袖算法)
2. 容錯形式:無容錯、非任意容錯和拜占庭容錯(BFT)
3. 可以達成共識的假設有:同步、參與方同步、異步
4. 公開和非公開參與的協(xié)議:許可vs不許可,或公開vs私人。
5. 內(nèi)部經(jīng)濟激勵: BFT-EI
6. 協(xié)商共識的確定性品質(zhì), 即實現(xiàn)終結性的能力: 具有終結性和非確定性共識的共識算法。
這些類可以組合在一些自然的組中,比如開放的參與會導致不確定性的共識屬性(因為我們不能在給定的時間點枚舉所有共識的參與者),也就是缺乏終結性,它將是無領導的。這種共識的一個典型例子是比特幣交易。
我們定義了以下典型的共識屬性組合:
· PoW:無權限同步非確定性無領導BFT-EI。
· POS: 基于BFT-EI的不允許部分同步確定性領導。
· BFT(狹義的): 允許的、確定性的BFT。可以有不同的同步性假設,可以是領導者,也可以是非領導者。
· DAG:無權限異步、非確定性領導、無BFT容忍度。
· 其他混合的類型。
許多現(xiàn)實世界中的共識算法應用, 比如在現(xiàn)代實驗區(qū)塊鏈中發(fā)現(xiàn)的應用, 往往會利用一組不同的共識機制,用于領導人選舉的機制 (通常是基于 bft 協(xié)議的機制, 但有時甚至是 pow), 而其他的機制對于原子廣播 (pos) 和另一個實現(xiàn)確定性的是狀態(tài)復制-通常是 bft 類型的 “小工具” 的形式。
共識算法本身不需要特定的數(shù)據(jù)結構;它們都是關于代理行為和網(wǎng)絡通信的。然而,在比特幣(這是第一個基于公共共識的應用)發(fā)明之后,似乎需要全球狀態(tài)的系統(tǒng)并利用數(shù)據(jù)結構上的一些最佳實踐來驗證,比如具有加密增強功能的日志類賬——所謂的區(qū)塊鏈或者更通用的有向無環(huán)圖(DAG),通常由我們上面分類的#4組共識使用。