在上期家庭財政舉的例子中,夫妻各自管理自己的賬本時,新增的每一筆收入都需要經過兩人的共同查驗,確認無誤後才會被分別記入二人的賬本中,並確認雙方賬本是否一致。其中“共同查驗”、“確認雙方賬本一致”的過程就是共識。
共識演算法有哪些?
想要達成共識,我們就必須得解決一個問題:聽誰的?
比比誰更強,誰更快:POW工作量證明、Raft演算法。
以「王者榮耀」為例,五個路人剛組好戰隊,需要選出一名指揮官,決定如何在比賽時交流資訊,保證行動的一致性,從而一起奪得戰隊賽的好名次。
有人提出在王者快跑一決高下,這個趣味賽要求玩家隨機選擇英雄,利用英雄技能,誰先抵達終點誰就勝出,擔任指揮官。這意味著使用同樣的英雄,誰的技能操作更熟練,位移更準確且迅速,誰的能力更強,經驗更足,也自然更能勝任指揮官。
這種方法的原理就是比特幣使用的工作量證明機制(POW),區塊鏈中哪個節點的算力更強,就更有可能發現下一個區塊的有效值。然而正如這個例子中,玩家需要在常規比賽之外再另比一場王者快跑的比賽,而且對於不擅長玩位移英雄的玩家來說不公平。對應到區塊鏈中,節點在處理鏈上資訊的同時,還要時時與其他節點比賽算力,POW演算法最終變成算力的角逐,浪費大量算力,也使得POW失去了公平的初衷。
為了節省算力消耗,也有人說不如去五軍對決,每人佔據一個buff點,等待隨機重新整理的重生之石。誰先等到重新整理的重生之石,誰就成為候選人,如果同時等到,則同時當選候選人,就不用增加過多的比賽。候選人具備競選指揮官的資格,指揮官由大家投票選出,每人手中僅有寶貴的一票,而第一個收到一半以上票數的候選人即可當選指揮官。這種方法的原理就是Raft演算法,像所有人都需等待重生之石隨機重新整理那樣,Raft演算法中的普通節點(玩家)需要等待隨機的時間變成候選節點(候選人),沒投過票的普通節點可以把票投給候選節點,收到一半以上票數的候選節點即可成為領導節點(指揮官)。
拒絕作惡:RBFT演算法、BFT類拜占庭容錯演算法
但即使透過上面兩種方法選出了指揮官,也並不意味著戰隊就能統一行動,奪得最終的勝利。可能有隊員其實是個“演員”,實際上卻並不聽從指揮,反而假傳指揮官命令給其他隊友,帶著他們單獨行動。這種情況下,保證戰隊比賽時能夠交流真實的有效資訊,就尤為重要。在區塊鏈中,這被稱作存在作惡節點(拜占庭節點)的情況,此時系統應該如何達成共識呢?
既然如此,乾脆取消競選指揮官的環節,每個人都有擔任指揮官的機會,在實戰中檢驗大家的指揮能力。在每局比賽中,系統會不斷髮出提示,比如“摧毀敵方防禦塔”。指揮官篩選出這些訊息中的有用訊息,再向其他隊友轉達進攻指令。隊友們在收到訊息後自行判斷這個命令是否合理,如果覺得合理,就回復“收到”,一旦收到超過2/3的其他隊友回覆的“收到”,就明白大多數隊友都會配合,便放心發起進攻。在一局比賽結束後,如果超過2/3的隊友認為這局的指揮官不行,就更換指揮官的人選。
這便是趣鏈高魯棒性拜占庭容錯演算法(RBFT)的原理,客戶端(系統)給主節點(指揮官)傳送請求,主節點(指揮官)收到請求後傳送訊息給所有從節點(隊員),從節點給其他所有節點傳送訊息確認收到,收到超過2/3確認訊息的從節點執行命令,並同時通知其他所有節點,最終將執行結果反饋給客戶端,如果主節點出現故障則進行檢視切換,更換主節點。
除此之外,趣鏈RBFT演算法在基於普通的拜占庭容錯演算法的基礎上做了諸多改進,比如利用Recovery機制提升了系統的可靠性、拓展性,當隊員(從節點)因網路卡頓等原因重新遊戲連結(從拜占庭狀態中恢復)時,隊員能夠自動回顧重連過程中錯過的戰局資訊與小隊指令(區塊資訊),讓隊員能夠跟上游戲進度。
更最佳化的傳遞共識:NoxBFT演算法、HotStuff演算法
但又有人提出,當小隊的人數(區塊鏈內節點)變多時,BFT類的演算法的要求的所有隊友互相交流就會有些麻煩,所有人最好僅與指揮官交流。
為了降低交流的成本,且確保指揮官的指令得到了大部分人的認可,每個人都會在回覆指揮官的訊息中附上自己的頭像(可以理解為指紋、簽名,其他人不可盜用) ,而指揮官在給所有人傳送最終指令時,會附上這些頭像的集合,來證明指令經過了大家的認可,否則隊員可以無視指令。除此之外,還把更換指揮官的步驟直接挪到比賽中,以免指揮官在比賽中臨時斷線或者狀態不佳總髮送錯誤指令。
這就是HotStuff演算法的原理,它將 BFT 的網狀通訊網路拓撲變成了星形通訊網路拓撲,節點(隊員)不再透過 p2p 網路將訊息廣播給其它節點(隊員),而是將訊息傳送給主節點(指揮官),由主節點處理後傳送給其它節點。得益於星型通訊網路拓撲,系統的通訊複雜度得到了大大降低。它透過將檢視切換流程(更換指揮官)和正常流程(比賽)進行合併,也降低了檢視切換的複雜度。
趣鏈在借鑑HotStuff演算法的理念後,自研NoxBFT演算法,在大規模組網環境下,能夠有效降低區塊鏈網路傳輸的複雜度,提升系統的共識效率與可擴充套件性。
所以,我們支援哪些共識演算法?
趣鏈的共識模組採用可拔插的模組化設計,使用者可針對不同的業務場景需求按需選擇不同的共識演算法。目前支援RBFT、NoxBFT、Raft共識演算法,這三類演算法分別有其適合的場景。
RBFT:由趣鏈自研,具有高效能高魯棒性,設計了動態資料自動恢復機制與動態共識節點增刪機制,大大增強了共識模組的可用性,提升了系統的整體交易吞吐能力和系統穩定性,可達到萬級TPS以及毫米級延遲。適用於一般數量級的節點組成的網路環境。
NoxBFT:由趣鏈借鑑Hotstuff演算法後自研,透過星型網路拓撲結構將全網網路複雜度由O(n2)降低至O(n),減少了一個量級,並進一步最佳化演算法的活性、可靠性以及數字簽名效能,有效解決大規模節點組網場景下共識效率低下、可擴充套件性不強的問題,現已支援以千為數量級的大規模節點擴充套件。
Raft:趣鏈區塊鏈平臺支援Raft共識演算法保證賬本一致性,在聯盟各方足夠信任的前提下,實現高效共識。該演算法僅限於強信任聯盟鏈場景中使用。
共識演算法未來發展方向
區塊鏈共識演算法從一開始的算力密集型演算法POW、POS開始,後來逐漸演變出減少耗能的選舉型共識方式BFT等,整體效能上有4-5個數量級的提升。但隨著節點數量增多到幾百個甚至更大的共識節點規模,需要交換的資訊增多,系統負載及網路通訊量增大,效能會有所下降,可擴充套件性也較弱。如何突破共識效能、頻寬瓶頸,實現大規模節點高效共識、增強可擴充套件性是當前共識研究的重要發展方向。
目前,共識演算法的研究嘗試結合更多的技術進行最佳化,比如引入VRF(可驗證隨機函式)保證主節點選取隨機性和公平性,應用DAG(有向無環圖)資料結構提升系統吞吐量、結合密碼學演算法最佳化共識效率等等,整體趨勢上是向混合型共識演算法演變。
趣鏈長久以來一直深耕區塊鏈底層技術,積極跟蹤和發掘區塊鏈技術發展方向,後續會不斷與大家分享我們在共識演算法方面的研究和工程經驗,希望大家持續關注。