前言近日比原鏈(BYTOM)技術團隊發布了Bystack區塊鏈BaaS平臺,其中包括側鏈的共識算法BBFT(Bystack Byzantine Fault Tolerance)。筆者將在
前言
近日比原鏈(BYTOM)技術團隊發布了Bystack區塊鏈BaaS平臺,其中包括側鏈的共識算法BBFT(Bystack Byzantine Fault Tolerance)。筆者將在這篇文章中闡述比原鏈BBFT嘗試解決的問題以及分析BBFT與其他各家共識協議的主要差異。
BBFT是一個PBFT的變形,它的原理與PBFT一脈相承。若想深刻理解BBFT的巧思,則必須進入PBFT的脈絡推敲。早在區塊鏈藉由比特幣的大紅大紫之前,PBFT就作為共識協議存在于世界上了。由Castro和Liskov于1999年發明,它是一個具有20年歷史的經典設計,它的發明是為了解決分布式系統中的一個經典問題:拜占庭將軍問題。直到今日,PBFT仍蘊含許多值得反復推敲的巧思,不斷啟發后世發明出更好的協定。
PBFT基本的運作流程
PBFT是一個具有二輪投票的三階段協議,每個視域(View)都會有一個特定的節點作為領導節點(Primary/Leader),負責通知所有節點進入投票流程。各節點則會經歷Pre-prepare/Prepare/Commit這三個階段,并依據接收的訊息決定是否投票/進入下一階段,每個節點投完票后將訊息發給所有其他的節點。
若個節點在兩階段投票之后取得多數共識,則各節點可以更新本機的狀態,結束這一回合。視域變換(View-change)僅當多數節點發起時執行,當目前的領導節點并未正常執行任務時,這可以替換當前的領導節點,保證協議正常運作。
PBFT的特性
PBFT與中本聰共識(區塊鏈)有相當不同的特性:PBFT是一個許可制的、基于領導節點的、基于通訊的、安全性重于活躍性的共識協定。
許可制的(Permissioned):PBFT并非完全開放的,這是由于PBFT需要讓節點能夠驗證彼此的訊息以及精準掌握節點的數量,區塊鏈則是屬于對任何人都開放的非許可制(Permissionless)。
基于領導節點的(Leader-based):也就是先決定領導節點(Leader),再由領導節點送出提議,這樣做最直接的好處就是不需要浪費自己的運算資源去爭取當領導節點的機會,然而缺點就是只有在視域變換時才輪替領導節點,成為領導節點的機會并不公平,缺乏加入網絡的誘因;區塊鏈則是在多個提案中選擇工作證明難度最高的區塊作為共識,雖然這樣會造成運算資源的浪費,但是成為出塊者的機率大致是公平的,其與算力成正比。
基于通訊的(Communication-based):PBFT的安全性奠基于3階段投票,雖然不必如工作證明般消耗大量計算資源,但數量龐大的通訊也造成可擴展性的瓶頸——就算是號稱最實用的PBFT,也無法擴展到1000個以上個節點。不僅如此,PBFT使用消息驗證代碼(MAC),每投一輪票就需要每一個節點驗證一次訊息,大量的簽名/驗證也是另一個潛在的瓶頸。
安全性重于活躍性的(Safety over Liveness):PBFT不論在何種網絡假設下(同步/異步)都能確保安全性,幾乎不可能出現分岔,因此具有實時敲定(Instant Finality)的特性;相對地,區塊鏈則是活躍性重于安全性,其安全性有賴于同步的網絡,而具有復數個共識(及分岔)的情況也相當常見,需要經過一定數量的區塊「確認」才能保證其不再分岔的機率足夠大。
PBFT的問題
首先,PBFT中的每個節點都需于每一輪投票中做n-n的通訊,假設n為1000,則每一次的共識都需要至少100,000次的通訊,盡管PBFT已經是BFT家族當中最實用的協議,這么巨量的通訊需求仍是擴展的瓶頸。
如何提升效率?
· 聚合簽名
為了提升效率,一個直覺的思路是:避免n-n的通訊。我們可以指定網絡中的某節點作為協調者來發送/接收每個節點的投票,這樣每個節點都只需要向協調者發送訊息即可,從而避免了n-n的通訊。然而,在這樣的情境下,協調者有作惡的可能,因為協調者可以在未確實接收到指定數量的訊息前便執行下一輪投票或者進行狀態更新。
因此,我們可以使用門坎簽章(Threshold Signature)來保證協調者的正當行為,門坎簽章的可以保證:需集合超過門坎數量(t-of-n)的簽章才有效。也就是說,我們可以指定:唯有當協調者集合 2f+1 個門坎簽章后,協調者才能帶著合法的簽名繼續推進共識。Harmony FBFT便是一個使用聚合簽名以提升效率的BFT家族協議。
· 管線設計
每個內容都必須經過二輪投票/三個階段才能達成共識,如果有m個內容就需要執行2m次投票。管線設計(Pipelining)可以減少投票的次數,它的基本思路如下:讓每個節點在投第 i 輪的prepare階段時,同時也是對其前一個內容 i-1 的commit階段投票。這樣做便可以節省對同一個內容重復投票的冗余,大幅提升效率。這樣的思路首見于2018年發表的HotStuff協議。
· 只讓部分節點參與共識:最小生成樹
另外一種提高效率的方法,就是避免使所有的節點參與共識,這也正是比原鏈BBFT采取的作法。在BBFT中,節點分為三種:Consensus Node/Gateway Node/Leader Node,這些節點形成樹的結構,樹為網絡中節點的最小生成樹(Minimal Spanning Tree),可能由分布式算法得出,或是由外部服務提供。
樹葉的節點即為Consensus Node;樹根為Leader Node;其他部分為Gateway Node。每種節點都有分別的任務:Consensus Node負責進行投票;Gateway Node則不需參與投票,但必須負責聚合由Consensus Node送來的簽章;Leader Node負責與其他Leader Node交換訊息。BBFT的運作流程如下圖所示,BBFT的共識過程,便是訊息由樹根向樹葉傳播再回到樹根的過程。
如何確保正確性(Safety and Liveness)?
在為PBFT帶入新技術以提升效率的同時,也必須確保協議本身的安全性與活躍性。接下來我們來看看,上述的協議是如何確保這兩者。
· 視域變換(View-change)
FBFT沿用了PBFT的視域變換,即在正常情況下并不更換領導節點,僅有當超過2f+1個節點發起視域變換才會更迭領導節點。視域變換雖然本身是一個能夠替換作惡領導節點的機制,但它同時要求協議必須具有3個階段,才能保證協議的安全性(即不分岔)。
· 領導節點輪替(Rotating Leader)
HotStuff另一方面則引入了領導節點輪替的機制,在每個回合都更換領導節點,如此來回避視域變換高額的通訊成本。領導節點輪替也常見于許多BFT家族的協議,算是目前保障安全性機制的主流。
· 混合式(Hybrid)
比原鏈BBFT則取各家所長,同時應用了視域變換與領導節點輪替,等于是上了雙重保險。
不過值得注意的是,目前的BBFT技術白皮書僅有一輪投票的模型,并未提出兩輪投票/三階段共識的模型。另外,領導節點輪替的順序也將基于各節點的權益(Stake),若節點出現違反協議的行為則該節點會遭受懲罰。
BBFT的挑戰
綜合以上的分析與比較,BBFT目前有幾個顯著的挑戰。首先,是最小生成樹的產生方式,如何同時兼顧去中心化與效率?其次是BBFT僅采取單輪投票作為共識,在引入視域變換的情況之下,可能會發生分岔,這樣的網絡也會遭受日蝕攻擊的威脅。最后,引入門坎簽章的前提下,勢必需要引入分布式私鑰生產協議(Distributed Key Generation)以共同生成私鑰,這部分于技術白皮書中尚未提及,卻是可能造成瓶頸的潛在因子。
結語
本篇文章簡介了PBFT的特性及其效能問題,并比較了FBFT/HotStuff/BBFT等協議針對效能問題的解決思路,最后歸納出比原鏈BBFT的未來挑戰,希望能幫助讀者更理解BBFT的精髓。(Juin Chiu)