1. 程式人生 > >Vitalik的“99%容錯共識演算法”解析

Vitalik的“99%容錯共識演算法”解析

在這裡插入圖片描述
Vitalik近期在其部落格上釋出了一篇名為《一個99%容錯共識的指南》讓許多人以為誕生了一個“黑科技”般的新共識演算法。然而正如Vitalik自己所說,這一共識演算法仍是經典拜占庭將軍問題的演算法。通過解析,我們可以看到共識演算法的研究與創新仍需要遵循CAP等已經被證明過的理論;在此基礎上把各類經典分散式演算法和加密演算法改造應用於區塊鏈領域內,將有可能獲得不錯的效果。

1、一個新的演算法?

Vitalik在其部落格上釋出了一篇名為《一個99%容錯共識的指南》。一時間各大媒體紛紛釋出訊息稱“V神釋出的新演算法僅需1%節點不作惡”。區塊鏈世界是否一夜之間進入了一個新的篇章?答案可能令人有些沮喪:這並不是一個新研究出來的演算法。

事實上,Vitalik在部落格中已明確說明“Leslie Lamport在他1982年《拜占庭將軍問題》的著名論文裡已包含了(增加容錯率)的演算法,下面我嘗試來描述並用一個簡化形式來實現它”。他之後也在twitter上強調說明,“我並沒有發明出一個可以99%容錯的共識協議,而是Leslie Lamport發明的。我只是做了一個解釋並把這個演算法適應在區塊鏈領域內”。

這究竟是怎麼一回事?為弄清楚來龍去脈,我們需要先來討論共識問題與分散式系統等理論問題。

2、分散式系統理論

實際上在區塊鏈誕生以前,電腦科學就對一致性問題已經有了較多的研究,形成了經過嚴格證明的分散式系統理論。其中較為經典的理論包括FLP和CAP等。

FLP不可能性原理為:“在網路可靠,存在節點失效(即便只有一個)的最小化非同步模型系統中,不存在一個可以解決一致性問題的確定性演算法。“即一致性問題的理論下限是無解的。非同步分散式系統中不存在一個任意場景下都能實現的共識演算法。

CAP原理稱為CAP不可能三角,即一致性(Consistency)、可用性(Availablity)和分割槽容忍性(Partition)三者無法同時滿足,需要弱化某個特性來設計分散式系統。所以在FLP不可能性原理前提下,CAP原理為工程實踐提供了理論指導。

比CAP更一般的,分散式系統理論中還有對於網路環境特性的定義:包括安全性(Safety)、活性(Liveness)、通訊不可靠性(Unreliable)。通過這些特性我們可以對CAP進行更為一般和直觀的定義:

在這裡插入圖片描述

由此可見,一般來說網路分割槽容忍性P並不是一個可選項,而是必須要在演算法中去考慮的因素。這也是為什麼分散式系統一般都會在安全性(Safety)和可用性(Liveness)之間進行權衡。

在這裡插入圖片描述

其中,最後一個任意型別的錯誤是最為嚴重和棘手的。在這種任意型別錯誤都可能發生的場景中,伺服器有可能產生原本不應該輸出的內容,系統要做好最壞情況的準備。例如,當一個伺服器向不同的伺服器傳送截然相反的訊息時。這種型別錯誤,就是拜占庭錯誤,最早由Pease和Lamport等在上世紀80年代初通過拜占庭將軍問題進行描述和分析。

因此相較於分散式資料庫,區塊鏈的對於一致性問題的設計和實現要更為複雜,這也是為什麼區塊鏈不只是一個簡單的分散式資料庫的原因之一。

3、 拜占庭將軍問題的經典解法

關於BFT問題本身的描述,本文不再贅述。而Lamport等人在其經典論文中除了提出拜占庭將軍問題外,也提供了兩種解決辦法。

第一種為“口頭訊息”的OM(m)協議,即除了鏈路上可使用加密安全保障外,不允許使用任何的加密演算法。該協議需要兩兩之間遞迴的傳遞大量訊息,因此訊息複雜度很高,為指數級,不太具有可實際操作性。但這一演算法仍有其很高的價值,首先是為“實用拜占庭容錯”(Practical Byzantine Fault Tolerance)這一多項式級別複雜度協議的誕生做了一個鋪墊;另外,其1/3容錯節點數量也被證明為是該類演算法的理論上限。

而第二種為“加密訊息”的SM(m)協議。該演算法與第一種不同之處在於使用簽名演算法。每個節點都能產生一個不可偽造的簽名,並可由其他節點進行驗證。當收到訊息後,節點會通過簽名來判斷及驗證該訊息是否已收到過。最終不再收到訊息後,訊息共識結束。

該論文已證明該第二種演算法可對任意多個節點實現容錯(當然網路中至少還應包括2個正常節點,否則無意義)。具體過程可參考論文原文。

然而這一演算法也存在其侷限性:與許多拜占庭演算法在一個非同步或者半同步網路環境的假設不同,它假設是在一個“同步”網路內進行,忽略網路節點間通訊延遲;另外,簽名身份體系資訊需要在網路執行前確定,較難實現擴充套件。因此,根據CAP理論可以說,這種方式是在不考慮對網路分割槽(P)等情況容忍的情況下,實現一個很高的一致性(C)與可用性(A)。

4、“99%容錯共識演算法”及對比分析

作為對比,我們再繼續來看一下Vitalik所說的“由Lamport發明而自己進行了描述與簡化實現”的共識演算法(以下簡稱“實現版本”;Lamport論文中的版本成為“原版本”)。

該實現版本仍然保留了原有的數字簽名體系,即每個節點都能產生一個不可偽造的簽名,並可由其他節點進行驗證。

與原版本不同的是,為了實現節點間的訊息傳遞,實現版本的演算法指定了訊息的超時時間,即節點接收到一個訊息後,對於訊息的檢查除了檢視簽名是否已收到過並且在集合當中以外,還要檢查收到訊息的時間不應晚於簽名對應的時間節點。

在這裡插入圖片描述

在經過確定好的時間(根據輪次計算得出)後,節點將停止監聽,並按照某種確定好的規則來從檢查合法的訊息中選擇一個值來作為共識的結果。

我們對比即可發現,兩種演算法並沒有太本質上的不同,其演算法本質都是需要基於簽名體系進行。而Vitalik實現版本的共識演算法增加的延遲時間要求。這一設計實現在共識協議的具體編寫實現時會經常遇到,可確定訊息的傳播輪次、確保訊息傳播可在一個指定的時間內結束。

另外,實現版本還討論了觀察者(Observer)作為一個獨立角色在網路中傳遞訊息。觀察者作為網路中一個被動檢視的角色,可接收、檢查訊息並直接轉發(不簽名)給其他節點。這需要對觀察者引入一個不一樣的延遲時間,以解決惡意節點故意給觀察者晚發訊息使得正常訊息超時的問題。

5、應用及啟發

正如上述討論的那樣,該類共識方法的主要問題在於對於網路的同步要求較高、可擴充套件性較差。另外一個實現版本的缺點在於訊息量也較大(需要進行N-1輪的N個節點向其他N-1個節點發訊息的過程,即訊息複雜度為),所以在實際場景中,該類共識方法較難直接應用。

在這裡插入圖片描述

為了更能適用於區塊鏈領域,Vitalik在其文章中也提到該方法可以與目前的其他共識演算法(例如PBFT、PoS等)進行結合,例如可間隔一些特定時間執行該演算法採用上述討論的觀察者模式隨機選擇出一些節點執行上述共識進行檢查。但如果在兩種共識演算法相關前提假設都不能滿足的情況下,那麼共識演算法也將失效,即這種改進優化並不能違背原有理論體系。

不過,我們仍可獲得不少啟發:充分挖掘分散式系統領域的經典理論,並將其改造為適用於區塊鏈領域的共識演算法可獲得出人意料的效果。例如,PBFT與中本聰類共識結合、Vitalik提出的BFT論文中的SM(m)演算法與現有區塊鏈共識結合等等。

此外,嘗試應用安全領域內的各種加密演算法也可能會獲得不錯的效果。例如,ByzCoin等也在嘗試使用聚合簽名等加密演算法來對共識機制進行優化改造,可大幅度降低通訊複雜度。

6. 總結

共識演算法的研究與創新仍需要遵循CAP等已經被證明過的理論。

在這些理論基礎上,可將計算機分散式理論中各類經典演算法、安全領域內的各種加密演算法加以適應性改造,以應用於區塊鏈領域內,將有可能獲得不錯的效果。

參考資料

A Guide to 99% Fault Tolerant Consensus, Vitalik, https://vitalik.ca/general/2018/08/07/99_fault_tolerant.html

“Distributed System (Third edition) Version 3.01”, Maarten van Steen, Andrew S. Tanenbaum.

“The Byzantine Generals Problem”, Leslie Lamport, Robert Shostak, Marshall Pease https://people.eecs.berkeley.edu/~luca/cs174/byzantine.pdf

https://en.wikipedia.org/wiki/Byzantine_fault_tolerance#Early_solutions

https://www.trustnodes.com/2018/08/10/vitalik-buterin-proposes-consensus-algorithm-requires-1-honest

稿源:火幣研究院(https://mp.weixin.qq.com/s/fd3N7xnFGIVEIT5kW_S85Q)