咱們知道,比特幣等區塊鏈是分佈式系統的一個子集,但它和傳統分佈式帳本是有差別的,那這些差別在於哪裏呢?爲何咱們說比特幣是一項重大創新?來自前Coinbase、a16z、高盛的區塊鏈工程師Preethi Kasireddy將在這篇文章中給出她的答案。web
如下爲譯文:算法
你知道分佈式系統是如何工做的嗎?數據庫
這多是一個很難學習的話題,主要是由於圍繞它的知識是很分散的…..安全
在自我學習分佈式計算這個課題以前,我屢次趴到了桌上,但通過屢次考驗和磨難,我終於準備好向您解釋分佈式系統的基礎知識。網絡
我還想討論區塊鏈技術對該領域的深遠影響。區塊鏈迫使工程師和科學家們從新審視並質疑分佈式計算中根深蒂固的範式。也許沒有其它技術可以比區塊鏈更快地促進這一研究領域的進展。架構
區塊鏈是一種新型的分佈式系統。它的出現始於比特幣,並今後在分佈式計算領域產生了持久的影響。所以,若是你想真正瞭解區塊鏈的工做原理,那麼掌握分佈式系統的原理是相當重要的。併發
不幸的是,不少關於分佈式計算的文獻,要麼是難以理解的,要麼分散在太多的學術論文當中。而讓問題變得更復雜的是,當前存在着數百種架構,而全部架構都知足不一樣的需求。所以,將其歸結爲一篇可理解的文章,足以稱得上是一件壯舉。異步
由於這個領域很廣,我不得不仔細選擇要覆蓋的內容。我還必須進行歸納,以掩蓋一些複雜性。請注意,個人目標不是讓你成爲該領域的專家。相反,我只是想讓你瞭解一些知識,開啓分佈式系統和共識基礎知識的旅程。分佈式
閱讀完這篇文章以後,您將更深刻地瞭解到如下這些內容:ide
分佈式系統是什麼?
分佈式系統的屬性;
在分佈式系統達成共識是什麼意思?
理解基礎共識算法(例如DLS和PBFT);
爲何中本聰共識是一項重大創新?
我但願你準備好了此次學習!
分佈式系統涉及了一組不一樣的進程(例如,計算機),將消息在彼此之間進行傳遞,並協調以實現共同的目標(即,解決計算問題)。
簡而言之,分佈式系統是一組共同實現統一目標的計算機。雖然這些進程是分開的,但系統對終端用戶而言只是一臺計算機。
正如我所提到的,分佈式系統存在着數百種架構。例如,單個計算機也能夠被視爲分佈式系統;中央控制單元、存儲器單元和輸入-輸出通道,是協做完成一個目標的單獨進程。
舉飛機的例子,它們的共同努力是讓你從A點到B點:
來源:https://www.weetech.de/en/news-info/tester-abc/distributed-system-1/在這篇文章中,咱們將關注分佈式系統,其中進程是指空間分離的計算機。
注意:我可能會把「節點」、「對等節點」、「計算機」或「組件」這些術語與「進程」互換使用。對於本文而言,它們都意味着相同的事情。一樣地,我可能會使用「網絡」和「系統」這兩個可互換的術語。
每一個分佈式系統都有一組特定的特徵,這些包括:
系統中的進程同時運行,這意味着同時會發生多個事件。換句話說,網絡中的每臺計算機與網絡中的其它計算機,會同時獨立地執行事件。
而這就須要協調。
Lamport, L (1978):分佈式系統中的時間、時鐘和事件排序
對於同時運行的計算機集合系統,咱們須要某種方法來肯定事件的順序。可是,在分佈式計算機系統中,有時不可能明確兩起事件中的哪起事件是先發生的,由於計算機在空間上是分開的。換句話說,沒有一個全局時鐘來肯定網絡中全部計算機發生的事件序列。
在《分佈式系統中事件的時間、時鐘和順序》這篇論文當中,Leslie Lamport展現瞭如何經過記住如下因素來推斷出一個事件是否發生在另外一個事件以前:
1)消息是在它們被收到以前發送的; 2)每臺計算機都有事件的序列;
經過肯定哪一個事件是發生在另外一個事件以前的,咱們能夠得到系統中事件的部分排序。
Lamport的論文描述了一種算法,該算法要求每臺計算機都可以「聽到」其它每臺計算機。
經過這種方式,事件就能夠基於這種偏序進行徹底排序。
可是,若是咱們徹底根據每臺計算機正在聽到的事件進行排序,則可能致使此順序與外部用戶(系統外部)所感知的順序會不一樣。所以,該論文提到的算法仍然可容許異常行爲。
最後,Lamport討論瞭如何經過使用正確同步的物理時鐘來防止這種異常狀況。
可是,等等,這裏有一個巨大的警告:協調獨立的時鐘,是一個很是複雜的計算機科學問題。即便你最初準確地設置了一堆時鐘,時鐘也會在一段時間後開始出現差別。這是由「時鐘漂移」問題形成的,這是一種時鐘以稍不一樣速率計算時間的現象。
本質上,這篇論文證實了,事件的時間和順序,是在空間上分離的分佈式計算機系統的基本障礙。
理解分佈式系統的一個關鍵部分,在於認可分佈式系統中的組件會存在故障。這就是它被稱爲「容錯分佈式計算」的緣由。
擁有一個沒有故障的系統是不可能的。真實的系統會存在不少可能的缺陷或弱點,不管這是一個進程崩潰,消息丟失、扭曲或重複,仍是網絡分區延遲或出現丟棄消息的狀況,甚至會出現進程徹底失控,並根據一些惡意計劃發送消息的狀況。
這些失敗大體可分爲三類:
崩潰失敗:組件在沒有警告的狀況下中止工做(例如,計算機崩潰);
遺漏:組件發送了消息,但其它節點並無收到消息(例如,消息丟失了)
拜占庭:組件的表現是任意的。在受控環境下(例如Google或Amazon數據中心)出現這類故障是可有可無的,其中可能沒有什麼惡意行爲。相反,這類錯誤會發生在所謂的「對抗性環境」下。基本上,當一組分散的獨立行動者充當網絡中的節點時,這些行動者可能選擇以「拜占庭」的方式行事。這意味着他們會惡意選擇更改,阻止或不發送消息。
考慮到這些問題,咱們的目標是設計一種協議,它可容許具備故障組件的系統,仍可實現共同目標,並提供有用的服務。
鑑於每一個系統都會有故障,咱們在構建分佈式系統時必須作出的核心假設是,即便其部件偏離了正常行爲,它也能繼續存活,不管是否因爲非惡意行爲(崩潰失敗或遺漏錯誤)仍是由於惡意行爲(即拜占庭故障)。
從廣義上講,製做分佈式系統時,需考慮兩種類型的模型:
1)簡單的容錯
在一個簡單的容錯系統中,咱們假設系統的全部部分都執行如下兩種操做之一:它們要麼徹底遵循協議,要麼失敗。這種類型的系統,應可以處理脫機或失敗的節點。但它沒必要擔憂節點表現出隨意或惡意行爲。
2)拜占庭容錯
簡單的容錯系統在不受控制的環境當中,並非頗有用。在一個去中心化的系統當中,節點是由獨立的參與者控制的,它們之間在開放的、無需許可的互聯網上進行通訊,咱們還須要爲那些選擇惡意或「拜占庭」行爲的節點進行設計。所以,在拜占庭容錯系統當中,咱們假設節點是能夠失敗或惡意的。
2b)BAR容錯
儘管大多數真實系統都被設計爲可以承受拜占庭式的故障,但一些專家認爲它過於籠統,並無考慮到「理性」故障(其中節點可能出於自身利益的考慮而出現誤差行爲)。換句話說,根據激勵的狀況,節點是能夠誠實的,也能夠是不誠實的。若是激勵措施足夠高,那麼即便是大多數節點也可能會作不誠實的事。
更正式地講,這被定義爲BAR模型,它同時考慮了拜占庭和理性故障問題。 BAR模型假設有三種類型的成員:
拜占庭 :拜占庭節點是惡意的,它們試圖搞砸你;
利他主義者:誠實的節點老是遵循協議。
理性節點:理性節點只有在他們認爲合適時纔會遵循協議。
如上面所述,分佈式系統中的計算機,經過一臺或多臺其餘計算機之間的「消息傳遞」進行通訊和協調。消息可以使用任何消息傳遞協議進行傳遞,不管是HTTP,RPC仍是爲特定實現構建的自定義協議。
有兩種類型的消息傳遞環境:
1)同步
在同步系統中,假設消息將在某個固定的已知時間內進行傳遞。
同步消息傳遞在概念上並無那麼複雜,由於用戶擁有一個保證:當他們發送消息時,接收組件將在特定時間範圍內得到它。這容許用戶使用固定的時間上限來建模他們的協議,該上限是消息到達那裏所需的時間。
可是,在真實的分佈式系統中,這種類型的環境並非那麼實用,由於計算機可能會崩潰或脫機,而且可能會丟失、複製、延遲或無序接收消息。 2)異步
在異步消息傳遞系統中,假設網絡可能無限延遲消息,複製消息或無序傳遞消息。換句話說,消息接收的時間長度,沒有設置固定的上限。
到目前爲止,咱們已經瞭解了分佈式系統的如下屬性:
進程的併發性;
缺少全局時鐘;
存在故障進程;
消息傳遞
接下來,咱們將專一理解在分佈式系統中實現「共識」意味着什麼。但首先,重申咱們以前提到的內容會是很是重要的:目前有數百種不一樣的用於分佈式計算的硬件和軟件架構。
其中最爲常見的形式被稱爲複製狀態機。
複製狀態機是一種肯定性狀態機,不少計算機會對其進行復制,但它是做爲單個狀態機運行的。這些計算機中的任何一臺均可能出現故障,但狀態機還是可運行的。
在複製狀態機中,若是交易有效,則一組輸入將致使系統狀態轉換到下一個狀態。一筆交易是在一個數據庫中進行的原子操做。這意味着操做要麼徹底完成,要麼根本不發生。在複製狀態機中維護的交易集被稱爲「交易日誌」。
從一個有效狀態轉換到下一個有效狀態的邏輯,被稱爲「狀態轉換邏輯」。
複製狀態機是一組分佈式計算機,它們都以相同的初始值開始。對於每一個狀態轉換,每一個進程決定下一個值。而達到」共識」,意味着全部計算機必須共同商定該值的輸出。
反過來,這在系統中的每臺計算機上都保持一致的交易日誌(即「實現共同目標」)。
複製狀態機必須不斷地將新交易接收到該日誌當中(即,「提供有用的服務」)。它必須這樣作,儘管存在如下這些因素:
有些計算機會出現故障;
網絡不可靠,消息可能會出現沒法傳遞、延遲或出現故障的現象;
沒有全局時鐘來幫助肯定事件的順序;
而這些,就是任何共識算法要去實現的基本目標。
若是算法知足如下條件,則咱們說該算法達成了共識:
協議:全部非故障節點決定相同的輸出值;
終止:全部非故障節點最終決定某些輸出值;
(注意:不一樣的算法具備上述條件的不一樣變化。例如,有些人將協議屬性劃分爲一致性和總體性。有些人則對有效性、完整性或效率會有概念,可是,沒有必要在這篇文章當中探討這樣的細微差異。)
從廣義上講,共識算法一般假設系統中有三種類型的參與者:
提議者(Proposers);
接受者(Acceptors);
學習者(Learners);
提議者一般也被稱爲領導者或協調者。接受者是監聽來自提議者的請求,並用值進行響應的進程。學習者是系統中的其它進程,它們學習決定的最終值。
一般,咱們能夠經過三個步驟定義共識算法:
第1步:選舉
進程選擇單個領導者來作出決策。
領導者提出下一個有效的輸出值。
第2步:投票
無端障進程會監聽領導者提出的值,對其進行驗證,並將其做爲下一個有效值。
第3步:決定
無端障進程必須就單個正確的輸出值達成共識。若是它收到知足某些標準閾值數量的相同投票,則進程將決定該值。
不然,步驟從新開始。
重要的是,每一個共識算法都會有不一樣:
術語(例如輪次、階段)
如何處理投票的進程;
如何肯定最終值的標準(例如,有效性條件);
儘管如此,若是咱們可以使用這個通用進程來構建一個算法,它可保證上面定義的通常條件,那咱們就有了一個可以達成共識的分佈式系統。
聽起來,很簡單,對嗎?
… 並非的。可是你很快就會了解到了!
回想一下,咱們如何描述同步系統和異步系統之間的區別:
同步環境是在固定時間範圍內傳遞消息的地方;
異步環境是消息的傳遞無保證的地方;
這種區別很重要。
在同步環境中達成共識是可能的,由於咱們可假設消息傳遞所需的最長時間。所以,在這種類型的系統中,咱們可容許系統中的不一樣節點輪流提出新的交易,輪詢多數投票,若是在最長時限內未提供提議,則跳過任何節點。
但如前所述,假設咱們在同步環境中操做,在受控環境(其消息延遲可預測)以外進行是不實際的,例如具備同步原子鐘的數據中心。
實際上,大多數環境不容許咱們進行同步假設,因此咱們必須爲異步環境而進行設計。
若是咱們不能在異步環境中假設最大的消息傳遞時間,那麼實現終止會困可貴多。請記住,達成共識必須知足的條件之一是「終止」,這意味着每一個非故障節點必須決定某些輸出值。
這被稱爲「FLP不可能結果」。它是如何獲得這個名字的呢?好吧,很高興你能問這個問題!
研究人員Fischer, Lynch和Paterson在1985年撰寫的《在一個錯誤進程中不可能達成分佈式共識》這一論文中提到,即便只是一個錯誤的進程,也沒法在肯定性異步進程中達成共識。
基本上,因爲進程可能在不可預測的時間點失敗,所以它們也可能在阻止達成共識的恰當時機失敗。
這個結果對分佈式計算領域而言是一個巨大的頭疼點。儘管如此,科學家們仍是在繼續努力尋找繞過FLP不可能的方法。
在較高的層面上,有兩種方法能夠避免FLP不可能:
使用同步假設;
使用非肯定論;
如今,讓咱們深刻了解這兩種方法。
好吧,我知道你在想什麼:這到底意味着什麼?
讓咱們從新審視咱們的不可能結果。這裏有考慮它的另外一種方式:FLP不可能結果基本上代表,若是咱們不能在系統中取得進展,那麼咱們就沒法達成共識。換句話說,若是異步傳遞消息,則沒法保證終止。回想一下,終止是一個必需條件,這意味着每一個非故障節點最終必須決定一些輸出值。
可是,若是咱們不知道異步網絡什麼時候會傳遞消息,咱們如何才能保證每一個非故障進程都能決定一個值?
要明確的是,這一發現並未代表共識沒法實現,相反,因爲不一樣步,在固定的時間內沒法達成共識。說共識是「不可能的」,只是意味着共識「並不是老是可行的」,這是一個微妙但相當重要的細節。
避免這種狀況的一種方法是使用超時設定。若是在肯定下一個值沒有進展,咱們會等待一個時間段,而後再從新開始步驟。
正如咱們即將看到的那樣,像Paxos和Raft這些共識算法就是這樣的。
Paxos算法的提出是在20世紀90年代,這也是第一個真實可用的容錯共識算法。它是首個被普遍採用的共識算法,並曾被谷歌和亞馬遜等全球互聯網公司用於構建分佈式服務。
Paxos的工做方式以下:
階段1:準備請求
提議者選擇新的提案版本號 (n) ,並向接受者發送「準備請求」。
若是接受者收到準備請求(「prepare,」 n),其n大於他們已經回覆的任何準備請求,接受者發出 (「ack,」 n, n’, v’) 或(「ack,」 n, ^ , ^)。
接受者以承諾迴應,表示再也不接受編號小於n的任何提案。
接受者建議他們已接受的最高數提案的值 (v)(若是有的話),不然,他們會以^迴應;
階段2:接受請求
若是提議者收到來自大多數接受者的響應,那麼它能夠發出一個接受請求(「accept,」 n, v),其數量爲n,值爲v。
n是準備請求中出現的數字。
v是響應中編號最高的提議值。
若是接受者收到一個接受請求 (「accept,」 n, v),它會接受該提議,除非它經響應了一個數字大於n的準備請求。
階段3:學習階段
每當接受者接受提議時,它會響應全部學習者 (「accept,」 n, v)
學習者從大多數接受者那裏接收 (「accept,」 n, v) ,決定v,並向全部其餘學習者發送(「decide,」 v) ;
學習者接受 (「decide,」 v)並決定v;
來源: https://www.myassignmenthelp.net/paxos-algorithm-assignment-help嗯!困惑了嗎?我知道這裏有不少信息須要去消化。可是,等等……還有更多的信息!
咱們如今知道,每一個分佈式系統都是有故障的。在Paxos算法中,若是提議者失敗(例如,由於存在遺漏錯誤),則可延遲決策。 Paxos經過從第1階段的新版本號開始處理此問題,即便以前的嘗試從未結束。
我不會詳細介紹,但在這種狀況下,恢復正常運行的進程是很是複雜的。
Paxos難以理解的主要緣由,是它的不少實現細節都留給了讀者:例如咱們如何知道提議者何時失敗?咱們是否使用同步時鐘來設置超時時間,來決定提議者什麼時候失敗?等等。
Paxos在領導者選舉,故障檢測和日誌管理等內容是模糊或徹底不明確的。
這種設計選擇最終成爲Paxos最大的缺點之一,它不只難以理解,並且也很難實現。反過來,這使得分佈式系統領域也難以駕馭。
到目前爲止,你可能想知道同步假設的來源。
在Paxos中,雖然算法中沒有明確的超時,但在實際實現時,在一些超時時間以後選擇一個新的提議者是實現終止所必須的。不然,咱們就沒法保證接收者會輸出下一個值,系統可能會所以中止運行。
2013年,Ongaro和Ousterhout發佈了一種名爲Raft的複製狀態機共識算法,其核心目標是可理解性(與Paxos的最大不一樣之處)
咱們從Raft算法學到的一個重要新事物,是使用共享超時的概念來處理終止問題。在Raft中,若是你崩潰了並從新啓動,你須要等待至少一個超時時間,才能讓本身被宣佈爲領導者,並保證你取得進步。
但等等…拜占庭環境呢?
雖然傳統的共識算法(例如Paxos和Raft)可以使用某種程度的同步假設(即超時)在異步環境中發展,但它們不是拜占庭容錯的。它們只是崩潰容錯的。
崩潰故障是較容易處理的,由於咱們能夠將進程建模爲工做或崩潰 (0或1),進程不能惡意行事或撒謊。所以,在崩潰容錯系統中,分佈式系統是可構建的,其中簡單的多數參與者就足以達成共識。
而在開放和去中心化的(例如公鏈)系統中,用戶沒法控制網絡中的節點。相反,每一個節點都會針對其各自的目標作出決策,這可能與其餘節點的目標衝突。
在拜占庭系統中,節點具備不一樣的激勵,它們能夠撒謊、協調或任意行動,你不能假設簡單的多數節點就可以達成共識。一半或更多的誠實節點是可相互協調和欺騙的。
然而,Raft並非爲了容忍這種行爲而設計的。例如,若是當選的領導者是拜占庭,而且與其餘節點保持強大的網絡鏈接,則可能會危及系統。 Raft和Paxos是簡單的容錯,但不是拜占庭容錯。
試圖創建一個可處理衝突信息進程的可靠計算機系統,被稱爲「拜占庭將軍問題」。拜占庭容錯協議應該可以實現其共同目標,即便是遭受來自節點的惡意行爲。
Leslie Lamport,Robert Shostak和Marshall Pease撰寫的《拜占庭將軍問題》論文,提供瞭解決拜占庭將軍問題的第一個證實:它代表具備x個拜占庭節點的系統,必須至少有(3x + 1)個總節點,才能達到共識。
緣由以下:
若是x節點出現故障,則系統須要與(n-x)節點協調後才能正常運行(由於x節點可能有故障(拜占庭)而且沒有響應)。可是,咱們必須爲不響應的可能沒有錯誤的X節點作準備,它也多是作出迴應的X節點。若是咱們但願非故障節點的數量超過故障節點的數量,咱們至少須要(n-x-x)> x,所以,n> 3x + 1是最佳的。
可是,該論文中演示的算法僅適用於同步環境。這不是一個好消息!看起來,咱們只能獲得一個或另外一個(拜占庭vs異步),對嗎?
但爲何不包括兩個呢?
簡而言之,創建一個可以承受異步環境和拜占庭環境的共識算法……好吧,這就像創造奇蹟同樣。
像Paxos和Raft這樣的算法,是衆所周知且被普遍使用的。但也有不少學術工做正在嘗試研究拜占庭+異步的共識算法。
因此係上你的安全帶……
咱們將要實地考察理論學術論文的領域。
你應該感到興奮!還記得咱們以前討論過的「創造奇蹟」嗎?
咱們將查看兩種算法(DLS和PBFT),這些算法要比以往任什麼時候候都更接近於打破拜占庭+異步的障礙。
由Dwork,Lynch和Stockmeyer共同撰寫的論文《部分同步存在下的共識》引入了拜占庭容錯共識的一項重大進步:它定義瞭如何在一個「部分同步系統」中達成共識,該算法也因三位做者的名字而被稱爲「DLS」算法。
你可能還記得,在同步系統中,消息從一個處理者發送到另外一個處理者所需的時間有一個已知的固定上限。在異步系統中,則不存在固定的上限。
而部分同步,則位於同步系統和異步系統之間。
該論文解釋了部分同步假設的兩個版本:
假設消息傳遞的長短存在固定邊界。但它們不是先驗已知的。不管實際的界限如何,目標都是達成共識。
假設消息傳遞的上限是已知的,但它們只能保證在某個未知時間開始(也稱爲「全球標準化時間」,GST)。目標是設計一個可以達成共識的系統,不管什麼時候發生。
如下是DLS算法的工做原理:
一系列round分爲「嘗試」和「鎖定釋放」階段。
每一輪都有一個提議者,並從每一個進程開始,傳達他們認爲正確的值。
若是至少有(N − x)個進程傳達了一個值,則提議者「提出」該值。
當進程從提議者處接收建議值時,它必須鎖定該值,而後廣播該信息。
若是提議者從x + 1進程接收到他們鎖定某個值的消息,則將其做爲最終值提交。
DLS是一項重大技術突破,由於它創造了一種新的網絡假設類型,即部分同步,其還證實了這種假設的共識是可能的。DLS論文中另外一個必要的內容,是將拜占庭和異步設置達成共識的問題分爲兩個方面:安全性和活躍性。
這是咱們前面討論過的「協議」屬性的另外一個術語,其中全部非故障進程都對同一輸出達成一致。若是咱們可以保證安全性,則咱們可以保證整個系統保持同步。咱們但願全部節點贊成交易日誌的總順序,儘管會存在失敗和惡意行爲者的干擾。而違反安全性,意味着咱們最終會獲得兩個或更多有效的交易日誌。
這是咱們早期討論的「終止」屬性的另外一個術語,其中每一個非故障節點最終決定某些輸出值。在區塊鏈設置當中,活躍性意味着區塊鏈經過添加有效新區塊而不斷增加。活躍性是很重要的,由於它是網絡繼續有用的惟一方式,不然,網絡就會停滯不前。
正如「FLP不可能」告訴咱們的,在徹底異步的系統中是沒法達成共識的。而 DLS論文認爲,爲實現活躍條件而作出部分同步假設,足以克服FLP不可能性。
所以,這篇論文證實了算法不須要使用任何同步假設來實現安全條件。
很明確,對吧?若是不是,不要擔憂。讓咱們深刻探討這個概念:
請記住,若是節點沒有決定某個輸出值,系統就會暫停。所以,若是咱們作出一些同步假設(即超時),以保證終止,而且其中一個會失敗,那麼這也會使系統中止。
可是,若是咱們設計一個算法,其中咱們假設了超時(以保證安全性),而若是同步假設失敗,則會帶來致使兩個有效交易日誌的風險。
這比前一種選擇會危險得多。若是服務損壞(即沒有安全性),則沒有必要提供有用的服務(即活躍性)。
基本上,擁有兩個不一樣的區塊鏈,會比整個區塊鏈中止會更糟。
分佈式系統老是須要權衡利弊的,若是你想克服限制(例如FLP不可能),你必須在其它地方作出犧牲。在這種狀況下,將關注點分解爲安全性和活躍性是很是好的。它容許咱們構建一個在異步設置中安全,但仍須要某種形式超時來保持生成新值的系統。
儘管DLS論文提供了全部內容,但DLS算法從未真正被普遍實施,或用於真實世界的拜占庭式設置。這多是因爲DLS算法的核心假設之一,是使用同步處理器時鐘(以便具備共同的時間概念)。實際上,同步時鐘容易受到大量攻擊,而且它在拜占庭容錯設置中並非很好。
另外一種由Miguel Castro和Barbara Liskov於1999年發表的拜占庭容錯算法,被稱爲「實用拜占庭容錯」(PBFT)。對於展現拜占庭行爲的系統而言,它被認爲是一種更爲「實用」的算法。
從這個意義上來講,「實用」意味着它能夠在互聯網等異步環境中運行,此外它也進行了一些優化,使其較之前的共識算法要更快。該論文中提到,之前的算法雖然被證實是「理論上可行的」,但它們要麼太慢,沒法被使用,要麼是爲了安全性而作了假定同步。
正如咱們已經解釋的那樣,在異步設置中,這多是很是危險的。
簡而言之,PBFT算法代表,假設(n-1)/ 3 個節點出現了故障,它能夠提供安全性和活躍性。正如咱們以前討論的那樣,這是咱們須要容忍拜占庭故障的最小節點數。所以,該算法的抵抗性是最理想的。
不管有多少節點出現故障,該算法都可以提供安全性。換句話說,它沒有爲安全性而假設同步。然而,該算法確實依賴於同步性來實現活躍:
最多的狀況下,(n-1)/ 3 個節點可出現故障,而且消息延遲的增加速度不會超出某個時間限制。
所以,PBFT經過使用同步假設來保證活躍性,從而規避了FLP不可能性。
該算法經過一系列「view」,其中每一個view都有一個「主要」節點(即領導者),其他view都是「備份」節點。如下是有關PBFT工做方式的逐個步驟:
在客戶端上發生了一筆新的交易,並向主要節點廣播;
主要節點將它複製到全部的備份節點;
備份節點執行交易,並向客戶端發送回覆;
客戶端但願從備份節點處得到x + 1個與結果相同的回覆。這是最終結果,且狀態轉變發生了。
若是領導者沒有發生錯誤,協議會工做得很好,然而,檢測不良主要節點和從新選擇新主要節點(稱爲view變化)的過程是很是低效的。例如,爲了達成共識,PBFT需二次數量的消息交換,這意味着每臺計算機都必須與網絡中的每臺其餘計算機進行通訊。
(注:完整解釋PBFT算法需另起一篇文章,這裏不會詳細解釋。)
雖然PBFT是對之前算法的改進,但對於存在大量參與者的真實世界應用(例如公鏈)而言,它的擴展性是不夠的。可是,嘿,至少在涉及故障檢測和領導者選舉(與Paxos不一樣)方面,該算法會顯得更明確一些。
認可PBFT算法的貢獻是重要的,它結合了重要的革命思想,而新的共識協議(特別是後區塊鏈世界)可從中學習和進行改進。
例如,Tendermint是一種受PBFT影響很大的新共識算法。在Tendermint的「驗證」階段,其使用了兩個投票步驟(和PBFT同樣)來決定最終值。與PBFT算法的主要區別在於,Tendermint的設計,會更加實用。
例如,Tendermint每輪都會輪換新的領導者。若是當前輪次的領導者在一段時間內沒有響應,其會跳過領導者,而且算法會簡單地移動到帶有新領導者的下一輪。這實際上比每次須要進行view更改和選擇新領導者時使用點對點鏈接更有意義。
正如你從上面瞭解到的,大多數拜占庭容錯共識協議,最終使用某種形式的同步假設來克服FLP不可能性。然而,還有另外一種方法能夠克服FLP不可能性,即:非肯定論。
正如咱們剛剛瞭解到的那樣,在傳統的共識中,f(x)被定義爲提議者和一羣接受者必須所有協調和通訊,以決定下一個值。
這太複雜了,由於它須要知道網絡中的每一個節點,以及每一個節點與其它節點的通訊(即,二次通訊開銷)。簡而言之,它不能很好地擴展,而且不能在開放、無需許可的系統中工做(其中任何人均可以隨時加入和離開網絡)。
而中本聰共識的聰明之處,在於機率性地完成了上述的過程。相比每一個節點都贊成一個值,f(x) 是使全部節點都贊成值是正確的可能性。
等等,這意味着什麼?
拜占庭容錯
相比選舉一個領導者,而後與全部節點協調,而是根據哪一個節點可以最快解決計算難題來解決共識。比特幣區塊鏈中的每一個區塊,都由解決這個難題的節點添加。擁有最多累積工做量的鏈(即累積難度)便是標準鏈。最長的鏈,不只可做爲區塊序列的證實,並且能夠證實它來自最大的CPU功率池。所以,只要大部分CPU功率由誠實節點控制,它們將繼續產生最長鏈,並超過攻擊者。
區塊獎勵
中本聰共識,經過假設節點爲爭奪下一個區塊,會擴展計算投入的方式而工做。該算法的聰明之處,在於經濟上激勵節點重複執行這種計算,以獲取隨機得到區塊獎勵的機會。
抵抗女巫(Sybil)攻擊
解決這個難題所需的工做量證實,使得協議自己具備抵抗女巫攻擊的特性。它不須要PKI或任何其餘花哨的身份驗證方案。
對等gossip
中本聰共識的主要貢獻,是使用了gossip協議,它更適合於沒法假設非故障節點間通訊的對等設置。相反,咱們假設節點僅鏈接到其它節點的子集。而後,咱們使用對等協議,其中消息在節點之間互相傳播。
在異步環境中,並非「技術」安全的
在中本聰共識中,安全保障是機率性的,咱們會不斷增加最長鏈,而每一個新區塊都會下降惡意節點嘗試構建另外一個有效鏈的可能性。
所以,中本聰共識在技術上並不保證異步設置的安全性。讓咱們花點時間瞭解下緣由。
對於在異步設置中實現安全性條件的系統,咱們應該可以在異步網絡條件下維護一致的交易日誌。考慮它的另外一種方式,是節點可隨時脫機而後再返回在線狀態,並使用區塊鏈的初始狀態來肯定最新的正確狀態(而無論網絡情況如何)。任何誠實節點均可以查詢過去的任意狀態,而且惡意節點不能提供誠實節點認爲是真實的欺詐性信息。
在本文討論的前幾種算法中,這是可能的,由於咱們肯定性地在每一步完成一個值。只要咱們終止每一個值,咱們就能夠知道過去的狀態。然而,比特幣在「技術上」不是異步安全的,其緣由是有可能存在一個網絡分區,其中攻擊者具備足夠強大的算力來建立一條比誠實鏈更快的替代鏈。在這個替代鏈上,攻擊者可嘗試改變他本身的一筆交易來收回他所花的錢。
不能否認的是,這就要求攻擊者得到大量的算力,而這須要大量的資金。
從本質上講,比特幣區塊鏈的不可更改性來源於這樣一個事實:即大多數礦工實際上並不想採用替代鏈。這是由於,要掌握足夠的算力以使其他礦工採用替代鏈是很困難的。換句話說,成功建立替代鏈的可能性是很是低的,它幾乎能夠忽略不計。
出於實際目的,中本聰共識是拜占庭容錯的。但它顯然沒有達成共識研究人員傳統上所假設的共識。所以,它最初被視爲徹底脫離拜占庭容錯世界。
感謝你,中本聰!
根據設計,中本聰共識可讓任意數量的節點以開放式的方式參與系統,並且沒有人必需要知道完整的參與者集。這一突破的重要性不容小覷!
它比以往的共識算法要更簡單,它消除了之前共識算法在點對點鏈接、領導者選舉、二次通訊開銷等方面的複雜性。你只需在任何計算機上啓動比特幣協議軟件,並開始挖礦任務。
這使其可在真實環境中輕鬆部署,它確實是比PBFT更「實用」的共識算法。
如今你應該對分佈式系統共識算法的簡要基礎知識有所瞭解了。對於分佈式計算而言,這是一個漫長而曲折的研究和首創性之旅。我但願這篇文章可以有助於你對這個領域有更多的瞭解。
中本聰共識是一項真正的創新,它讓研究人員、科學家、開發者和工程師在共識協議研究中不斷開天闢地。
還有一個全新的協議系列正在不斷開發中,嗯,它就是權益證實(Proof-of-stake),做者在接下來的文章中會談到,敬請關注 ;)
注:爲了簡單目的,做者跳過了不少重要的論文和算法。例如Ben Orr的Common Coin也使用了機率方法,但它沒有最佳的抵抗性。其它算法如哈希現金(Hash Cash)也使用PoW,但其是用於限制電子郵件垃圾郵件和拒絕服務攻擊目的的。這篇文章遺漏了不少傳統的共識協議!但做者認爲,上述內容足以幫助你瞭解傳統共識算法和中本聰共識算法的不一樣。
特別感謝Zaki Manian提出的有關分佈式共識的全部問題。
原文:https://medium.com/@preethikasireddy/lets-take-a-crack-at-understanding-distributed-consensus-dad23d0dc95
做者:Preethi Kasireddy
翻譯:灑脫喜
稿源(譯):巴比特資訊(http://www.8btc.com/distributed-consensus-2)