解析拜占庭容錯共識的預選和預提交機制

買賣虛擬貨幣

本文探討了拜占庭共識演算法的優勢,講解拜占庭共識的一個重要方面——區塊的終結性,即保證某個特定區塊永遠不會被逆轉。

拜占庭共識的主要好處是什麼?

在深入討論拜占庭共識優勢之前,先快速瞭解一下拜占庭共識對區塊鏈有哪些關鍵功能改進。

1.安全性:如果網路中2/3的活躍受託人誠實地遵循協議行事,則兩個富有爭議的區塊無法在區塊鏈上達成終結性。

2.活性:即使1/3活躍受託人離線,新區塊仍可在區塊鏈上達成終結性。

3.問責制:如果一名受託人違反了共識協議,他/她將為自己行為負責。

以上便是拜占庭共識具有的三個高階特性。它能迅速地從分叉中恢復過來,快速地達成區塊鏈終結性。三個特性都需要深入瞭解,如果你樂意的話,可以瞭解LIP以及拜占庭共識研究論文。本文重點是介紹拜占庭的實現細節。

在拜占庭共識演算法中,每個節點不僅維護區塊鏈,還維護其他記憶體後設資料,以便根據演算法規則驗證區塊鏈。部分記憶體後設資料還將儲存在區塊鏈上,以防節點奔潰時可以重建記憶體資料集。我們另外針對區塊增加的屬性是受託人鍛造的前一區塊高度以及鍛造區塊時的最大預投票高度。與此同時,每個節點都將追求終結高度,因此在恢復區塊鏈的情況下,已被終結的區塊無法再逆轉。

支援區塊民主投票

在Lisk生態系統中,投票並不是什麼新鮮事——投票是任何DPoS共識演算法的基礎。LSK代幣持有者可以給受託人投票,然後,根據得票多少,系統選出得票最高的受託人鍛造新一輪區塊。之前,投票系統僅僅用於給受託人投票,引入拜占庭共識演算法後,投票系統不再僅用於投票了。每個受託人將給區塊投上一票,不同的是受託人投的票由各個節點自身維護和保留。只有少數計算出來的屬性會公佈在網路上,並非公佈到整個投票賬本上。拜占庭數學公式和協議確保各個節點正確地投票。

與其他投票系統的基本規則一致,受託人只能在給特定高度的區塊投票一次。因為同一高度不能存在兩個區塊,受託人只能投給一個區塊。這個過程叫做預投票,收集了2/3選票的區塊合格進入下一輪投票。

第二輪投票叫做預提交,規則與上面類似,受託人可以預提交一個區塊,只能提交一次,獲得2/3預投票的區塊達到合格線。在第二輪中,獲得2/3預提交的區塊具有終結性。具有最高預提交數的區塊最終確定為區塊鏈的高度。低於終結性區塊高度的區塊也將具有最終性,且不可逆轉。

其他一些規則:

1.如果受託人沒有參與這輪投票,就不能進行預投票或預提交。目的是防止垃圾投票。因此在受託人啟用時,我們會跟蹤投票輪情況。

2.一個受託人不能參與3輪投票,提高整個系統效能。

示例場景1—4個受託人同時鍛造

假設網路中有4名活躍受託人,要讓每個區塊都具有終結性,至少要3名(大於或等於2/3原則)受託人投票透過。

4名受託人都參與鍛造的情況

我們模擬一個資料來更好地理解。

1. 當一個區塊被申請新增到區塊鏈上時,需檢查以下資訊:受託人之前鍛造的區塊高度,鏈上獲得了2/3以上選票的最高區塊,以及受託人上次參與的投票輪。

2. 受託人檢查之前的預投票狀態,並預提交那些擁有2/3選票的區塊。由於拜占庭共識規則規定,一個受託人不能預提交區塊兩次。而且出於效能考慮,我們不會在鏈當前高度的後兩輪繼續執行這些預提交。

3.受託人預投票所有區塊。根據規則受託人不能一次只能預投票給一個區塊。而且要在自己被啟用的時間內才能預投票。而且出於效能考慮,我們不會在鏈當前高度的後兩輪繼續執行這些預提交。

4. 如圖所示,鏈中的第一個區塊在高度6處有三個預提交。這意味著該區塊被終結,且永遠無法被逆轉。

5. 鏈中的其餘區塊顯然是之前申請到鏈上的,這些區塊可以被逆轉,以解決網路分叉問題。

6.在預提交之前,擁有2/3投票的區塊數量在上升。擁有更多預投票的區塊有望獲得更多預提交,也就更大可能被最終確定。

但終結性不是針對單個區塊,而是針對特定區塊高度而言。如果一個區塊在高度7被最終確定,則意味它之下的區塊也被最終確定了。終結性並非按照順序排列,而是根據受託人列表(受託人列表決定鍛造順序)而變化。有可能好幾個區塊沒有被最終確定,而新來的區塊先被確定了。這種情況下,所有前面低於當前被最終確定的區塊,都被最終確定了。

示例場景2——4名受託人錯失了插槽

假設有4名受託人,但這一次受託人錯失了插槽,結果導致鏈不能順暢地確定區塊,終結的區塊之間出現缺口。

4名受託人正在錯失插槽

檢視上圖的資料模擬,可以看出第一個被最終確定的區塊高度為6,而區塊鏈高度為11。出現這種情況是因為受託人丟失了插槽,無法對前面的區塊預投票以及預提交。因為高度6具有最終性,所有高度6以下的區塊都被最終確認了。

示例場景3——5名受託人都被更換

假設5名受託人正在偽造,但到了第三輪之後,5名受託人都被其他受託人取代了。

5名受託人都更換了

本次模擬中最需關注的是在高度1與高度15之間,終結性高度是如何保持增長的。而在高度15與高度30之間終結性高度便停止增長了。而受託人仍在給新區塊投票,而共識規則規定,此階段受託人不能預提交區塊,因為受託人還沒有被啟用,於是原來的區塊就沒有進行預提交。這在預料之中,因為網路的終結性高度增長是在2/3以上的受託人就某一區塊達成共識。否則,網路繼續增長,但區塊卻沒有被最終確認。

示例場景4——11名受託人,其中一名受託人被替換

示例4更類似於真實的網路情況,受託人列表在好幾輪投票中沒有改變,最終只有少數受託人更改了自己的立場。同樣我們也模擬了資料,還增加了受託人數量,產生了一組難以置信的結果。

11名受託人,一名被替換

在示例4中,可以看出網路終結性高度直到高度33才停止增長,之後是暫停了4個區塊的時間,之後又開始增長。這種情況更類似真實網路。

為何要進行這些模擬呢?

你可能在想我們為何要做這些資料密集型模型實驗呢?因為拜占庭共識已被記錄下來了。是的,但是要理解拜占庭共識的邏輯比較困難,而且容易在實現的過程中出現問題。以上資料模擬可以讓我們更清晰地瞭解資料流和視覺化拜占庭共識在不同網路情形中的表現。

同時,資料模擬可以幫我們測試拜占庭實現,不僅讓實現變得更完善,也給了我們擴充套件和新增更多測試場景的靈感。

本文只是介紹了拜占庭共識LIP的冰山一角,即預投票和預提交部分。拜占庭LIP還有很多內容,比如分叉選擇規則,分叉恢復機制,正是這些才能拜占庭共識更加完整。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;