1 背景
當(dāng)前大家對fabric的共識算法的觀點(diǎn),普遍都認(rèn)為是kafka,而kafka是主從模式,所以不能防止作惡。針對這個觀點(diǎn),詳細(xì)解析fabric的共識模式。
2 fabric共識
fabric共識模式采用的 Endorse+Kafka+Commit 的模式,這里我們簡稱EKC共識。此共識包含以下幾個步驟:
請求背書:
客戶端用自己的私鑰對交易進(jìn)行簽名后,按照指定格式將交易和簽名信息進(jìn)行打包,然后將打包后的數(shù)據(jù)發(fā)給背書節(jié)點(diǎn)請求背書。驗(yàn)證背書:
背書節(jié)點(diǎn)收到背書請求后,驗(yàn)證交易的簽名是否正確并調(diào)用智能合約驗(yàn)證交易內(nèi)容是否合法。驗(yàn)證通過的話,背書節(jié)點(diǎn)用自己的私鑰對背書結(jié)果進(jìn)行簽名并按照指定格式打包,然后將打包后的數(shù)據(jù)發(fā)給客戶端。提交交易:
客戶端收到背書結(jié)果后,驗(yàn)證背書結(jié)果的簽名是否正確。驗(yàn)證通過后,對交易請求和背書結(jié)果簽名并打包。然后,把打包后的數(shù)據(jù)發(fā)送給orderer節(jié)點(diǎn)提交交易。排序廣播:
orderer節(jié)點(diǎn)收到交易后,驗(yàn)證數(shù)據(jù)的客戶端簽名[bJ1] 是否正確。驗(yàn)證通過后,將交易發(fā)給kafka集群對應(yīng)的topic。由于orderer中的對于每個通道都在kafka上監(jiān)聽對應(yīng)的消息,因此,kafka將消息存放到對應(yīng)topic上之后,會將消息廣播給通道上的所有orderer。因?yàn)楦鱾€orderer的消息都是由kafka按照相同順序發(fā)送的,因此,這個過程也實(shí)現(xiàn)了消息的排序。打包出塊:
orderer節(jié)點(diǎn)接收到從kafka推送的消息(kafka節(jié)點(diǎn)見同步消息不需要驗(yàn)證),當(dāng)滿足出塊策略[bJ2] :緩存交易個數(shù)達(dá)到區(qū)塊最大交易數(shù)或者時間達(dá)到出快時間,則將交易進(jìn)行打包、對數(shù)據(jù)簽名,然后出塊,并將區(qū)塊分發(fā)給peer節(jié)點(diǎn)。驗(yàn)證記賬:
peer節(jié)點(diǎn)接收到區(qū)塊后,驗(yàn)證交易是否有效即驗(yàn)證區(qū)塊的交易是否滿足背書策略以及區(qū)塊中交易的讀寫集版本是否正確[bJ3] 。驗(yàn)證通過的話,執(zhí)行此交易的內(nèi)容更改狀態(tài)數(shù)據(jù)庫。驗(yàn)證失敗的話,對此條交易不做任何處理。當(dāng)區(qū)塊中的交易全部處理完成后,將區(qū)塊記錄在本地數(shù)據(jù)庫。
3 交互流程圖

4 數(shù)據(jù)流程圖
