超級賬本Fabric項目自誕生之日起就吸引了全球眾多企業的密切關注,已經先后發布了兩個大的版本,0.6實驗版本(2016年9月)和1.0正式版本(2017年7月)。
目前,超級賬本Fabric架構上核心特性主要包括:
-
解耦了原子排序環節與其他復雜處理環節,消除了網絡處理瓶頸,提高可擴展性;
-
加強了身份證書管理服務,作為單獨的Fabric CA項目,提供更多功能;
-
支持多通道特性,不同通道之間的數據彼此隔離,提高隔離安全性;
-
支持可拔插的架構,包括共識、權限管理、加解密、賬本機制都模塊,支持多種類型;
超級賬本Fabric的整體架構如下圖所示。
Fabric為應用提供了gRPC API,以及封裝API的SDK供應用調用。應用可以通過SDK訪問Fabric網絡中的多種資源,包括賬本、交易、鏈碼、事件、權限管理等。應用開發者只需要跟這些資源打交道即可,無需關心如何實現。其中,賬本是最核心的結構,記錄應用信息,應用則通過發起交易來向賬本中記錄數據。交易執行的邏輯通過鏈碼來承載。整個網絡運行中發生的事件可以被應用訪問,以觸發外部流程甚至其他系統。權限管理則負責整個過程中的訪問控制。賬本和交易進一步地依賴核心的區塊鏈結構、數據庫、共識機制等技術;鏈碼則依賴容器、狀態機等技術;權限管理利用了已有的PKI體系、數字證書、加解密算法等諸多安全技術。底層由多個節點組成P2P網絡,通過gRPC通道進行交互,利用Gossip協議進行同步。
層次化結構提高了架構的可擴展和可插拔性,方便開發者以模塊為單位進行開發。
超級賬本Fabric根據交易過程中不同環節的功能,在邏輯上將節點角色解耦為Endorser和Committer,讓不同類型節點可以關注處理不同類型的工作負載。典型的交易處理過程如下圖所示。
在整個交易過程中,各個組件的功能主要為:
-
客戶端(App):客戶端應用使用SDK來跟Fabric網絡打交道。首先,客戶端從CA獲取合法的身份證書來加入到網絡內的應用通道。發起正式交易前,需要先構造交易提案(Proposal)提交給Endorser進行背書(通過EndorserClient提供的ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)接口);客戶端收集到足夠(背書策略決定)的背書支持后可以利用背書構造一個合法的交易請求,發給Orderer進行排序(通過BroadcastClient提供的Send(env *cb.Envelope)error接口)處理。客戶端還可以通過事件機制來監聽網絡中消息,來獲知交易是否被成功接收。命令行客戶端的主要實現代碼在peer/chaincode目錄下。
-
Endorser節點:主要提供ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)方法(代碼在core/endorser/endorser.go文件)供客戶端調用,完成對交易提案的背書(目前主要是簽名)處理。收到來自客戶端的交易提案后,首先進行合法性和ACL權限檢查,檢查通過則模擬運行交易,對交易導致的狀態變化(以讀寫集形式記錄,包括所讀狀態的鍵和版本,所寫狀態的鍵值)進行背書并返回結果給客戶端。注意網絡中可以只有部分節點擔任Endorser角色。主要代碼在core/endorser目錄下;
-
Committer節點:負責維護區塊鏈和賬本結構(包括狀態DB、歷史DB、索引DB等)。該節點會定期地從Orderer獲取排序后的批量交易區塊結構,對這些交易進行落盤前的最終檢查(包括交易消息結構、簽名完整性、是否重復、讀寫集合版本是否匹配等)。檢查通過后執行合法的交易,將結果寫入賬本,同時構造新的區塊,更新區塊中BlockMetadata[2](TRANSACTIONS_FILTER)記錄交易是否合法等信息。同一個物理節點可以僅作為Committer角色運行,也可以同時擔任Endorser和Committer這兩種角色。主要實現代碼在core/committer目錄下;
-
Orderer:僅負責排序。為網絡中所有合法交易進行全局排序,并將一批排序后的交易組合生成區塊結構。Orderer一般不需要跟賬本和交易內容直接打交道。主要實現代碼在orderer目錄下。對外主要提供Broadcast(srv ab.AtomicBroadcast_BroadcastServer)error和Deliver(srv ab.AtomicBroadcast_DeliverServer)error兩個RPC方法(代碼在orderer/server.go文件);
-
CA:負責網絡中所有證書的管理(分發、撤銷等),實現標準的PKI架構。主要代碼在單獨的fabric-ca項目中。CA在簽發證書后,自身不參與到網絡中的交易過程。
核心概念與組件
超級賬本Fabric采用了模塊化功能設計,整體的功能模塊結構如下圖所示。
超級賬本Fabric面向不同的開發人員提供了不同層面的功能,自下而上可以分為三層:
-
網絡層:面向系統管理人員。實現P2P網絡,提供底層構建區塊鏈網絡的基本能力,包括代表不同角色的節點和服務;
-
共識機制和權限管理:面向聯盟和組織的管理人員。基于網絡層的連通,實現共識機制和權限管理,提供分布式賬本的基礎;
-
業務層:面向業務應用開發人員。基于分布式賬本,支持鏈碼、交易等跟業務相關的功能模塊,提供更高一層的應用開發支持。
下面介紹網絡層相關組件的功能和作用。
網絡層相關組件
網絡層通過軟、硬件設備,實現了對分布式賬本結構的連通支持,包括節點、排序者、客戶端等參與角色,還包括成員身份管理、Gossip協議等支持組件。
節點(Peer)的概念最早來自P2P分布式網絡,意味著在網絡中擔任一定職能的服務或軟件。節點功能可能是對等一致的,也可能是分工合作的。在超級賬本Fabric網絡中,Peer意味著在網絡中負責接受交易請求、維護一致賬本的各個fabric-peer實例。這些實例可能運行在裸機、虛擬機甚至容器中。節點之間彼此通過gRPC消息進行通信。按照功能角色劃分,Peer可以包括三種類型:
-
Endorser(背書節點):負責對來自客戶端的交易提案進行檢查和背書;
-
Committer(確認節點):負責檢查交易請求,執行交易并維護區塊鏈和賬本結構;
-
Submitter(提交節點):負責接收交易,轉發給排序者,目前未單獨出現。
這些角色是功能上的劃分,彼此并不相互排斥。一般情況下,網絡中所有節點都具備Committer功能;部分節點具有Endorser功能;Submitter功能則往往集成在客戶端(SDK)進行實現。
Peer節點相關的主要數據結構包括PeerEndpoint和endorserClient。前者代表一個Peer節點在網絡中的接入端點;后者實現EndorserClient接口,代表連接到Peer節點的客戶端句柄,提供對Endorser角色實現的ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse, error)方法的訪問。如下圖所示。
排序者(Orderer),或稱為排序節點,負責對所收到的交易在網絡中進行全局排序。Orderer主要提供了Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error和Deliver(srv ab.AtomicBroadcast_DeliverServer) error兩個接口。前者代表客戶端將數據(交易)發給Orderer,后者代表從Orderer獲取到排序后構造的區塊結構。客戶端可以使用atomicBroadcastClient結構訪問這兩個接口。atomicBroadcastClient結構如下圖所示,維持了一個gRPC的雙向通道。
Orderer可以支持多通道。不同通道之間彼此隔離,通道內交易相關信息將僅發往加入到通道內的Peer(同樣基于gRPC消息),從而提高隱私性和安全性。在目前的設計中,所有的交易信息都會從Orderer經過,因此,Orderer節點在網絡中必須處于可靠、可信的地位。
從功能上看,Orderer的目的是對網絡中的交易分配全局唯一的序號,實際上并不需要交易相關的具體數據內容。因此為了進一步提高隱私性,發往Orderer的可以不是完整的交易數據,而是部分信息,比如交易加密處理后的結果,或者僅僅是交易的Hash值、Id信息等。這些改進設計會降低對Orderer節點可靠性和安全性的需求。社區目前也已經有了一些類似的設計討論(參考FAB-1151:Side DB-Private Channel Data)。
客戶端是用戶和應用跟區塊鏈網絡打交道的橋梁。客戶端主要包括兩大職能:
-
操作Fabric網絡:包括更新網絡配置、啟停節點等;
-
操作運行在網絡中的鏈碼:包括安裝、實例化、發起交易調用鏈碼等。
這些操作需要跟Peer節點和Orderer節點打交道。特別是鏈碼實例化、交易等涉及到共識的操作,需要跟Orderer交互,因此,客戶端往往也需要具備Submitter的能力。網絡中的Peer和Orderer等節點則對應提供了gRPC遠程服務訪問接口,供客戶端進行調用。目前,除了基于命令行的客戶端之外,超級賬本Fabric已經擁有了多種語言的SDK。這些SDK封裝了對底層gRPC接口的調用,可以提供更完善的客戶端和開發支持,包括Node.Js、Python、Java、Go等多種實現。
CA節點(Fabric-CA)負責對Fabric網絡中的成員身份進行管理。Fabric網絡目前采用數字證書機制來實現對身份的鑒別和權限控制,CA節點則實現了PKI服務,主要負責對身份證書進行管理,包括生成、撤銷等。需要注意的是,CA節點可以提前簽發身份證書,發送給對應的成員實體,這些實體在部署證書后即可訪問網絡中的各項資源。后續訪問過程中,實體無須再次向CA節點進行請求。因此,CA節點的處理過程跟網絡中交易的處理過程是完全解耦開的,不會造成性能瓶頸。
Fabric網絡中的節點之間通過Gossip協議來進行狀態同步和數據分發。Gossip協議是P2P領域的常見協議,用于進行網絡內多個節點之間的數據分發或信息交換。由于其設計簡單,容易實現,同時容錯性比較高,而被廣泛應用到了許多分布式系統,例如Cassandra采用它來實現集群失敗檢測和負載均衡。Gossip協議的基本思想十分簡單,數據發送方從網絡中隨機選取若干節點,將數據發送過去;接收方重復這一過程(往往只選擇發送方之外節點進行傳播)。這一過程持續下去,網絡中所有節點最終(時間復雜度為節點總個數的對數)都會達到一致。數據傳輸的方向可以是發送方發送或獲取方拉取。
在Fabric網絡中,節點會定期地利用Gossip協議發送它看到的賬本的最新的數據,并對發送消息進行簽名認證。通過使用該協議,主要實現如下功能:
-
通道內成員的探測:新加入通道的節點可以獲知其他節點的信息,并發送Alive信息宣布在線;離線節點經過一段時間后可以被其他節點感知。
-
節點之間同步數據:多個節點之間彼此同步數據,保持一致性。另外,Leader節點從Orderer拉取區塊數據后,也可以通過Gossip傳播給通道內其他、節點。
-
網絡
+關注
關注
14文章
7599瀏覽量
89247 -
設計
+關注
關注
4文章
818瀏覽量
69951 -
Fabric
+關注
關注
0文章
44瀏覽量
7309 -
架構
+關注
關注
1文章
519瀏覽量
25551
原文標題:超級賬本Fabric的架構與設計
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論