分佈式一致性問題,區塊鏈裏體現就是共識問題。
共識機制就是在一個羣體中的個體經過某種方式達成一致性的一種機制,好比在一個團隊、或者一個公司裏的個體意見不一致時,就須要有一個領導,由領導來作決定,保證團隊達成共識。web
目前的共識算法,主要有基於算力的POW,基於股權的POS和基於投票的DPOS算法,以及著名的拜占庭容錯算法。算法
團隊裏的共識機制延伸到普通的分佈式系統裏面,就是系統須要有一個master,系統的全部決定都由master來達成共識,在分佈式系統裏面master的選舉其實就是基於某種共識機制達成共識。網絡
到了區塊鏈中,因爲區塊鏈是一種去中心化的分佈式系統,因此區塊鏈中是沒有相似於團隊裏的領導,以及分佈式系統中的master的角色,這樣就須要有某種共識機制,以便保證系統一致性。分佈式
實際上當節點之間的通訊網絡不可靠的狀況下,系統是沒法達成共識的,具體緣由請參考「兩軍問題"。
即便在網絡通訊可靠的狀況下,一個可擴展的分佈式系統的共識問題也是無解的。這個結論被稱爲」FLP不可能性原理「。通常的把故障(不響應)即信道不可靠的狀況稱爲」非拜占庭錯誤「,惡意響應(即系統被攻擊)稱爲」拜占庭錯誤「。函數
拜占庭將軍問題是一個共識問題: 首先由Leslie Lamport與另外兩人在1982年提出,被稱爲The Byzantine Generals Problem或者Byzantine Failure。核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引伸到計算領域,發展成了一種容錯理論。區塊鏈
論文地址:
The Byzantine Generals Problemspa
一羣將軍想要實現某一個目標(一致進攻或者一致撤退),可是單獨行動行不通,必須合做,達成共識;因爲叛徒的存在,將軍們不知道應該如何達到一致。日誌
拜占庭將軍問題中並不去考慮通訊兵是否會被截獲或沒法傳達信息等問題,即消息傳遞的信道絕無問。Lamport已經證實了在消息可能丟失的不可靠信道上試圖經過消息傳遞的方式達到一致性是不可能的。因此,在研究拜占庭將軍問題的時候,咱們已經假定了信道是沒有問題的,並在這個前提下,去作一致性和容錯性相關研究。blog
若是須要考慮信道是有問題的,這涉及到了另外一個兩軍問題,兩軍問題在經典情境下是不可解的,現代通訊系統中應用三次握手與TCP協議來處理此類問題,不過這也只是一種相對可靠的方式。遞歸
Lamport論文:
對於這個算法須要說明的是:
(1) 在第一輪將軍會把消息發送給全部的副官,第i個副官收到的記爲 Vi。如 1(這裏表明的是Attack)
(2) 在第二輪裏面,Li(即第i個副官)會懷疑將軍發來的消息Vi是對仍是錯,因而他會問其他的副官。這樣他就會獲得剩下的(n-2)個副官的值。 i從1到n-1,因此每一個副官都會獲得剩餘的n-2個副官手裏的Vi。在這一步驟裏,忠誠的副官j會直接將本身的 Vj發送給其它人。叛徒則會發假消息。
在n=7,m=2的時候 若是將軍是忠臣的話,那麼在第二輪忠誠的副官確實已經能夠判斷出要作的決定,由於他們會收到(1 1 1 0 0 )再加上將軍發來的1就是 1 1 1 1 0 0 可是這個算法是遞歸的全部必需要到第三輪。而且若是將軍是個叛徒的話,那麼第二輪有情形是作不出決定的。
這裏對進入第三輪的解釋是,如L1收到其它L2~L6發來的Vj, 可是他要懷疑準確性,好比L1會想L2發給本身是不是正確的呢?那麼就進入第三輪進行投票。
(3)在第三輪裏面,接着(2)中後面的問題。L1會依次詢問L3,4,5,6 ,問他們上一輪L2給他們發了什麼,而後L1會獲得在(2)中 L2->L3, L2->L4,L2->L5, L2->L6的值 這樣再結合本身的L2->L1的值,從這5個裏面用majority函數投出決定獲得L2發給本身的消息值。依次再進行L3,L4,L5,L6在第二輪中發給本身的消息的確認。
這樣L1就完成了第二輪的確認。以後L1再從第一步中將軍發給本身的vi和第二輪中肯定的5個值中投出本身的決定。
其他的L2,L3後續也進行一樣的步驟。
書面協議和口頭協議最大區別是,副官能夠叛變而且說謊,也就是中國人講的口說無憑。
如今咱們給消息加上將軍的簽名,必須經過簽名來驗證,就是爲了防止說謊。
在簽名算法中加了兩個條件:
這裏Lamport規定,每條消息只能夠複製,而後加上本身的姓名再發出去。
Lamport論文:
這裏借用一個類比(知乎[Devin Zeng]:
PBFT算法要求至少要4個參與者,一個被選舉爲總司令,3個師長。總統對總司令下達命令,大家向前行軍500千米,總司令就會給3個師長髮命令向前行軍500千米。3個軍長收到消息後會執行命令,並彙報結果。A師長說我在首都以東500千米,B師長說我在首都以東500千米,C師長說我在首都以東250千米。總司令總結3個師長的彙報,發現首都以東500千米佔多數(2票>1票),因此就會忽略C軍長的彙報結果,給總統說,好了,如今部隊是在首都以東500千米了。
client:請求(request)資源者
replica:副本,全部參與提供服務的節點
primary:承擔起提供服務主要職責的節點
backup:其餘副本,但相對於primary角色
view:處於存在primary-bakup場景中的相對穩定的關係,叫視圖。
若是primary出現故障,這種相對穩定的視圖關係就會轉變(transit),某個backup轉變爲primary。
client請求階段,客戶端請求資源。
預準備(pre-prepare):主節點向全部backup節點發送預準備消息,其中包括當前視圖編號,client請求以及請求摘要,簽名是否一致等。
準備(prepare):包括主節點在內的全部副本節點在收到準備消息以後,對消息的簽名是否正確,視圖編號是否一致,以及消息序號是否知足水線限制這三個條件進行驗證,若是驗證經過則把這個準備消息寫入消息日誌中。
確認(commit):每一個副本接受確認消息的條件是:1)簽名正確;2)消息的視圖編號與節點的當前視圖編號一致;3)消息的序號n知足水線條件,在h和H之間。一旦確認消息的接受條件知足了,則該副本節點將確認消息寫入消息日誌中。
回覆(reply):結果反饋。
關於拜占庭等問題的討論只是學術上極端狀況下的理論值,現實中的物理系統遠比這個要複雜,咱們付出必定的代價老是能作到必定程度的共識。