簡單概述
Hyperledger Fabric是由IBM公司主導(dǎo)開發(fā)的一個(gè)面向企業(yè)級客戶的開源項(xiàng)目袖裕。與比特幣和以太坊這類公有鏈不同龙宏,Hyperledger Fabric網(wǎng)絡(luò)中的節(jié)點(diǎn)必須經(jīng)過授權(quán)認(rèn)證后才能加入,從而避免了POW資源開銷万矾,大幅提高了交易處理效率,滿足企業(yè)級應(yīng)用對處理性能的訴求慎框。同時(shí)良狈,為了滿足靈活多變的應(yīng)用場景,Hyperledger Fabric采用了高度模塊化的系統(tǒng)設(shè)計(jì)理念笨枯,將權(quán)限認(rèn)證模塊(MSP)薪丁、共識(shí)服務(wù)模塊(Ordering Service)、背書模塊(Endorsing peers)馅精、區(qū)塊提交模塊(committing peers)等進(jìn)行分離部署严嗜,使開發(fā)者可以根據(jù)具體的業(yè)務(wù)場景替換模塊,實(shí)現(xiàn)了模塊的插件式管理(plug-in/plug-out)洲敢。所以漫玄,Hyperledger Fabric是一個(gè)私有鏈/聯(lián)盟鏈的開發(fā)框架,而且系統(tǒng)的運(yùn)行不需要token支持压彭。
關(guān)鍵組件
Ledger:賬本睦优,節(jié)點(diǎn)維護(hù)的區(qū)塊鏈和狀態(tài)數(shù)據(jù)庫
World state:世界狀態(tài),經(jīng)過數(shù)次交易后最新的鍵值對
Channel: 通道壮不,私有的子網(wǎng)絡(luò)汗盘,通道中的節(jié)點(diǎn)共同維護(hù)賬本,實(shí)現(xiàn)數(shù)據(jù)的隔離和保密询一。 每個(gè)channel對應(yīng)一個(gè)賬本隐孽,由加入該channel的peer維護(hù),一個(gè)peer可以加入多個(gè)channel健蕊,維護(hù)多個(gè)賬本菱阵。
Network:交易處理節(jié)點(diǎn)之間的P2P網(wǎng)絡(luò),用于維持區(qū)塊鏈賬本的一致性绊诲。
Org:Orginazation送粱,管理一系列成員的組織。一個(gè)channel內(nèi)可以有多個(gè)組織掂之。
Chainnode:鏈碼抗俄,運(yùn)行在節(jié)點(diǎn)內(nèi)的程序脆丁,目前支持Go、Nodejs动雹、Java槽卫,運(yùn)行在隔離的容器中,提供業(yè)務(wù)邏輯接口胰蝠,對賬本進(jìn)行查詢或更新
Endorse:背書階段歼培,指一個(gè)節(jié)點(diǎn)執(zhí)行了一個(gè)交易并對結(jié)果進(jìn)行簽名后返回響應(yīng)的過程(負(fù)責(zé)校驗(yàn)?zāi)硞€(gè)交易是否合法)。
Ordering Service:排序服務(wù)茸塞,將交易排序后放入?yún)^(qū)塊中躲庄,并廣播給網(wǎng)絡(luò)各節(jié)點(diǎn)
PKI:Public Key Infrastructure,一種遵循標(biāo)準(zhǔn)的利用公鑰加密技術(shù)為電子商務(wù)的開展提供一套安全基礎(chǔ)平臺(tái)的技術(shù)和規(guī)范
MSP:Membership Service Provider钾虐,成員管理服務(wù)噪窘,基于PKI實(shí)現(xiàn),為網(wǎng)絡(luò)成員生成證書效扫,并管理身份
共識(shí)算法
在所有peers中倔监,交易信息必須按照一致的順序?qū)懭胭~本(區(qū)塊鏈的基本原則)。例如菌仁,比特幣通過POW機(jī)制浩习,由最先完成數(shù)學(xué)難題的節(jié)點(diǎn)決定本次區(qū)塊中的信息順序,并廣播給全網(wǎng)所有節(jié)點(diǎn)济丘,以此來達(dá)成賬本的共識(shí)谱秽。而Hyperledger Fabric采用了更加靈活、高效的共識(shí)算法闪盔,以適應(yīng)企業(yè)場景下弯院,對高TPS的要求。目前泪掀,Hyperledger Fabric有三種交易排序算法可以選擇听绳。
Solo:只有一個(gè)order服務(wù)節(jié)點(diǎn)負(fù)責(zé)接收交易信息并排序,這是最簡單的一種排序算法异赫,一般用在實(shí)驗(yàn)室測試環(huán)境中椅挣。Sole屬于中心化的處理方式。
Kafka:是Apache的一個(gè)開源項(xiàng)目塔拳,主要提供分布式的消息處理/分發(fā)服務(wù)鼠证,每個(gè)kafka集群由多個(gè)服務(wù)節(jié)點(diǎn)組成。Hyperledger Fabric利用kafka對交易信息進(jìn)行排序處理靠抑,提供高吞吐量九、低延時(shí)的處理能力,并且在集群內(nèi)部支持節(jié)點(diǎn)故障容錯(cuò)。
SBFT:簡單拜占庭算法荠列,相比于kafka类浪,提供更加可靠的排序算法,包括容忍節(jié)點(diǎn)故障以及一定數(shù)量的惡意節(jié)點(diǎn)肌似。目前费就,Hyperledger Fabric社區(qū)正在開發(fā)該算法。
節(jié)點(diǎn)架構(gòu)
Fabric的節(jié)點(diǎn)具有不同身份并提供不同職能川队,下面是網(wǎng)絡(luò)節(jié)點(diǎn)的示意圖力细。
一、Peer節(jié)點(diǎn)
記賬節(jié)點(diǎn):所有的Peer節(jié)點(diǎn)都是記賬 (committer) 節(jié)點(diǎn)固额,負(fù)責(zé)驗(yàn)證從排序服務(wù)接收到區(qū)塊中的交易眠蚂,維護(hù)賬本的副本
背書節(jié)點(diǎn):部分Peer節(jié)點(diǎn)會(huì)執(zhí)行交易并對結(jié)果簽名背書,充當(dāng)背書 (Endorsement) 節(jié)點(diǎn)对雪。背書節(jié)點(diǎn)是動(dòng)態(tài)的角色河狐,只有在應(yīng)用
程序向它發(fā)起背書請求的時(shí)候才是背書節(jié)點(diǎn),其他時(shí)候只是普通的記賬節(jié)點(diǎn)瑟捣,只負(fù)責(zé)驗(yàn)證交易并記賬主節(jié)點(diǎn)(Leader Peer):代表的是與排序節(jié)點(diǎn)通信的節(jié)點(diǎn),負(fù)責(zé)從排序服務(wù)節(jié)點(diǎn)處獲取最新的區(qū)塊并在組織內(nèi)部同步
二栅干、Orderer節(jié)點(diǎn)
排序服務(wù)節(jié)點(diǎn)接收包含背書簽名的交易迈套,并進(jìn)行排序、打包生成區(qū)塊碱鳞,廣播給Peer節(jié)點(diǎn)桑李,保證同一個(gè)鏈上的節(jié)點(diǎn)接收到相同的消息,并且有相同的邏輯順序
排序服務(wù)可以支持多鏈的交易處理窿给,實(shí)現(xiàn)了多通道的數(shù)據(jù)隔離贵白,保證只有同一個(gè)鏈的peer才能訪問鏈上的數(shù)據(jù)
排序服務(wù)可選擇集中式(Solo)或分布式(Kafka)協(xié)議,其中Kafka集群可以實(shí)現(xiàn)崩潰故障容錯(cuò)(CFT)
三崩泡、CA節(jié)點(diǎn)
CA節(jié)點(diǎn)是Fabric的證書頒發(fā)機(jī)構(gòu)(Certificate Authority)禁荒。
CA節(jié)點(diǎn)接收客戶端的注冊申請,返回注冊密碼用于用戶登陸角撞,以便獲取身份證書呛伴。
在區(qū)塊鏈網(wǎng)絡(luò)上所有的操作都會(huì)驗(yàn)證用戶的身份。
四谒所、Client節(jié)點(diǎn)
客戶端節(jié)點(diǎn)代表最終用戶操作的實(shí)體热康,它必須連接到某一個(gè)Peer節(jié)點(diǎn)或者排序服務(wù)節(jié)點(diǎn)上與區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行通信
客戶端節(jié)點(diǎn)向背書節(jié)點(diǎn)提交交易提案,收集到足夠背書后劣领,向排序服務(wù)廣播交易姐军,進(jìn)行排序,生成區(qū)塊
數(shù)據(jù)存儲(chǔ)
Fabric區(qū)塊鏈系統(tǒng)的數(shù)據(jù)存儲(chǔ)主要由一項(xiàng)文件存儲(chǔ)(區(qū)塊數(shù)據(jù))和三項(xiàng)數(shù)據(jù)庫組成,結(jié)構(gòu)如下圖奕锌。
一著觉、區(qū)塊數(shù)據(jù)
區(qū)塊(block)數(shù)據(jù)時(shí)以二進(jìn)制文件的形式存儲(chǔ)的,每個(gè)賬本數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)文件系統(tǒng)的不同目錄下
區(qū)塊數(shù)據(jù)存儲(chǔ)是通過區(qū)塊文件管理器(blockfileMgr)實(shí)現(xiàn)的歇攻,它來決定區(qū)塊存儲(chǔ)于哪個(gè)目錄下的哪個(gè)文件
區(qū)塊文件管理器創(chuàng)建的文件名以“blockifle_”為前綴固惯,6位數(shù)字位后綴,比如blockfile_000000缴守,默認(rèn)的區(qū)塊文件大小為64MB葬毫,如果當(dāng)前文件大小超過該值,則區(qū)塊寫入下一個(gè)文件中屡穗。
二贴捡、區(qū)塊索引
- Fabric提供多種索引方式,以方便能快速找到所需要區(qū)塊數(shù)據(jù)村砂。每次提交區(qū)塊后都會(huì)更新索引數(shù)據(jù)庫烂斋。索引方式(鍵)有:
- 區(qū)塊編號 (Block Number)
- 區(qū)塊哈希 (Block Hash)
- 交易編號 (Tx ID)
- 索引的內(nèi)容(值)是文件位置指針(File Location Pointer),結(jié)構(gòu)如下:
- fileSuffixNum:所在文件的編號
- offset:文件內(nèi)的偏移量
- bytesLength:內(nèi)容占用的字節(jié)數(shù)
三础废、狀態(tài)數(shù)據(jù)庫
狀態(tài)數(shù)據(jù)(State Database)記錄的是交易執(zhí)行的結(jié)果汛骂,最新的狀態(tài)代表了通道上所有鍵的最新值,所以又稱為“世界狀態(tài)”评腺。
交易或查詢操作調(diào)用鏈碼會(huì)根據(jù)當(dāng)前狀態(tài)數(shù)據(jù)庫來完成帘瞭。
狀態(tài)數(shù)據(jù)庫支持查詢單個(gè)鍵的數(shù)據(jù),多個(gè)鍵的數(shù)據(jù)以及一個(gè)范圍內(nèi)的數(shù)據(jù)蒿讥,如果使用的是CouchDB蝶念,還可以支持復(fù)雜的條件查詢。
四芋绸、歷史數(shù)據(jù)
歷史數(shù)據(jù)(History Database):記錄的是每個(gè)狀態(tài)數(shù)據(jù)的歷史信息媒殉,每個(gè)歷史信息以一個(gè)四元祖表示:
- namespace: 代表不同的chaincodeID
- writeKey:要寫入數(shù)據(jù)的鍵
- blockNo:要寫入數(shù)據(jù)所在的區(qū)塊編號
- tranNo:要寫入數(shù)據(jù)所在區(qū)塊內(nèi)的交易編號
交易流程
以下是Fabric的經(jīng)典交易流程,所有涉及到對賬本數(shù)據(jù)更新的操作都是基于這個(gè)交易流程來完成的摔敛。
發(fā)送交易提案
客戶端發(fā)送交易提案(Proposal)到背書節(jié)點(diǎn)廷蓉,提案中包含交易所需參數(shù)。模擬執(zhí)行交易提案
背書節(jié)點(diǎn)會(huì)調(diào)用鏈碼模擬執(zhí)行交易提案(Proposal)舷夺,這些執(zhí)行不會(huì)更新賬本
每個(gè)執(zhí)行都會(huì)產(chǎn)生對狀態(tài)數(shù)據(jù)讀出和寫入的數(shù)據(jù)集合苦酱,叫做讀寫集(RWsets),讀寫集是交易中記錄的主要內(nèi)容
返回提案響應(yīng)
背書節(jié)點(diǎn)會(huì)對讀寫集進(jìn)行背書(Endorse)簽名给猾,生成提案響應(yīng)(Proposal response)并返回給應(yīng)用程序交易排序
應(yīng)用程序根據(jù)接收到的提案響應(yīng)生成交易疫萤,并發(fā)送給排序服務(wù)節(jié)點(diǎn)。排序服務(wù)打包一組交易到一個(gè)區(qū)塊后敢伸,分發(fā)給各記賬節(jié)點(diǎn)扯饶。交易驗(yàn)證并提交
每個(gè)節(jié)點(diǎn)會(huì)對區(qū)塊中的所有交易進(jìn)行驗(yàn)證,包括驗(yàn)證背書策略以及版本沖突驗(yàn)證(防止雙花),驗(yàn)證不通過的交易會(huì)被標(biāo)記會(huì)無效(Invalid)
賬本更新:節(jié)點(diǎn)將讀寫集更新到狀態(tài)數(shù)據(jù)庫 尾序,將區(qū)塊提交到區(qū)塊鏈上
- 通知交易結(jié)果給客戶端
各記賬節(jié)點(diǎn)通知應(yīng)用程序交易的成功與否钓丰,交易完成。