1. 程式人生 > >區塊鏈:分散式共識演算法

區塊鏈:分散式共識演算法

中心化的交易模型

由中間節點驗證交易有效性,所有參與者以中心節點的賬本為準。

 

但是這樣的中心化的交易成本很高,需要一定的維護。例如一些臨時性操作(像是銀行中卡被盜刷),這些交易實際上是無效的,最終還需要修改回資料,這樣的成本就很高了。

 

去中心化的結果

沒有一個信任節點去驗證交易的有效性,沒有辦法解決一些交易上的糾紛。

 

網路是開放的,所以任意一個節點都可以傳送有效的或者無效的,甚至惡意的交易。這些惡意的交易就有可能導致接下來討論的雙重支付問題。

 

雙重支付問題與拜占庭將軍問題

使用者A向用戶B轉了600,向C發出公告說自己向B轉了600,但是他同時向用戶D,E傳送說自己向用戶B轉了500(自己還剩100),那麼D,E同時也會發布給C說A向B轉了500,那麼此時C應該相信誰?

 

這裡如果分別看兩條鏈的資料結構會發現並沒有什麼異常,但是如果C同時接受到兩條不同的合法資訊,就會產生這個問題。

 

這裡有一個思路。既然能有鏈條合法的鏈,那麼讓所有人用同一個版本。那麼這裡就會有機率產生一種情況,就是A實際上支付了B600,但是所有人都承認了A向B支付了500,自己剩下100的情況。

 

那麼這裡可以把問題定性為如何設計一套演算法讓所有節點當遇到分歧的時候能夠達成一致。也就是基於非同步通訊的分散式共識問題

 

同樣,拜占庭將軍問題也是一個類似的問題。這裡的圖片來自ppt。

這些問題本質上都是基於非同步通訊的分散式共識問題。我們來看看每個詞條。

 

非同步通訊

相對於同步通訊,非同步通訊在傳送字元時,所傳送的字元之間的時隙可以是任意的。也就是說資訊發出後,可能到達可能不到達。

 

分散式

結點之間互相獨立,互相不信任,不受中央控制。

 

共識

目標是所有成員達成一致的意見。

 

解決拜占庭將軍問題

FLP不可能性定理

“在分散式非同步通訊的網路裡,即便存在一個故障的節點,不存在可解決一致性的演算法。”,FLP不可能原理實際上告訴人們,不要浪費時間,去為非同步分散式系統設計在任意場景下都能實現共識的演算法。

 

但是!!!不存在任意情景下都適用的演算法。但我們可以進行一些假設,來進行限制來簡化問題。

 

假設1:多數是忠誠

因為如果超過一半都是叛軍,結果只能失敗,問題是無解的。

 

假設2:擁有原計劃(預設值)

就是在所有人進攻之前就確定如果沒有受到任何資訊,即使資訊被截,按照原計劃進攻。

 

假設3:將軍簽名無法偽造

如果存在叛將可以偽造簽名,就有無窮大的權利,如肆意更改進攻時間,截獲其他的信使,最終這個問題還是無解。

 

可是還是發現,既便加入了限制還是很難實現。

 

演算法型別與相關研究

1、非拜占庭錯誤的情況:Paxos,Zab等

2、允許拜占庭錯誤:Extended Paxos、PBFT、工作量演算法、權益證明。

 

總結一下

去中心化交易模型容易導致類似雙重支付或者拜占庭將軍問題出現,這些問題的實質都是基於非同步通訊下的分散式共識演算法,理論上這個問題是無解的,而在實際操作中可以嘗試簡化問題,限制條件來找到一種成功率較高的解法。那麼明天再來看看,比特幣是怎麼實現共識演算法的。