DNBFT共識——一種可動態調節網絡節點數的PBFT優化方案

摘要

區塊鏈類比於一種分佈式存儲系統,
這種存儲系統有可持續增長,不可篡改的特點。
區塊鏈中的共識是多個節點對某一個狀態達成一致的過程。
PBFT是一種快速的共識機制。
但有無法動態調整網絡的缺陷。
對此缺陷,江蘇大學的儲勁鬆提出了DNBFT共識,這裏來學習一下。

PBFT共識

PBFT流程簡述

PBFT共識過程分爲四個階段,分別是pre-prepare、Prepare、Commit、Reply。

pre-prepare: 所有普通節點向leader節點發送transaction交易信息,leader收集交易信息,並對transactions進行選擇和排序,整理出來要寫入新區塊的交易集合,並廣播這個transactions集合。
Prepare: 各節點收到transactions集合之後,在本地對transactions進行演算,更新節點狀態。更新後,根據transactions計算的結果生成一個校驗值,並將自己生成的校驗值廣播出去。
commit:當節點收到2f個不同節點發來的校驗值,和自己的校驗值比較相等之後,向全網廣播一個commit消息。
Relay: 當leader節點收到2f個不同節點發來的commit消息之後,將提交新區塊到本地的鏈上,並提交新區塊。至此,新的區塊上鍊。
PBFT
詳細共識流程和原理PBFT機制原理

PBFT節點進出機制

PBFT共識協議本身沒有動態機制

PBFT本身不能動態共識,每一輪的節點數是固定的。這個特性在現實環境中有很多不利影響。例如,想新節點無法加入到網絡中;惡意節點無法從網絡中剔除。

例如,想用高吞吐、快速的PBFT共識來做一個學生學分的區塊鏈系統,增強學分系統的公信度。但是因爲PBFT總節點數不能動態改變,導致新入學的同學無法加入網絡,被開除的同學無法退出網絡。

PBFT的動態共識機制改良

DNBFT共識設定

DNBFT共識,即在PBFT基礎上添加了JOIN協議4個子協議,來滿足節點添加和刪除的功能。
四個子協議爲: JOIN EXIT PCLEAR CLEAR
節點加入 節點退出 主節點被動退出 備份節點被動退出
同時維護節點狀態表
節點狀態表
NodeID從小到大尋找良性狀態節點,來勝任leader節點。
剛進入網絡的節點狀態設爲 Benign
離開網絡的節點狀態設爲 Absent
有惡意行爲的節點狀態設爲 Malicious

DNBFT 動態添加節點過程

DNBFT過程
階段一
新節點 首先到 CA_Node 註冊,CA_Node檢查其身份合法之後,在節點表後面添加新記錄,例如這個新節點是節點g。
CA_Node將 g 的加入申請消息<JOIN,g,IP,PK>sig_ca廣播,發給所有備用節點。
所有節點(例如節點i)收到消息<JOIN,g,IP,PK>sig_ca後,驗證消息簽名sig_ca。然後將收到的消息和CA_Node提供的節點狀態表進行比對。
比對通過後,節點i開始JOIN協議。

階段二
當進入JOIN協議之後,節點i停止收發常規PBFT的四個子協議(pre-prepare,prepare,commit,reply)。
節點i廣播一個<JOIN,v+1,h,C,P,g,i>sig_i消息
其中
v : pbft的視圖編號
h : 當前區塊高度(論文裏寫的是序列號…這裏我是不是理解的有問題
C : 來自2f+1個不同節點的消息(這個C用來證明當前高度確實是h
P : 高度大於h的消息集合pm,其中必須有一個pre-prepare消息和2f+1個prepare消息(這是幹啥的呢
g:待添加的節點id
i:本節點id
sig_i: 本節點簽名

階段三
當主節點p收到2f+1個有效的JOIN消息後,向全網廣播<NEWVIEW,v+1,V,O,g>sig_p消息
其中
V:來自2f+1個節點的JOIN有效消息
O:從V中選擇高度最低的prepare消息,其高度計作min;選擇高度最高的prepare消息,其高度計作max;對於V中所有發出高度是min的消息的節點,生成一個該節點的prepare消息(可以僞造?),這些消息組成了O。
g:待加入的節點
sig_p:主節點的簽名

階段四
當所有節點收到來自主節點p的NEWVIEW消息之後,進行覈對,覈對正確後。將本地的節點狀態表進行更新,添加節點g。
至此,節點g正式加入網絡。

DNBFT 主動離開

退出網絡有兩種情況,主動離開和被動離開。主動離開就是因爲節點自身原因主動離開網絡,被動離開就是節點因爲作惡或者不作爲被強行清除出網絡。

階段一
想要退出的節點記爲節點i。
節點i向CA_Node請求退出網絡。
節點i向網絡廣播<EXIT-REQ,i,IP,PK>sig_i消息,
CA_Node收到節點i廣播的EXIT消息之後,記錄節點i到CLR列表。
CA_Node廣播CLR消息,將節點i的狀態改爲absent。

階段二
普通節點i在收到EXIT-REQ後,將消息記錄下來。
等接到CLR消息後,查找CLR列表中未過期的地址。
比對地址和本地的EXIT-REQ記錄,
將相同的地址從本地節點的節點狀態表中刪除。

階段三
普通節點j在將節點i狀態置爲absent之後,
向全網廣播<EXIT,v+1,h,C,P,E,i>sig_j,
當新leader節點收到2f+1個EXIT消息之後,
向全網廣播<NEW-View,v+1,V,O,E>sig_leader

階段四
到此位置,所有節點將節點i的狀態置爲absent
然後每一個節點向要退出的節點i發送<EXIT-REPLY,v+i,j,i>sig_j
當節點i收到f+1個EXIT-REPLY之後,即認爲自己已經退出網絡。

DNBFT 主節點被動離開

DNBFT和PBFT一樣,允許f個故障節點。
對於惡意節點,PBFT共識只能容忍。
而DNBFT共識在容忍惡意節點作惡的同時能夠動態的剔除惡意節點。
通過剔除惡意節點並且阻止惡意節點再次進入網絡,來降低惡意節點出現的概率。
被動退出協議
階段一
惡意主節點 記爲 節點z
有 普通節點 節點i
新主節點 節點j
節點i向全網廣播 <PCLEAR,v+1,h,C,P,z,i>sig_i
C和P依舊是消息集合
當新主節點收到PCLEAR消息2f+1個時,
向除了節點z的全網廣播 <NEW-VIEW,v+1,V,O,z>sig_j
普通節點檢查NEW-VIEW消息的簽名 合法性

階段二
此時全網對 惡意節點z 的排擠動作已完成
所有節點已將惡意節點z的節點狀態置爲 malicious
所有節點向 惡意節點z 和 NodeCA 發送消息<PCLEAR-REPLY,v+1,z,i>sig_i
當NodeCA收到了f+1個PCLEAR-REPLY之後,將節點z在NodeCA的節點狀態置爲 malicious
從此,節點z將再也無法加入網絡

DNBFT 普通節點被動離開

普通節點主觀判斷主節點是否爲惡意節點,是簡單的。

普通節點難以判斷一個普通節點是否爲惡意節點。
DNBFT引入兩個術語

  • 參與度(PD) 當一個普通節點Node_i參加了一次完整的共識,Node_i.PD +=1,相反則PD -= 1,PB初始值爲3,0 <= PD <=3,PD 爲整數。PD==0時,則節點爲惡意節點
  • 成功完成共識後,如果節點j 與 2f+1個節點提交的信息一樣,則記爲完成一次完整的共識。

階段一
普通節點i要驅逐惡意普通節點z
普通節點i向全網廣播<CLEAR,v+1,h,C,P,z,i>sig_i

階段二
當主節點leader收到2f+1個CLEAR消息後
向全網廣播<NEW-VIEW,v+1,V,O,Z>sig_leader
普通節點收到NEW-VIEW之後,進行簽名驗證。
將Z中包含的惡意節點進行驅逐
將狀態置爲malicious

階段三
普通節點i向惡意節點和NodeCA發送<CLEAR-REPLY,v+1,Z,i>sig_i消息
當NodeCA收到消息之後,將惡意節點Z們的狀態置爲Malicious
至此驅逐過程結束

思考

這個DNBFT共識有NodeCA這個非常中心化的設定。
共識中似乎有一些異常狀態會導致共識的失敗,這個我在研究研究。

引用,國內外對BFT共識的研究

[1]張迪.另一種BFT共識算法在區塊鏈中的應用[J].傳播力研究,2019,3(28):272.

[2]戴鵬. 基於實用拜占庭共識算法(PBFT)的區塊鏈模型的評估與改進[D].北京郵電大學,2019.

[3]王永革 PBFT 拜占庭協議安全性分析:不適合聯盟鏈或公鏈 https://www.theblockbeats.com/news/6208

[4] Andrew Miller. The Honey Badger of BFT Protocols https://eprint.iacr.org/2016/199.pdf

[5]楊磊,黃浩,李仁發,李肯立.P2P存儲系統拜占庭容錯機制研究[J].計算機應用研究,2009,26(01):4-8+40.

[6]儲勁鬆. 基於PBFT算法的動態共識機制研究[D].江蘇大學,2019.

發佈了7 篇原創文章 · 獲贊 3 · 訪問量 598
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章