hyperledger fabric專案概述
Hyperledger,中文名為超級賬本,是Linux基金會于2015年發起的推進區塊鏈數字技術和交易驗證的開源專案,Hyperledger的目標是讓成員共同合作、共建開放平臺以滿足來自多個不同行業各種用戶的需求,同時能大大簡化業務流程,
隨著hyperledger專案的不斷擴大,單一的專案無法滿足業務的需求,因此hyperledger逐步由一個單一的專案發展成一個專案組,而hyperledger fabric就是其中一個專案,hyperledger專案組主要的專案如下:

fabric的特點
- 相對于公有鏈,fabric更適合于企業級業務,
- 高度模塊化和可配置的結構,可為各行各業的業務提供創新性、多樣性和優化,
- 支持通用編程語言撰寫智能合約,
- 參與者的身份不能是匿名或者不可信任的
- 可拔插共識協議,使得平臺能夠更有效地進行定制,以適應特定的業務場景和信任模型
- 不需要原生加密貨幣的共識協議來激勵挖礦或者推動智能合約的執行,降低了系統的風險,并且可以與其他分布式系統大致相同的運營成本部署平臺
fabric的關鍵組件
節點(Peer)
節點是區塊鏈交易處理和賬本維護的主體,主要負責參與共識程序和通過執行鏈碼實作對賬本的讀寫操作,Peer根據功能的不同可以分為背書節點(Endorser Peer)、提交節點(Committer Peer)、根據通信不同分為錨節點(Anchor Peer)、主節點(Leader Peer),
- 背書節點:背書節點負責根據事先設定策略對交易進行簽名背書,在鏈碼實體化的時候設定背書策略,指定哪些節點用于背書,當客戶端向節點發起交易背書時,該節點才有背書功能,否則只是普通的記賬節點,
- 提交節點:該節點負責維護狀態資料和賬本的副本,
- 錨節點:錨節點是隨通道存在的,是能被其他通道發現的節點,每個通道上有一個或多個錨節點,
- 主節點:主節點負責與Orderer通信,把共識后的區塊傳輸到其他節點,
排序服務(Orderer)
排序服務為區塊鏈網路中不同通道產生的交易進行排序,并廣播給節點,排序服務獨立于節點流程之外,并以先到先處理的方式為網路上所有通道做交易排序,排序服務是以可插拔組件的方式實作的,目前默認實作了solo、Kafka和Raft,排序服務與整個網路相系結,包含與每個成員相關的加密材料,
排序服務又可以稱為共識,是計算機科學深入研究的一個領域,有許多方法可以實作它,每種方法都有不同的權衡,例如PBFT(實用拜占庭容錯)可以為檔案副本提供一種相互通信的機制,使其能夠保持各個副本的一致性,即使在發生損壞的情況下也是如此,又如在位元幣中,通過作業量證明(POW)進行排序,在這個程序中,相互競爭的計算機競相解決一個密碼難題,這個謎題定義了所有程序隨后建立的順序,
客戶端(Client)
客戶端是與fabric網路組件發送請求進行交行的介面,包括:
- Fabric-CA客戶端:負責節點注冊登記,包括登記注冊用戶資訊、獲取注冊證書與私鑰資訊等,
- CA節點:CA(Certificate Authority)節點類似于證書機構,提供用戶身份注冊服務,基于數字證書與標準的PKI服務管理fabric網路中的成員身份資訊,管理證書生命周期如創建、撤銷、認證等操作,以及身份鑒別與權限控制功能,包括Ecerts(身份證書)、Tcerts(交易證書)等,
- Fabric客戶端:負責網路配置與節點管理,包括初始化與更新配置、啟動和停止節點等,同時,還負責通道管理(創建、更新、查詢等)與鏈碼生命周期管理(安裝、實體化、呼叫、升級等),能通過Peer節點服務客戶端發送訊息給背書節點與排序服務請求處理,包括交易背書、創建通道、更新通道配置、交易排序、請求區塊資料等,
- 目前fabric客戶端包括CLI命令列和多種語言的SDK(例如:Node.js、Go、Java、Python等),SDK提供了與其他服務節點進行互動的API介面,包括了配置操作、通道操作、鏈碼操作、節點操作、日志操作等,支持開發豐富的應用程式,
鏈碼(Chaincode)
鏈碼就是fabric的智能合約,其應用了一種新的架構:執行—排序—驗證,解決了順序執行模型面臨的彈性、靈活性、可伸縮性、性能和機密性的問題,并且在交易達成最終一致前執行交易,其執行交易的執行流程分為三個步驟:
- 執行一個交易并檢查其正確性,從而給它背書,
- 通過共識協議將交易排序
- 提交交易到賬本前先根據特定的應用程式的背書策略驗證交易
fabric的智能合約分為系統鏈碼和用戶鏈碼,通常情況下,鏈碼要經過安裝和實體化步驟之后才能正常呼叫,同時必須實作Chaincode型別介面的Init()方法與Invoke()方法,
- 系統鏈碼在節點啟動或者初始化新鏈結構(節點加入通道、節點啟動恢復等)時完成部署,用于支持配置管理、背書簽名、鏈碼生命周期管理等系統功能,并運行在goroutine中,有一下五類系統鏈碼:
- CSCC(Configuration System Chaincode):配置系統鏈碼,負責管理系統配置,支持的命令包括JoinChain節點加入應用通道、GetConfigBlock獲取通道配置區塊、UpdateConfigBlock更新通道配置區塊、GetChannels獲取節點加入的通道串列等,
- ESCC(Endorsement System Chiancode):背書管理系統鏈碼,負責對模擬執行結果背書簽名,并創建提案回應訊息,同時設定管理背書策略,
- LSCC(Lifecycle System Chaincode):生命周期系統鏈碼,負責管理用戶鏈碼的生命周期,如打包、安裝、實體化、升級、呼叫、查詢等鏈碼操作,
- QSCC(Query System Chaincode):查詢系統鏈碼,負責查詢賬本和區塊鏈資訊,支持的命令包括:GetChainInfo獲取區塊鏈資訊、GetBlockByNumber獲取指定區塊號的區塊資料、GetBlockByHash獲取指定區塊頭哈希值的區塊資料、GetTransactionByID獲取指定交易ID的交易資料、GetBlockByTxID獲取指定交易TxID的區塊資料等,
- VSCC(Verification System Chaincode):驗證系統鏈碼,負責對交易資料進行驗證,并檢查簽名背書資訊是否滿足預定的背書策略,
- 用戶鏈碼是指用戶撰寫的智能合約代碼,通常運行在Docker容器內,支持打包、安裝、實體化、升級、呼叫等鏈碼操作,
通道(Channel)
通道是用于資料隔離和保密的一個私有區塊鏈,通道中的節點共享該通道的賬本,交易方必須通過該通道的授權才能與賬本進行互動,通道是由一個配置區塊來定義的, fabric的通道分為應用通道和系統通道:
- 應用通道:保存應用程式的配置等,為應用程式處理交易提供隔離機制,在指定通道的組織成員間共享賬本資料,客戶端向Orderer節點發送通道配置交易資訊創建應用通道,并生成該通道的創世塊,同時還可以提交新的通道配置交易資訊以更新通道配置,另外,應用通道賬本上還保存了應用通道的創世塊、配置區塊與普通交易區塊,fabric創建或更新應用通道時,必須制定通道配置交易檔案,
- 系統通道:保存Orderer配置(共識組件型別、服務地址、出塊規則、通道數量等)、系統通道的創世塊及其更新的配置區塊,基于系統通道配置與應用通道配置交易訊息創建新的應用通道,并將其注冊到Orderer的多通道注冊器Registrar物件上,同時啟動通道共識組件鏈物件,從而能夠正常處理應用通道上的交易訊息請求,
賬本(Ledger)
賬本記錄著業務的當前狀態,就像一個交易日記,它呈現了一組賬本狀態的當前值,同時記錄了促成了賬本狀態的交易歷史,fabric的賬本由世界狀態和區塊鏈兩部分組成,
- 世界狀態:世界狀態是一個資料庫,它存盤了一組賬本狀態的當前值,通過世界狀態,程式可以直接訪問一個賬本狀態的當前值,不需要遍歷整個交易日志來記錄當前值,默認情況下,賬本狀態是以鍵值對的方式表示的,
- 區塊鏈:區塊鏈是交易日志,它記錄了促成當前世界狀態的所有改變,交易被收集在附加到區塊鏈的區塊中,能幫助我們理解所有促成當前世界狀態的改變歷史,其中每個區塊結構如下:
- 區塊頭:區塊頭包含三個欄位,這些欄位在創建一個區塊時被寫入:
- 區塊編號:編號從0開始,每在區塊鏈上增加一個新的區塊,編號就會加1
- 當前區塊的哈希值:當前區塊中包含所有交易的哈希值
- 前一個區塊頭的哈希值:區塊鏈中一個區塊頭的哈希值
- 區塊資料:這部分包含了一個有序的交易串列,區塊資料是在排序服務創建區塊時被寫入的:
- 交易頭:記錄了關于交易的一些重要元資料,比如相關鏈碼的名字以及版本
- 交易簽名:包含了一個由客戶端應用程式創建的加密簽名,該欄位是用來檢查交易細節是否被修改,因為交易簽名的生成需要用到應用程式的私鑰,
- 交易提案:負責對應用程式提供會給智能合約輸入引數的進行編碼,隨后該智能合約生成提案賬本更新,在智能合約運行時,這個提案提供了一套輸入引數,這些引數同當前的世界狀態一起決定了新的賬本的世界狀態,
- 交易回應:它是以讀寫集的形式記錄下世界狀態之前和之后的值,交易回應是智能合約的輸出,如果交易驗證成功,那么該交易會被應用到賬本上,從而更新世界狀態,
- 交易背書:它指的是一組簽名交易回應,這些簽名都來自背書策略規定的相關組織,并且這些組織的數量必須滿足背書策略的要求,
- 區塊元資料:這個部分包含了區塊被寫入的時間、區塊寫入者的證書、公鑰以及簽名,隨后,區塊的提交者也會為每一筆交易添加一個有效或無效的標記,但由于這一資訊與區塊同時產生,所以它不會被包含在哈希中
- 區塊頭:區塊頭包含三個欄位,這些欄位在創建一個區塊時被寫入:
賬本具有以下特征:
- 查詢和使用基于鍵的查找更新賬本、范圍查詢和組合鍵查詢
- 使用富查詢語言的只讀查詢(需使用CouchDB作為狀態資料庫)
- 只讀歷史查詢——查詢某一個鍵的賬本歷史記錄
- 交易由鏈碼中讀取的鍵/值版本和鏈碼中寫入的鍵/值的版本組成
- 交易包含每個背書節點的簽名,并提交給排序服務
- 交易排序后進入區塊,并從排序服務廣播到通道的節點上
- 節點根據背書策略驗證交易并執行這些策略
- 在添加區塊之前,執行版本控制檢查,以確保所讀取的資產的狀態自鏈碼執行時間以來沒有更改
- 一旦交易被驗證和提交,就不可更改
- 通道的賬本包含一個定義的了策略、訪問控制串列和其他相關資訊的區塊配置
- 通道包含成員服務提供者實體,允許從不同的證書頒發機構派發加密材料
區塊鏈網路
區塊鏈網路是為應用程式提供賬本和智能合約服務的技識訓礎設施,首先,智能合約用于生產交易,這些交易隨后被分發到網路中的每一個節點,并在每個節點的賬本副本上記錄下來并且是不可篡改的,這個應用程式的用戶可能是客戶端應用的最終用戶,或者是一個區塊鏈網路的管理員
在大多數情況下,多個組織作為一個聯盟聚集在一起形成網路,它們的權限由一組策略決定,這些策略在最初配置網路時由聯盟決定,網路的策略也可以進行改變,這取決于聯盟中組織的協議
fabric架構
fabric 邏輯架構
fabric的架構分為網路層、核心層和介面層,
核心層
- 成員服務(Membership Services):提供成員服務功能,包括注冊、登記、申請證書等功能,節點只有獲得證書才能加入到區塊鏈網路中,在1.0版本以后,由可拔插的Fabric CA組件進行處理,
- 區塊鏈服務(BlockChain Services):負責賬本的計算和存盤、節點間的排序服務、背書驗證管理以及賬本存盤方式等功能的實作,是區塊鏈的核心組成部分,為區塊鏈的主體功能提供了底層支撐,
- 鏈碼服務(Chaincode Services):鏈碼和底層賬本是解耦的,鏈碼的更新不會影響原有的資料,運行與單獨的容器內,安裝和實體化后通過gRPC與同一通道內的節點進行連接,
介面層
介面層給第三方應用提供API進行呼叫,方便開發,可以通過SDK或者CLI方式進行安裝并呼叫鏈碼,同時通過Events監聽區塊鏈網路中發生的事件,
網路層
fabric使用gRPC和Gossip協議進行網路通信,
fabric的網路結構
N:fabric網路、R:組織、A:應用程式、CA:CA節點、S:智能合約、L:賬本、P:節點、C:通道、O:排序服務
該網路中有R1、R2、R3、R4四個組織,其中R4是為初始網路管理員,R1為后添加的網路管理員,R1和R4有著相同的網路權限,O4為R4組織創建的排序服務,對通道C1和C2的的交易進行排序,R1和R2在通道C1中、R2和R3在通道C2中,這兩個通道內的資料相互隔離、互不可見,L為節點P上的賬本、S為節點P上的智能合約,Ax是對應組織的應用程式,CAx為對應組織的證書認證機構,
fabric 交易流程
1. 客戶端發送簽名提案訊息到背書節點,請求背書節點進行處理,
Client節點構造簽名提案訊息(SignedProposal型別),通過呼叫背書服務客戶端的ProcessProposal()介面提交該訊息到背書節點,請求模擬執行交易提案并簽名背書,
2. 背書節點模擬執行交易提案并簽名背書,有以下操作:
- 檢查簽名提案訊息的格式合法性與簽名有效性,包括頭部通道、簽名頭部、簽名域、交易ID、訊息擴展域的ChaincodeId屬性與PayloadVisibility可見性模式等,
- 檢查提案訊息的創建者是否滿足指定通道上的通道訪問權限,
- 檢查并啟動鏈碼容器以模擬執行交易提案,并將模擬執行結果暫時保存在交易模擬器中,等待排序共識與交易驗證,而不是直接更新到賬本中,
- 呼叫ESCC系統鏈碼對該提案訊息的模擬結果讀寫集進行簽名背書,
- 背書節點向客戶端回傳提案回應訊息,并分發隱私資料明文,
- 處理提案回應訊息,
- 客戶端節點決議背書節點回復的提案回應訊息,獲取背書結果并檢查提案回應訊息狀態的合法性,以判斷是否收集了足夠多的符合要求的背書簽名資訊,
- 發送交易資料給Orderer排序節點請求排序,
- 當收集到足夠多符合要求的背書簽名之后,客戶端節點基于模擬執行結果、背書簽名等構造合法的簽名交易訊息,通過Broadcast()服務介面將該訊息提交給Orderer排序節點,請求交易排序,
- Orderer服務節點對交易進行排序并構造新區塊,
- Ordere排序節點提供solo型別、kafka型別等共識組件,對符合通道處理要求的合法交易資訊(普通交易資訊、配置交易資訊等)進行排序并達成一致觀點,并對一段時間內接收到一批交易訊息按照打包交易的出塊規則構造新區塊,創建應用通道或更新配置通道,同時提交賬本,
- Leader主節點請求Orderer服務節點發送通道賬本區塊
- Leader主節點通過Deliver()服務介面代表組織從Orderer節點請求通道賬本上所有的區塊資料,并通過Gossip訊息協議分發到組織內的其他Peer節點,
- Committer記賬節點驗證交易并提交賬本,
- Leader主節點分發資料與狀態同步,
- Leader主節點基于Gossip訊息協議將區塊資料分發到組織內的其他節點上,同時,節點之間通過反熵演算法等機制主動拉取缺失的資料、節點身份資訊等,以確保組織內所有節點上的賬本資料等資訊保存同步,
- Committer記賬節點驗證交易并提交賬本,
結語
本文是對fabric知識的總結,參考網路上的資源,這個github上有許多區塊鏈學習資料,可以參考一下:https://github.com/blockchainGuide/blockchainguide,如果文章有不足之處,歡迎評論提出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/298719.html
標籤:區塊鏈
上一篇:BTC/ETH 短期內該怎么做?
下一篇:基金的選擇方法及MATLAB實作
