天天看點

超級賬本Fabric的架構與設計

超級賬本Fabric項目自誕生之日起就吸引了全球衆多企業的密切關注,已經先後釋出了兩個大的版本,0.6實驗版本(2016年9月)和1.0正式版本(2017年7月)。

目前,超級賬本Fabric架構上核心特性主要包括:

  • 解耦了原子排序環節與其他複雜處理環節,消除了網絡處理瓶頸,提高可擴充性;
  • 解耦交易處理節點的邏輯角色為背書節點(Endorser)、确認節點(Committer),可以根據負載進行靈活部署;
  • 加強了身份證書管理服務,作為單獨的Fabric CA項目,提供更多功能;
  • 支援多通道特性,不同通道之間的資料彼此隔離,提高隔離安全性;
  • 支援可拔插的架構,包括共識、權限管理、加解密、賬本機制都子產品,支援多種類型;
  • 引入系統鍊碼來實作區塊鍊系統的處理,支援可程式設計和第三方實作。

超級賬本Fabric的整體架構如下圖所示。

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核心元件

超級賬本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)方法的通路。如下圖所示。

Peer節點相關資料結構

排序者(Orderer),或稱為排序節點,負責對所收到的交易在網絡中進行全局排序。Orderer主要提供了Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error和Deliver(srv ab.AtomicBroadcast_DeliverServer) error兩個接口。前者代表用戶端将資料(交易)發給Orderer,後者代表從Orderer擷取到排序後構造的區塊結構。用戶端可以使用atomicBroadcastClient結構通路這兩個接口。atomicBroadcastClient結構如下圖所示,維持了一個gRPC的雙向通道。

atomicBroadcastClient結構

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傳播給通道内其他、節點。 

原文釋出時間為:2017年09月07日

本文作者:區塊鍊大學營

本文來源:

CSDN區塊鍊大學營

,如需轉載請聯系原作者。