當咱們評價一個新的事物或者介紹一個新的技術的時候,咱們不能架空歷史和環境,新的事物不可能脫離歷史和環境憑空誕生。任何新的事物和新的技術老是或多或少的,與舊的事件以及過去的技術有所關聯,或是他們的衍生品。因此咱們談到區塊鏈共識的時候,就須要從計算機專業中的分佈式系統來說起,由於區塊鏈說來講去,它也只是分佈式系統中的一類而已。算法
分佈式系統在計算機領域中定義爲:組件分佈在聯網的計算機上,組件經過傳遞消息進行通訊和動做協調的系統。這裏的組件能夠粗略的認爲就是一個軟件,或者某個軟件的可獨立運行的一部分。這裏面隱含的說明了分佈式系統的三個特徵:組件的併發行,缺少全局時鐘、組件故障的獨立性。咱們區塊鏈既然是一種分佈式系統,這三個特徵也都是存在的。咱們常常說區塊鏈的系統中沒有一個同一的時間,區塊鏈應用沒法得到一個當前的時間,這就是分佈式系統的特徵之一,缺少全局時鐘。服務器
分佈式系統幾乎無所不在,從信息領域來講,Google的服務器集羣,咱們當今的互聯網和移動互聯網,大型的多人在線遊戲,銀行的金融交易系統以及咱們的區塊鏈系統等等,無一例外都是分佈式系統,如今還能找到不處於某個分佈式系統的計算機麼?不多!而咱們身邊的生活場景中,也是存在不少的分佈式系統,跨地理區域的全國投票選舉,地理分佈的多個朋友協商聚會,一個蟻羣中多個螞蟻相互通知食物的位置等等。網絡
分佈式系統對外能夠提供統一的服務。在這裏,若是想讓分散在不一樣計算機的組件協調起來,咱們須要有一個機制可以協調這些組件,咱們把這個機制叫作分佈式系統的共識,區塊鏈的共識是咱們分佈式系統共識的一種。併發
分佈式系統中的概念很是多,在這裏面咱們介紹和區塊鏈共識相關的兩組概念。第一組概念是同步和異步,咱們能夠把分佈式系統按照同步和異步分紅兩類。對於同步的分佈式系統,咱們描述爲處於分佈式系統的不一樣計算機之間通訊,消息不丟失並且秒到,也就是說通訊即快而可靠。而異步的分佈式系統是通訊不可靠,分佈式系統中的不一樣計算機之間相互發送消息,消息有延遲並且也可能丟失。咱們能夠認爲咱們的內部局域網是一個同步系統,大的互聯網是一個異步系統,前者通訊無延遲且可靠,後者通訊慢並且消息可能丟失。異步
第二組和區塊鏈共識相關的分佈式系統概念是拜占庭容錯(BFT,Byzantine Fault Tolerant),便可以容忍拜占庭錯誤(BF, Byzantine Fault)的分佈式系統共識(即便存在拜占庭錯誤,分佈式系統還能夠正常工做),所謂的拜占庭錯誤,即分佈式系統中的計算機(節點)不但有可能產生故障還有可能產生錯誤。這裏故障只是不響應或者停機,而錯誤是指計算機(節點)有可能發送錯誤的消息。咱們也能夠理解爲兩軍對戰,其中一方出現了叛徒,出現叛徒的一方的問題就定義爲拜占庭錯誤。因此咱們能夠從這個角度把分佈式系統來分爲:拜占庭容錯的分佈式系統和非拜占庭容錯的分佈式系統。分佈式
咱們從上面的兩組概念中能夠把分佈式系統劃分爲如下四類:區塊鏈
分佈式系統類型 | 同步 | 異步 |
---|---|---|
拜占庭容錯 | 同步拜占庭容錯 | 異步拜占庭容錯 |
非拜占庭容錯 | 同步的非拜占庭容錯 | 異步的非拜占庭容錯 |
若是咱們想按照上面的分佈式系統分類來劃分區塊鏈的話,咱們能夠把區塊鏈簡單的劃分爲一種異步的拜占庭容錯的分佈式系統。爲何是拜占庭容錯的分佈式系統,是由於區塊鏈中是假設參與的計算機或者節點是有壞人的,它們會發錯誤消息和假消息,因此區塊鏈中是存在拜占庭錯誤的,能夠推出區塊鏈是一個拜占庭容錯的分佈式系統。固然因爲區塊鏈是分佈在咱們的互聯網上,按照上面的定義咱們認爲互聯網是一個異步分佈式系統,因此區塊鏈也是一個異步分佈式系統。spa
關於異步式分佈式系統的共識,有這樣一個基礎的結論,FLP不可能原理。是在1985年由Fischer, Lynch 和 Patterson三位計算機科學家,提出了一個FLP不可能原理:「在網絡可靠的前提下,任意節點失效,一個或者多個的最小化異步模型系統中,不可能存在一個解決一致性問題的肯定性算法。即若是存在任意節點失效的狀況下,就沒法徹底保證分佈式系統能夠達到同步」。咱們能夠理解爲認爲徹底異步的分佈式系統是沒法達到共識的。因此咱們區塊鏈的共識機制或多或少的對異步式分佈式系統加了一些限制條件,好比pBFT共識算法,它假設節點之間消息節點有延遲,可是在有限時間內是能夠達到的。因此咱們區塊鏈爲了達到共識,也是有一點限制條件的異步分佈式系統。遊戲