超級賬本Fabric項目自誕生之日起就吸引了全球眾多企業(yè)的密切關(guān)注,已經(jīng)先后發(fā)布了兩個大的版本,0.6實驗版本(2016年9月)和1.0正式版本(2017年7月)。
目前,超級賬本Fabric架構(gòu)上核心特性主要包括:
-
解耦了原子排序環(huán)節(jié)與其他復雜處理環(huán)節(jié),消除了網(wǎng)絡(luò)處理瓶頸,提高可擴展性;
-
解耦交易處理節(jié)點的邏輯角色為背書節(jié)點(Endorser)、確認節(jié)點(Committer),可以根據(jù)負載進行靈活部署;
-
加強了身份證書管理服務(wù),作為單獨的Fabric CA項目,提供更多功能;
-
支持多通道特性,不同通道之間的數(shù)據(jù)彼此隔離,提高隔離安全性;
-
支持可拔插的架構(gòu),包括共識、權(quán)限管理、加解密、賬本機制都模塊,支持多種類型;
超級賬本Fabric的整體架構(gòu)如下圖所示。

Fabric為應用提供了gRPC API,以及封裝API的SDK供應用調(diào)用。應用可以通過SDK訪問Fabric網(wǎng)絡(luò)中的多種資源,包括賬本、交易、鏈碼、事件、權(quán)限管理等。應用開發(fā)者只需要跟這些資源打交道即可,無需關(guān)心如何實現(xiàn)。其中,賬本是最核心的結(jié)構(gòu),記錄應用信息,應用則通過發(fā)起交易來向賬本中記錄數(shù)據(jù)。交易執(zhí)行的邏輯通過鏈碼來承載。整個網(wǎng)絡(luò)運行中發(fā)生的事件可以被應用訪問,以觸發(fā)外部流程甚至其他系統(tǒng)。權(quán)限管理則負責整個過程中的訪問控制。賬本和交易進一步地依賴核心的區(qū)塊鏈結(jié)構(gòu)、數(shù)據(jù)庫、共識機制等技術(shù);鏈碼則依賴容器、狀態(tài)機等技術(shù);權(quán)限管理利用了已有的PKI體系、數(shù)字證書、加解密算法等諸多安全技術(shù)。底層由多個節(jié)點組成P2P網(wǎng)絡(luò),通過gRPC通道進行交互,利用Gossip協(xié)議進行同步。
層次化結(jié)構(gòu)提高了架構(gòu)的可擴展和可插拔性,方便開發(fā)者以模塊為單位進行開發(fā)。
超級賬本Fabric根據(jù)交易過程中不同環(huán)節(jié)的功能,在邏輯上將節(jié)點角色解耦為Endorser和Committer,讓不同類型節(jié)點可以關(guān)注處理不同類型的工作負載。典型的交易處理過程如下圖所示。

在整個交易過程中,各個組件的功能主要為:
-
客戶端(App):客戶端應用使用SDK來跟Fabric網(wǎng)絡(luò)打交道。首先,客戶端從CA獲取合法的身份證書來加入到網(wǎng)絡(luò)內(nèi)的應用通道。發(fā)起正式交易前,需要先構(gòu)造交易提案(Proposal)提交給Endorser進行背書(通過EndorserClient提供的ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)接口);客戶端收集到足夠(背書策略決定)的背書支持后可以利用背書構(gòu)造一個合法的交易請求,發(fā)給Orderer進行排序(通過BroadcastClient提供的Send(env *cb.Envelope)error接口)處理。客戶端還可以通過事件機制來監(jiān)聽網(wǎng)絡(luò)中消息,來獲知交易是否被成功接收。命令行客戶端的主要實現(xiàn)代碼在peer/chaincode目錄下。
-
Endorser節(jié)點:主要提供ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)方法(代碼在core/endorser/endorser.go文件)供客戶端調(diào)用,完成對交易提案的背書(目前主要是簽名)處理。收到來自客戶端的交易提案后,首先進行合法性和ACL權(quán)限檢查,檢查通過則模擬運行交易,對交易導致的狀態(tài)變化(以讀寫集形式記錄,包括所讀狀態(tài)的鍵和版本,所寫狀態(tài)的鍵值)進行背書并返回結(jié)果給客戶端。注意網(wǎng)絡(luò)中可以只有部分節(jié)點擔任Endorser角色。主要代碼在core/endorser目錄下;
-
Committer節(jié)點:負責維護區(qū)塊鏈和賬本結(jié)構(gòu)(包括狀態(tài)DB、歷史DB、索引DB等)。該節(jié)點會定期地從Orderer獲取排序后的批量交易區(qū)塊結(jié)構(gòu),對這些交易進行落盤前的最終檢查(包括交易消息結(jié)構(gòu)、簽名完整性、是否重復、讀寫集合版本是否匹配等)。檢查通過后執(zhí)行合法的交易,將結(jié)果寫入賬本,同時構(gòu)造新的區(qū)塊,更新區(qū)塊中BlockMetadata[2](TRANSACTIONS_FILTER)記錄交易是否合法等信息。同一個物理節(jié)點可以僅作為Committer角色運行,也可以同時擔任Endorser和Committer這兩種角色。主要實現(xiàn)代碼在core/committer目錄下;
-
Orderer:僅負責排序。為網(wǎng)絡(luò)中所有合法交易進行全局排序,并將一批排序后的交易組合生成區(qū)塊結(jié)構(gòu)。Orderer一般不需要跟賬本和交易內(nèi)容直接打交道。主要實現(xiàn)代碼在orderer目錄下。對外主要提供Broadcast(srv ab.AtomicBroadcast_BroadcastServer)error和Deliver(srv ab.AtomicBroadcast_DeliverServer)error兩個RPC方法(代碼在orderer/server.go文件);
-
CA:負責網(wǎng)絡(luò)中所有證書的管理(分發(fā)、撤銷等),實現(xiàn)標準的PKI架構(gòu)。主要代碼在單獨的fabric-ca項目中。CA在簽發(fā)證書后,自身不參與到網(wǎng)絡(luò)中的交易過程。
核心概念與組件
超級賬本Fabric采用了模塊化功能設(shè)計,整體的功能模塊結(jié)構(gòu)如下圖所示。

超級賬本Fabric面向不同的開發(fā)人員提供了不同層面的功能,自下而上可以分為三層:
-
網(wǎng)絡(luò)層:面向系統(tǒng)管理人員。實現(xiàn)P2P網(wǎng)絡(luò),提供底層構(gòu)建區(qū)塊鏈網(wǎng)絡(luò)的基本能力,包括代表不同角色的節(jié)點和服務(wù);
-
共識機制和權(quán)限管理:面向聯(lián)盟和組織的管理人員?;诰W(wǎng)絡(luò)層的連通,實現(xiàn)共識機制和權(quán)限管理,提供分布式賬本的基礎(chǔ);
-
業(yè)務(wù)層:面向業(yè)務(wù)應用開發(fā)人員?;诜植际劫~本,支持鏈碼、交易等跟業(yè)務(wù)相關(guān)的功能模塊,提供更高一層的應用開發(fā)支持。
下面介紹網(wǎng)絡(luò)層相關(guān)組件的功能和作用。
網(wǎng)絡(luò)層相關(guān)組件
網(wǎng)絡(luò)層通過軟、硬件設(shè)備,實現(xiàn)了對分布式賬本結(jié)構(gòu)的連通支持,包括節(jié)點、排序者、客戶端等參與角色,還包括成員身份管理、Gossip協(xié)議等支持組件。
節(jié)點(Peer)的概念最早來自P2P分布式網(wǎng)絡(luò),意味著在網(wǎng)絡(luò)中擔任一定職能的服務(wù)或軟件。節(jié)點功能可能是對等一致的,也可能是分工合作的。在超級賬本Fabric網(wǎng)絡(luò)中,Peer意味著在網(wǎng)絡(luò)中負責接受交易請求、維護一致賬本的各個fabric-peer實例。這些實例可能運行在裸機、虛擬機甚至容器中。節(jié)點之間彼此通過gRPC消息進行通信。按照功能角色劃分,Peer可以包括三種類型:
-
Endorser(背書節(jié)點):負責對來自客戶端的交易提案進行檢查和背書;
-
Committer(確認節(jié)點):負責檢查交易請求,執(zhí)行交易并維護區(qū)塊鏈和賬本結(jié)構(gòu);
-
Submitter(提交節(jié)點):負責接收交易,轉(zhuǎn)發(fā)給排序者,目前未單獨出現(xiàn)。
這些角色是功能上的劃分,彼此并不相互排斥。一般情況下,網(wǎng)絡(luò)中所有節(jié)點都具備Committer功能;部分節(jié)點具有Endorser功能;Submitter功能則往往集成在客戶端(SDK)進行實現(xiàn)。
Peer節(jié)點相關(guān)的主要數(shù)據(jù)結(jié)構(gòu)包括PeerEndpoint和endorserClient。前者代表一個Peer節(jié)點在網(wǎng)絡(luò)中的接入端點;后者實現(xiàn)EndorserClient接口,代表連接到Peer節(jié)點的客戶端句柄,提供對Endorser角色實現(xiàn)的ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse, error)方法的訪問。如下圖所示。

排序者(Orderer),或稱為排序節(jié)點,負責對所收到的交易在網(wǎng)絡(luò)中進行全局排序。Orderer主要提供了Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error和Deliver(srv ab.AtomicBroadcast_DeliverServer) error兩個接口。前者代表客戶端將數(shù)據(jù)(交易)發(fā)給Orderer,后者代表從Orderer獲取到排序后構(gòu)造的區(qū)塊結(jié)構(gòu)??蛻舳丝梢允褂胊tomicBroadcastClient結(jié)構(gòu)訪問這兩個接口。atomicBroadcastClient結(jié)構(gòu)如下圖所示,維持了一個gRPC的雙向通道。

Orderer可以支持多通道。不同通道之間彼此隔離,通道內(nèi)交易相關(guān)信息將僅發(fā)往加入到通道內(nèi)的Peer(同樣基于gRPC消息),從而提高隱私性和安全性。在目前的設(shè)計中,所有的交易信息都會從Orderer經(jīng)過,因此,Orderer節(jié)點在網(wǎng)絡(luò)中必須處于可靠、可信的地位。
從功能上看,Orderer的目的是對網(wǎng)絡(luò)中的交易分配全局唯一的序號,實際上并不需要交易相關(guān)的具體數(shù)據(jù)內(nèi)容。因此為了進一步提高隱私性,發(fā)往Orderer的可以不是完整的交易數(shù)據(jù),而是部分信息,比如交易加密處理后的結(jié)果,或者僅僅是交易的Hash值、Id信息等。這些改進設(shè)計會降低對Orderer節(jié)點可靠性和安全性的需求。社區(qū)目前也已經(jīng)有了一些類似的設(shè)計討論(參考FAB-1151:Side DB-Private Channel Data)。
客戶端是用戶和應用跟區(qū)塊鏈網(wǎng)絡(luò)打交道的橋梁??蛻舳酥饕▋纱舐毮埽?/p>
-
操作Fabric網(wǎng)絡(luò):包括更新網(wǎng)絡(luò)配置、啟停節(jié)點等;
-
操作運行在網(wǎng)絡(luò)中的鏈碼:包括安裝、實例化、發(fā)起交易調(diào)用鏈碼等。
這些操作需要跟Peer節(jié)點和Orderer節(jié)點打交道。特別是鏈碼實例化、交易等涉及到共識的操作,需要跟Orderer交互,因此,客戶端往往也需要具備Submitter的能力。網(wǎng)絡(luò)中的Peer和Orderer等節(jié)點則對應提供了gRPC遠程服務(wù)訪問接口,供客戶端進行調(diào)用。目前,除了基于命令行的客戶端之外,超級賬本Fabric已經(jīng)擁有了多種語言的SDK。這些SDK封裝了對底層gRPC接口的調(diào)用,可以提供更完善的客戶端和開發(fā)支持,包括Node.Js、Python、Java、Go等多種實現(xiàn)。
CA節(jié)點(Fabric-CA)負責對Fabric網(wǎng)絡(luò)中的成員身份進行管理。Fabric網(wǎng)絡(luò)目前采用數(shù)字證書機制來實現(xiàn)對身份的鑒別和權(quán)限控制,CA節(jié)點則實現(xiàn)了PKI服務(wù),主要負責對身份證書進行管理,包括生成、撤銷等。需要注意的是,CA節(jié)點可以提前簽發(fā)身份證書,發(fā)送給對應的成員實體,這些實體在部署證書后即可訪問網(wǎng)絡(luò)中的各項資源。后續(xù)訪問過程中,實體無須再次向CA節(jié)點進行請求。因此,CA節(jié)點的處理過程跟網(wǎng)絡(luò)中交易的處理過程是完全解耦開的,不會造成性能瓶頸。
Fabric網(wǎng)絡(luò)中的節(jié)點之間通過Gossip協(xié)議來進行狀態(tài)同步和數(shù)據(jù)分發(fā)。Gossip協(xié)議是P2P領(lǐng)域的常見協(xié)議,用于進行網(wǎng)絡(luò)內(nèi)多個節(jié)點之間的數(shù)據(jù)分發(fā)或信息交換。由于其設(shè)計簡單,容易實現(xiàn),同時容錯性比較高,而被廣泛應用到了許多分布式系統(tǒng),例如Cassandra采用它來實現(xiàn)集群失敗檢測和負載均衡。Gossip協(xié)議的基本思想十分簡單,數(shù)據(jù)發(fā)送方從網(wǎng)絡(luò)中隨機選取若干節(jié)點,將數(shù)據(jù)發(fā)送過去;接收方重復這一過程(往往只選擇發(fā)送方之外節(jié)點進行傳播)。這一過程持續(xù)下去,網(wǎng)絡(luò)中所有節(jié)點最終(時間復雜度為節(jié)點總個數(shù)的對數(shù))都會達到一致。數(shù)據(jù)傳輸?shù)姆较蚩梢允前l(fā)送方發(fā)送或獲取方拉取。
在Fabric網(wǎng)絡(luò)中,節(jié)點會定期地利用Gossip協(xié)議發(fā)送它看到的賬本的最新的數(shù)據(jù),并對發(fā)送消息進行簽名認證。通過使用該協(xié)議,主要實現(xiàn)如下功能:
-
通道內(nèi)成員的探測:新加入通道的節(jié)點可以獲知其他節(jié)點的信息,并發(fā)送Alive信息宣布在線;離線節(jié)點經(jīng)過一段時間后可以被其他節(jié)點感知。
-
節(jié)點之間同步數(shù)據(jù):多個節(jié)點之間彼此同步數(shù)據(jù),保持一致性。另外,Leader節(jié)點從Orderer拉取區(qū)塊數(shù)據(jù)后,也可以通過Gossip傳播給通道內(nèi)其他、節(jié)點。
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7814瀏覽量
90921 -
設(shè)計
+關(guān)注
關(guān)注
4文章
822瀏覽量
70543 -
Fabric
+關(guān)注
關(guān)注
0文章
44瀏覽量
7506 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
528瀏覽量
25980
原文標題:超級賬本Fabric的架構(gòu)與設(shè)計
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
阿里云容器服務(wù)區(qū)塊鏈解決方案全新升級 支持Hyperledger Fabric v1.1
Imagination 宣布與 NetSpeed 合作開發(fā)新的 Fabric 架構(gòu)技術(shù)
超級賬本架構(gòu)分析

Julian Gordon:2018年是超級賬本和區(qū)塊鏈進入全盛時期的一年
什么是超級賬本,其發(fā)展進展又如何
阿里云成為Hyperledger超級賬本全球會員,發(fā)力區(qū)塊鏈生態(tài)建設(shè)
超級賬本Hyperledger對區(qū)塊鏈的應用

基于區(qū)塊鏈技術(shù)的智能商務(wù)平臺ElamaChain介紹

評論