前言:區塊鏈系統是一種分佈式架構系統,分佈式系統中,多個主機通過異步通信的方式組成網絡集羣,異步通信要保證每個主機達成一致的狀態共識。區塊鏈這種基於互聯網的去中心化系統,需要解決的首要問題就是如何實現不同節點上數據的一致性和正確性,這就需要借鑑分佈式系統中實現狀態共識的算法。
可以毫不誇張的講,學習區塊鏈就必須掌握共識算法
一、什麼是共識算法?
(一)、分佈式系統
-
區塊鏈系統本質就是一個分佈式應用軟件。區塊鏈架構是一種分佈式架構。其部署模式有公共鏈、聯盟鏈、私有鏈三種,對應的是去中心化分佈式系統、部分去中心化分佈式系統和弱中心分佈式系統。
-
分佈式系統中,多個主機通過異步通信方式組成網絡集羣。在這樣的一個異步系統中,需要主機之間進行狀態複製,以保證每個主機達成一致的狀態共識。然而異步系統中,可能出現無法通信的故障主機,而主機的性能可能下降,網絡可能擁塞,這些可能導致錯誤信息在系統內傳播。因此需要在默認不可靠的異步網絡中定義容錯協議,以確保各主機達成安全可靠的狀態共識。
-
分佈式系統必須要解決數據一致性問題。區塊鏈系統的本質是分佈式應用軟件,首要問題自然是解決一致性問題,實現多個獨立節點之間達成共識。分佈式一致性問題分廠難以解決,難點在於:
- 分佈式系統本身可能出現故障;
- 分佈式系統之間的通信可能有故障或是顯著延遲;
- 分佈式系統運行速度大不相同,快慢不一。
-以上難點都屬於非拜占庭問題,分佈式系統除了節點故障外,還存在拜占庭將軍問題,也就是存在惡意節點的問題。而計算機科學家對拜占庭將軍問題的得出的研究結果是:FLP定理(不可能性定理)和CAP定理
(二)、分佈式系統的一致性問題
- 理想的分佈式系統的一致性應該滿足
- 可終止性:一致性的結果可在有限時間內完成
- 共識性:不同節點最重完成決策的結果應該相同
- 合法性:決策的結果必須是其他進程提出的提案
- 對於分佈式系統,希望具備以下能力
- 分佈式系統作爲一個邏輯整體,不應該返回錯誤的結果
- 只要系統裏的大部分機器工作正常倉,整個分佈式系統就能郵箱運行,這也是分佈式系統應用的一個優點,抵抗單點故障
- 系統的性能是可以橫向拓展的,對於分佈式系統來說,木桶原理不起作用
- 分佈式系統必須是異步的。每個節點按照自己的時序獨立工作,沒有全序的時間順序
- 在實際的計算機集羣中,可能會存在以下問題:
- 節點處理事務的能力不同,網絡節點數據的吞吐量有差異
- 節點間通訊的信道可能不安全
- 可能會有惡意節點出現
- 當一部處理能力達到高度一致時,系統的可拓展性就會變差(容不下新節點的加入)
- 實現全網一致性其實只需要在某個時刻達成最終一致即可
(三)、FLP定理與CAP定理
- FLP定理:在異步通信場景,即使只有一個進程失敗,也沒有任何算法能保證非失敗進程達到一致性
- CAP定理:它是告訴你,在異步通信場景中,如果有一個進程失敗的話,那麼還是有些非失敗的進程達成一致性
- 分佈式計算系統不可能同時確保一致性、可用性和分區容錯性,這三者不可兼得。這是一個典型的不可能三角
- 既然不能同時滿足,只有弱化對某個特性的支持
- 弱化一致性:對於實時的強一致性不要有太高的要求
- 弱化可用性:要提高性能,保持可靠,儘量避免加載不必要的模塊,也就是犧牲可用性
- 弱化分區容錯性:對於分佈式系統,分區容錯是必然的。區塊鏈系統,尤其是公有鏈,用各種公式算法,悠閒解決的就是保證整個系統的容錯能力。
(四)、傳統分佈式一致性算法和區塊鏈共識算法
- 一致性就是指數據要完整、要同步。
- 所謂的共識算法,主要是爲了解決分佈式系統中,所有節點對於數據的一致性和有效性問題兒指定的一系列規則。通過類似節點投票的方式,確保分佈式系統不會因爲某個節點的問題導致分佈式系統的數據發生安全問題。
- 傳統分佈式一致性算法和區塊鏈共識算法相同點
- 強調序列化
- 少數服從多數遠側
- 分離不該的問題:即多節點覆蓋少數節點日誌,倡廉覆蓋短鏈區塊。
- 傳統分佈式一致性算法和區塊鏈共識算法不同點
- 傳統分佈式一致性算法大多不考慮拜占庭容錯,即假設所有節點只發生宕機、網絡異常等非人爲因素的問題,並不會考慮惡意節點篡改數據的問題;
- 傳統分佈式一致性算法是面向數據庫的,兒區塊鏈共識模型面向交易的,所以嚴格來說,傳統分佈式一致性算法應該處於區塊鏈共識模型的下一層。