Hyperledger Fabric 共識(shí)原理和源碼分析

基于Fabric 1.0.0以后版本,目前fabric提供的共識(shí)算法有三種:solo,kafka和PBFT

  • solo模式
    用于開(kāi)發(fā)測(cè)試的單點(diǎn)共識(shí),不用介紹什么。
  • kafka模式
    其是一種支持多通道分區(qū)的集群時(shí)序服務(wù),可以容忍部分節(jié)點(diǎn)失效(crash),但不能容忍惡意節(jié)點(diǎn),其基于zookeeper進(jìn)行Paxos算法選舉,支持2f+1節(jié)點(diǎn)集群,f代表失效節(jié)點(diǎn)個(gè)數(shù)。即kafka可以容忍少于半數(shù)的共識(shí)節(jié)點(diǎn)失效。
  • PBFT算法
    其是以前版本的主流共識(shí)算法,也就是拜占庭共識(shí)算法。拜占庭算法支持(3f+1)的節(jié)點(diǎn)集群,f代表惡意節(jié)點(diǎn)的數(shù)量。惡意節(jié)點(diǎn)可能會(huì)做一些惡意偽造時(shí)序或者返回相反的錯(cuò)誤的結(jié)果等,注意這里與上面失效的區(qū)別。

目前,F(xiàn)abric的整體共識(shí)(Kafka)分為兩個(gè)步驟:

  • Step 1:信任
    這部分很多文章也講過(guò)了。就是向endorser節(jié)點(diǎn)發(fā)送背書(shū)請(qǐng)求,節(jié)點(diǎn)針對(duì)身份、簽名和讀寫(xiě)集的驗(yàn)證后,發(fā)現(xiàn)沒(méi)問(wèn)題,就視為正確的信息。
    這部分在整個(gè)出塊過(guò)程中,擔(dān)任了針對(duì)tx發(fā)起人的信任或者合法性進(jìn)行審核的作用,也就是為下一步(無(wú)法確認(rèn)信息有效性)做了一個(gè)篩選,或者說(shuō)信任處理。所以,第二步驟,可以默認(rèn)獲得的輸入都是安全有效的(誰(shuí)知道呢?)。
  • Step 2:時(shí)序
    這一部分就是我們所說(shuō)的kafka共識(shí),而其主要也是唯一的參與者就是orderer集群。orderer的核心作用就是將全局的tx(通過(guò)背書(shū)請(qǐng)求后的)作為輸入,在集群內(nèi)形成統(tǒng)一的、唯一的、確定的、經(jīng)過(guò)排序的tx輸出。
    這里我們提到的tx,無(wú)論是以讀寫(xiě)集還是tx本身存在,統(tǒng)一看做是tx。
    這部分做的事情有幾個(gè)核心的要點(diǎn):
  1. 不能容忍作惡。也就是說(shuō),針對(duì)惡意的數(shù)據(jù)(或者說(shuō)input)沒(méi)有能力進(jìn)行識(shí)別和處理。它能處理什么?看第二點(diǎn)
  2. 基于Zookeeper進(jìn)行paxos算法。paxos算法保證在orderer集群中,最終能夠形成一個(gè)有效的輸出結(jié)果,能夠容忍一定的失效節(jié)點(diǎn)。在換句話說(shuō),能夠容忍的錯(cuò)誤就是某一個(gè)(一些)orderer節(jié)點(diǎn)不能用了,無(wú)論是無(wú)法處理請(qǐng)求、宕機(jī),還是掉電。超過(guò)半數(shù)orderer集群的信息就沒(méi)辦法保證一致性。

這之后就是我瞎說(shuō)的,請(qǐng)勿相信,發(fā)上來(lái)就是想大家一起討論。
今天偶然看了一眼CAP,其中有一句話:

這篇論文證明了兩個(gè)非常有意思的理論,首先是在異步的網(wǎng)絡(luò)模型中,所有的節(jié)點(diǎn)由于沒(méi)有時(shí)鐘僅僅能根據(jù)接收到的消息作出判斷,這時(shí)完全不能同時(shí)保證一致性、可用性和分區(qū)容錯(cuò)性,每一個(gè)系統(tǒng)只能在這三種特性中選擇兩種。

說(shuō)的是CAP論文中的觀點(diǎn)。其中沒(méi)有時(shí)鐘這前提條件非常重要。也就是如果有全局時(shí)鐘,每個(gè)節(jié)點(diǎn)的時(shí)鐘誤差絕對(duì)值都不超過(guò)在消息傳遞的時(shí)間最小單位。那么我們針對(duì)信息打上時(shí)間戳,每個(gè)節(jié)點(diǎn)什么時(shí)候接受,都能夠針對(duì)這些消息進(jìn)行排序,然后處理,并最終得到一個(gè)有效的結(jié)果。我們只需要關(guān)注網(wǎng)絡(luò)內(nèi)最新的消息的sender、content就可以。

拉回fabric,我們可以發(fā)現(xiàn),其實(shí)orderer在的目的就是為所有的tx輸入,提供了一個(gè)類(lèi)似時(shí)序機(jī)制的模塊。雖然client提交的tx,peer發(fā)起的endorsement都是并發(fā)的,無(wú)序的。但是,經(jīng)過(guò)orderer的整合之后,會(huì)將其整理成一個(gè)有序的輸出。這就是orderer的核心價(jià)值。peer在需要的時(shí)候從orderer中pull到的需要打包的tx序列(讀寫(xiě)集)就是(maybe)確認(rèn)后的執(zhí)行的結(jié)果。然后在進(jìn)行驗(yàn)證寫(xiě)入賬本并在網(wǎng)絡(luò)上傳播。
那么,多個(gè)orderer和單個(gè)orderer的區(qū)別就是備份,提高系統(tǒng)可用性。防止單點(diǎn)宕機(jī)無(wú)法提供服務(wù)的情況。同時(shí)orderer節(jié)點(diǎn)的分離式部署以及維護(hù)是否能夠在將來(lái)構(gòu)想更多的共識(shí)算法的可能性也未可知。
不過(guò),這么感覺(jué)這一步分離以及tx的兩段式打包,感覺(jué)還是有那么點(diǎn)意思。

我一直對(duì)fabric提出的共識(shí)可插拔表示懷疑,特別想把這塊搞清楚。不過(guò)這就得看源碼了。進(jìn)一步的源碼分析,稍后再添加。
(未完待續(xù))

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容