一.Hyperledger Fabric概述
Hyperledger Fabric是由IBM公司主導開發的一個面向企業級客戶的開源專案。與比特幣和以太坊這類公有鏈不同,Hyperledger Fabric 網路的成員需要從可信賴的 成員服務提供者(MSP)
註冊經過授權認證後才能加入網路。從而避免了POW資源開銷,大幅提高了交易處理效率。
二.基本術語
1.共享賬本ledger
Hyperledger Fabric 中的賬本由世界狀態(world state)和區塊鏈這兩部分組成,它們彼此不同但卻相互關聯。其中世界狀態由區塊鏈決定。
-
世界狀態是一個資料庫(leveldb、couchdb),它儲存了一組賬本狀態的當前值。通過世界狀態,程式可以直接訪問一個賬本狀態的當前值,不需要遍歷整個交易日誌來計算當前值。預設情況下,賬本狀態是以鍵值對的方式來表示的,因為我們可以建立、更新和刪除狀態,所以世界狀態能夠頻繁更改。
-
區塊鏈是交易日誌,採用
Merkle Tree
結構,不可篡改,它記錄了促成當前世界狀態的所有改變。交易被收集在附加到區塊鏈的區塊中,能幫助我們理解所有促成當前世界狀態的改變的歷史。
2.通道Channel
通道是fabric中特別重要的概念。可大致理解為私有的子網路,通道中的節點共同維護賬本,實現資料的隔離和保密。通道是特定網路成員之間的專用通訊層,只能由被邀請加入通道的組織使用,並且對網路的其他成員不可見。每個channel對應一個賬本,由加入該channel的peer維護,一個peer可以加入多個channel,維護多個賬本。
3.組織Org
即Orginazation,管理一系列成員的組織。一個channel內可以有多個組織。
4.智慧合約Chaincode
又稱鏈碼,Hyperledger Fabric 智慧合約用 Go、Node.js 和 Java 語言編寫,當該應用程式需要與賬本互動時,由區塊鏈外部的應用程式呼叫。在大多數情況下,鏈碼只與賬本的資料庫、世界狀態(例如,查詢)互動,而不與交易日誌互動。
5.背書Endorse
指一個節點執行了一個交易並對結果進行簽名後返回響應的過程。
6.各種節點
6.1客戶端節點
客戶端必須連線到某一個peer節點或排序服務節點上才能與區塊鏈網路進行通訊。客戶端向背書節點(endorser)提交交易提案(transaction proposal),收集到足夠背書(可理解為擔保)後,向排序服務廣播交易提案,進行排序,生成區塊。
6.2peer節點(包含Committer,Endorser,Leader,Anchor這幾種狀態)
- 提交節點(Committer):通道中的每個 Peer 節點都是一個提交節點。他們會接收生成的區塊,在這些區塊被驗證之後會以附加的方式提交到 Peer 節點的賬本副本中。
- 背書節點(Endorser):部分節點還會執行交易並對結果進行簽名背書,背書節點是動態的角色,是與具體鏈碼繫結的。每個鏈碼在例項化的時候都會設定背書策略,指定哪些節點對交易背書後交易才是有效的。並且只有應用程式向它發起交易背書請求的時候才是背書節點,其他時候都是普通的提交節點,只負責驗證交易並提交。背書節點也無法通過配置檔案指定,而是由發起交易請求的客戶端指定,背書節點可以有多個。
- 主節點(Leader):當組織在通道中具有多個 Peer 節點的時候,會有一個主節點,它負責將交易從排序節點分發到該組織中其他的提交節點。有兩套選取主節點的方式,一套是靜態選擇的主節點,另一套是動態選舉的主節點。對於靜態選擇,0個或者多個節點可以被配置為主節點。對於動態選舉,一個節點會被選舉成為主節點。另外,在動態選舉主節點中,如果一個主節點出錯了,那麼剩下的節點將會重新選舉一個主節點。
- 錨節點(Anchor):peer節點還可以是錨節點(anchor peer),錨節點主要負責代表組織和其他組織進行資訊交換。每個組織都有一個錨節點,錨節點對於組織來說非常重要,如果錨節點出現問題,當前組織就會與其他組織失去聯絡。錨節點的配置資訊是在
configtxgen模組
的配置檔案configtx.yaml
中配置的。
6.3排序服務節點orderer
接收包含背書籤名的交易,對未打包的交易進行排序生成區塊,提供Gossip 協議的廣播給peer節點。排序服務提供的是原子廣播,保證同一個鏈上的節點接收到相同的資訊,並且有相同的邏輯順序,完成區塊資訊的同步工作。
6.4CA(Certificate Authority 證照頒發機構)節點
由伺服器和客戶端組成,CA節點接收客戶端的註冊申請,返回註冊密碼用於使用者登入,以便獲取身份證照。區塊鏈上的所有操作都需要驗證使用者身份。
7.公鑰基礎結構PKI
PKI(Public Key Infrastructure),是一組網際網路技術,可在網路中提供安全通訊。
PKI有四個關鍵要素:數字證照,公鑰和私鑰,證照授權中心,證照撤銷列表
8.成員服務提供者MSP
MSP(Membership Service Provider),一個 MSP 是定義管理該組織有效身份規則的元件。Fabric 中預設的 MSP 實現使用 X.509 證照作為身份,採用傳統的公鑰基礎結構PKI分層模型。(PKI提供身份列表,MSP將身份轉化為網路成員。)
要在Fabric網路上進行交易,成員需要這樣做:
- 擁有一個由網路信任的CA頒發的身份。
- 成為一個被網路成員認可和認可的組織的成員。MSP將身份與組織的成員資格聯絡在一起。成員資格是通過將成員的公鑰(也稱為證照、簽名證照或簽證)新增到組織的MSP來實現的。
- 將MSP新增到網路上的一個聯盟 或者通道。
- 確保MSP包括在網路中的策略 定義。
9.共識
在一個賬本的更新被應用到 Peer 節點的本地賬本之前, Peer 節點會請求網路中的其他 Peer 節點來批准這次更新。這個過程被稱為共識
fabric中使用的共識可以分為:solo
;kafka
;PBFT
;Raft
(注:solo和kafka在fabric2.0版本中已被棄用,PBFT是fabric0.6版本)
(瞭解更多PBFT概念可以參考PBFT共識演算法詳解;瞭解更多Raft概念可以參考Raft共識演算法詳解)
共識包含如下三個階段:
- 提案階段:客戶端向交易背書節點傳送一個交易提案,背書節點通過交易模擬執行後返回給客戶端背書結果及簽名
- 排序和打包階段:客戶端將背書後的結果及簽名交給排序節點排序並且打包進區塊。
- 驗證和提交階段:排序節點生成區塊向全網廣播,記賬節點收到這些區塊後,先驗證其正確性,驗證通過後存入本地帳本中。
10.策略
策略是一組規則,用來定義如何做出決策和實現特定結果。策略是使 Hyperledger Fabric 不同於其他區塊鏈系統(比如 Ethereum 或者 Bitcoin)的內容之一。在其他系統中,交易可以在網路中的任意節點生成和驗證。治理網路的策略可以在任何時間及時修復,並且只可以使用和治理程式碼相同的方式進行變更。因為 Fabric 是授權區塊鏈,使用者由底層基礎設施識別,所以使用者可以在啟動前決定網路的治理方式,以及改變正在執行的網路的治理方式。
三.交易流程
以下是fabric的經典交易流程,所有涉及到對賬本資料更新的操作都是基於這個交易流程來完成的。
網路節點架構圖
交易流程總圖
1.傳送交易提案
應用程式使用相應的 SDK(Node,Java,Python,Golang)提供的 API 構建交易提案並提交給相應的背書節點,交易提案中包含:
channelID:通道資訊
chaincodeID:要呼叫的鏈碼資訊
timestamp:時間戳
sign:客戶端的簽名
txPayload:提交的事務本身包含的內容,包含兩項
operation:要呼叫的鏈碼的函式及相應的引數
metadata:呼叫的相關屬性
2.背書節點模擬執行交易提案
在接收來自客戶端的訊息時,背書節點首先驗證客戶端的簽名clientSig(使用MSP),然後模擬事務。背書節點會呼叫鏈碼模擬執行交易提案,產生包括響應值、讀寫集的事務結果(讀寫集是交易中記錄的主要內容)。這些執行不會更新賬本。
3.返回提案響應
背書節點會對讀寫集進行背書(Endorse)簽名,生成提案響應(Proposal response)並返回給應用程式。
4.交易排序並分發
應用程式根據接收到的提案響應生成交易,併傳送給排序服務節點(Orderer節點)。交易請求被提交到Ordering服務節點,該事務包含讀/寫,背書籤名和通道ID;Orderer節點接收到事務請求之後,並不需要檢查交易中的具體資料,它只是從網路中的所有通道接收交易,按時間順序對它們進行全排序,並建立交易區塊。之後廣播給同一通道內所有組織的leader節點。
5.交易驗證並提交
記賬節點對接收到的區塊進行驗證(交易訊息結構是否正確、是否重複、是否有足夠的背書、讀寫集版本(防止了雙花問題),通過驗證後將結果寫入到本地的分類賬本中。驗證不通過的交易會被標記無(Invalid)。
6.賬本更新
每個peer節點都會將該塊附加到通道鏈中,並且對於每個有效事務,寫集都將提交到當前狀態資料庫。發出一個事件,以通知客戶端應用程式交易(呼叫)已被不可變地附加到鏈上,並通知交易是否有效或無效。