HyperLedger Fabric入門指南
前言
區塊鏈是將互相獨立的分散式的儲存、傳輸協議、加密機制通過一種特別的方式組合起來,因此這幾個相互獨立的技術也成就了區塊鏈的三大技術優勢:去中心化、共識機制、智慧合約,賦予了區塊鏈得以顛覆世界的能力。因為其三大技術優勢而受到廣泛關注,且目前正處在上升勢態。拋開炒作的代幣專案,應用於行業聯盟鏈或直接搭建私鏈的專案,採用HyperLedger Fabric作為底層平臺無疑是最好的選擇之一。Hyperledger Project由Linux基金會創辦於2015年10月,是一個開源的區塊鏈研發孵化專案,致力於提供可協同開發以區塊鏈為底層的分散式賬本。旗下的Fabric專案目標為打造一個提供分散式賬本解決方案的平臺。本文主要對Fabric的基本概念,網路結構,智慧合約等資訊介紹以及對未來建立BaaS平臺服務的簡單構想。
走進Fabric
Fabric組成模型
- 資產定義
資產這裡理解為任何具有貨幣價值的東西,它們都可以通過網路進行交易,無論是有形資產還是無形資產都屬於資產。
資產在Hyperledger Fabric中以鍵-值對集合的形態存在,在通道(channel)中各本地賬本可以對其狀態提交變更事務。資產可以用二進位制或JSON形式表示。
- 智慧合約
鏈碼(chaincode)即Fabric的智慧合約,分為系統鏈碼和使用者鏈碼。鏈碼的執行由事務排序劃分,限制了節點型別間的信任和驗證級別,並優化了網路的可伸縮性和效能。
- 共享賬本
在Fabric中產生的所有針對資料狀態變更的請求都會生成有序且不可篡改的記錄存於賬本中。資料狀態的變更是由所有參與方認可的智慧合約呼叫事務的結果。每個事務都將產生一組資產鍵-值對,這些鍵值對作為建立、更新或刪除等操作而同步到所有賬本。
賬本由區塊鏈(區塊根據hash等演算法組成的鏈條)組成,而每一個區塊中都儲存有一條或一組有序的且不可篡改的記錄,也就是一個狀態資料庫來維護當前的Fabric的狀態。每個通道(channel)都有且僅有一個賬本,在該通道(channel)中的每個加盟成員的對等點都維護同一份賬本。
- 隱私通道
多通道(channel)交易的設計方案可以確保競爭的企業和受監管的行業在一個公共網路上交換資產時的高度隱私及保密性。
- 成員服務
Hyperledger Fabric只允許被授權加盟的成員參與資料維護,且成員間相互認可所有的交易都會被彼此發現和跟蹤。這種方式提供了一個可信的區塊鏈網路。
- 共識機制
共識機制的設定是為了達成一致的一種獨特的方法,它可以實現企業間所需的靈活性和可伸縮性。
Fabric賬本資料結構
要達到資料不可篡改首先從資料結構上來看,也是區塊鏈之所以稱之為區塊鏈的原因。如下圖1-1所示,每個儲存單元包含上一儲存單元的hash值(圖中hash值的對應關係不完全精確,僅示意用)以及自身儲存的交易資料塊,可以從表象來看就像把所有資料塊連線在一起,稱之為“區塊鏈”,形成鏈狀可追述的交易記錄。這種鏈狀結構的資料稱之為賬本資料,儲存著所有交易的記錄,此外還有一個“世界狀態”,其實質為Key-Value資料庫,維護著交易資料的最終狀態,便於查詢等操作運算,並且每個資料都有其對應的版本號。
圖1-1 區塊資料結構圖
Fabric涉及的技術及要求
- Docker容器
掌握docker的環境搭建。掌握Docker的基本操作命令,包括打包、拆包、tag、容器管理、映象管理等。掌握Docker Compose和YAML的編排方案,瞭解如何掛載檔案路徑、設定埠繫結、確定Network以及掌握環境變數的用法等。
- Go語言
掌握go語言的環境部署即可。
- gRPC框架
gRPC 是一個高效能、通用的開源RPC框架,其由 Google 公司主要面向移動應用開發並基於HTTP/2 協議標準而設計的,基於 ProtoBuf(Protocol Buffers) 序列化協議開發,且支援眾多開發語言。
瞭解一下即可,與Thrift、Dubbo類似。
- CA認證
CA是PKI系統中通訊雙方信任的實體,被稱為可信第三方(Trusted Third Party,簡稱TTP)。作為可信第三方的行為具有非否認性。
瞭解即可。
- P2P傳輸
Peer-to-Peer,對等網路,即對等計算機網路,是一種在對等者(Peer)之間分配任務和工作負載的分散式應用架構。
瞭解即可。
- Kafka分散式訊息系統
掌握Kafka的環境搭建,瞭解其在Fabric網路中的擔任的作用即可。簡單來說,Kafka是一種共識模式,也就是說平等信任(同步複製),所有的HyperLedger Fabric網路加盟方都是可信方,因為訊息總是均勻地分佈在各處。當Orderer生成新的區塊後,通過kafka同步到各Peer節點。各節點將新的區塊提交到賬本。
- Zookeeper
掌握Zookeeper的環境搭建,其作用主要是管理Kafka的broker節點。
- SDK(Java/Node.js)
熟練掌握java-sdk的開發工作。
Fabric事務處理流程
1)應用向一個或多個Peer節點發送對事務的背書請求。
2)背書節點執行智慧合約,但並不將結果提交到本地賬本,只是將結果返回給應用。
3)應用收集所有背書節點的結果後,將結果廣播給Orderers叢集。(背書策略)
4)Orderers叢集執行共識過程,並生成新的區塊,通過訊息通道批量的將區塊釋出給Peer 節點。
5)各個Peer節點驗證交易,並提交到本地賬本中。
圖1-2 事務處理流程圖
Fabric網路
構建Fabric網路的基本順序
1)下載平臺對應的二級制檔案配置
解壓後,一般包含的二進位制檔案有cryptogen,configtxgen,configtxlator
通過configtxgen和cryptogen手動生成證書/金鑰以及各項配置檔案
2)生成組織證書和祕鑰
crypto-config.yaml檔案中,主要配置是組織資訊、排序節點組織定義、節點組織定義的資訊。
命令:./bin/cryptogen generate --config=./crypto-config.yaml
3)定義configtx.yaml配置檔案
配置環境變數:export FABRIC_CFG_PATH=configtx.yaml的所在路徑
configtx.yaml的五大配置:
- Profiles:配置檔案。
- Organizations:組織節點資訊。定義組織ID和MSP的檔案位置及組織節點的資訊。
- Orderer:啟動模式。排序服務相關的一些引數配置,包括共識型別、地址碼、區塊生成的大小、批量處理的數量、超時時間等資訊。(很重要的配置,會影響到生產環境,區塊生成的速度和區塊檔案佔用的磁碟空間等問題)
- Application:應用。(具體引數配置參考官網資訊)
- Capabilities:功能特性集合。定義Fabirc的網路功能。(具體引數配置參考官網資訊)
4)生成orderer原始檔
生成genesis.block
命令:
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
5)生成channel原始檔
生成channel.tx
命令:./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
構建Fabric網路的基本順序
一個Fabric網路包含一個或多個組織且含有不少於一臺排序服務集,一個組織包含一個或多個節點服務,一個節點服務可以加入一個或多個通道,一個通道可以安裝一個或多個智慧合約。
1)solo多級部署(solo共識)
Solo型別啟動多機多節點部署,至少需要兩臺伺服器來完成最小單元的Fabric網路組的工作。具體網路拓撲如下圖1-3所示。
圖1-3 solo 共識網路拓撲
2)kafka叢集部署(kafka共識)——生產環境必須使用kafka共識
kafka叢集的最小單位組成如下:
- 三個zookeeper節點叢集(伺服器個數為2n+1個)
- 四個kafka節點叢集
- 三個orderer排序排序伺服器
- 其他peer節點
具體網路拓撲如下圖1-4所示。
圖1-4 kafka共識網路拓撲
智慧合約
什麼是智慧合約
Fabric的智慧合約稱為鏈碼(chaincode),分為系統鏈碼和使用者鏈碼。系統鏈碼用來實現系統層面的功能,使用者鏈碼實現使用者的應用功能。智慧合約的主要特點如下:
1)由Go語言編寫的,最終在Java等其他程式語言中實現了指定的介面。
2)執行在一個背書peer程序獨立且安全的Docker容器中。
3)與Fabric網路互動的唯一渠道。
4)生成Transaction的唯一來源(Transactions -> 區塊 -> 賬本)。
5)智慧合約通過應用程式提交事務初始化和管理賬本狀態。
智慧合約與節點的互動流程
1)客戶端請求背書節點peer後,節點會通過傳送一個鏈碼訊息物件(帶輸入資訊,呼叫者資訊)給對應的鏈碼。
2)鏈碼呼叫ChaincodeBase(基類)裡面的invoke方法,通過傳送獲取資料(getState)和寫入資料(putState)訊息,向背書節點peer獲取賬本狀態資訊和傳送預提交狀態。
3)鏈碼傳送最終輸出結果給背書節點peer,節點對輸入和輸出進行背書籤名,完成第一段簽名提交。
4)之後客戶端收集所有背書節點peer的第一段提交資訊,組裝事務(transaction)並簽名,傳送事務到orderer節點進行排序,最終在orderer節點產生區塊,併發送到各個peer節點,把輸入和輸出落到賬本上,完成第二段提交過程。
時序圖如下圖1-5所示。
圖1-5 鏈碼與節點互動時序圖