hyperledger fabric搭建(Hyperledger Fabric 2.x 環境搭建)
一、說明
一個區塊鏈網絡的核心是一個分布式賬本,在這個賬本中記錄了網絡中發生的所有交易信息。
Hyperledger Fabric是一個是開源的,企業級的,帶權限的分布式賬本解決方案的平臺。Hyperledger Fabric由模塊化架構支撐,并具備極佳的保密性、可伸縮性、靈活性和可擴展性。Hyperledger Fabric被設計成支持不同的模塊組件直接拔插啟用,并能適應在經濟生態系統中錯綜復雜的各種場景。
本文分享在 Centos 7.5 下搭建 Hyperledger Fabric 2.4 環境并進行簡單的測試。
二、環境準備
2.1. 環境依賴
Git 客戶端
Golang 1.17.5以上版本
Docker 18.03以上版本
2.2. 檢查環境
「Docker版本」
docker -v
「Golang語言環境」
go version
三、Fabric 源碼安裝
3.1. 創建目錄
在 GOPATH 目錄下創建 Fabric 的文件夾:
mkdir -p $GOPATH/src/github.com/hyperledger
3.2. 下載源碼
cd $GOPATH/src/github.com/hyperledgergit clone https://gitee.com/hyperledger/fabric.git
這里使用國內的碼云的鏡像倉庫
3.3. 修改安裝腳本
如果本地網絡訪問github順暢可以忽略該步驟
編輯 bootstrap.sh 文件
vim $GOPATH/src/github.com/hyperledger/fabric/scripts/bootstrap.sh
把 https://github.com/hyperledger/fabric-samples.git 修改為 https://gitee.com/hyperledger/fabric-samples.git
注釋 pullBinaries
3.4. 執行安裝腳本
./bootstrap.sh
如下圖所示,腳本執行成功之后會下載一個 fabric-samples 工程和一堆fabric的docker鏡像:
分別手動下載 fabric 和 fabric-ca 編譯后的壓縮包,存放在 fabric/scripts/ 目錄下:
由于碼云鏡像倉庫的發布包只有源碼,我們需要編譯后的所以只能想辦法去github下載。
https://github.com/hyperledger/fabric/releases/download/v2.4.1/hyperledger-fabric-linux-amd64-2.4.1.tar.gz
https://github.com/hyperledger/fabric-ca/releases/download/v1.5.2/hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz
壓縮壓縮包,得到 bin 與 config 兩個文件夾:
tar -zxvf hyperledger-fabric-linux-amd64-2.4.1.tar.gztar -zxvf hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz
執行一下命令復制 fabric-samples 目錄中
cp -r bin fabric-samples/cp -r config fabric-samples/
四、啟動test-network測試網絡
進入test-network目錄
cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
執行以下命令:
./network.sh up
如果出現下圖的報錯:
則需要修改 docker-compose 的版本,在test-network目錄下分別編輯以下文件:
vim docker/docker-compose-test-net.yamlvim docker/docker-compose-couch.yamlvim docker/docker-compose-ca.yamlvim addOrg3/docker/docker-compose-couch-org3.yamlvim addOrg3/docker/docker-compose-org3.yaml
其中把 version: '3.7' 修改為 version: '3.6' 如下圖所示:
修改完配置后,重新執行:
./network.sh up
如下圖所示,已成功啟動一個 orderer節點 和兩個 peer節點:
至此一個基于 Hyperledger Fabric 的測試網絡就搭建完成了。
五、測試網絡使用
可以執行以下命令打印腳本的幫助文本:
./network.sh -h
5.1. 創建Channel
現在我們的機器上正在運行對等節點和排序節點, 我們可以使用腳本創建用于在Org1和Org2之間進行交易的Fabric通道。
Fabric channel 是特定網絡成員之間的專用通信層,通道只能由被邀請加入通道的組織使用,并且對網絡的其他成員不可見。 每個通道都有一個單獨的區塊鏈賬本,被邀請的組織“加入”他們的對等節點來存儲其通道賬本并驗證交易,建立一個通道相當于建立了一個子鏈。
使用network.sh腳本在Org1和Org2之間創建通道并加入他們的對等節點,執行以下命令創建一個通道:
./network.sh createChannel
如下圖所示創建成功后默認名稱為 mychannel
可使用 -c 來指定通道名稱,以下命令將創建一個名為 channel1 的通道:
./network.sh createChannel -c channel1
5.2. 在通道啟動一個鏈碼
創建通道后,可以開始使用智能合約與通道賬本交互。智能合約包含管理區塊鏈賬本上資產的業務邏輯,由成員運行的應用程序網絡可以在賬本上調用智能合約創建,更改和轉讓這些資產,應用程序還通過智能合約查詢,以在分類帳上讀取數據。
在Fabric中,智能合約作為鏈碼以軟件包的形式部署在網絡上。鏈碼安裝在組織的對等節點上,然后部署到某個通道,然后可以在該通道中用于認可交易和區塊鏈賬本交互。在將鏈碼部署到通道前,該頻道的成員需要就鏈碼定義達成共識,建立鏈碼治理。何時達到要求數量的組織同意后,鏈碼定義可以提交給通道,并且可以使用鏈碼了。
創建頻道后,可以使用network.sh腳本在通道上啟動鏈碼:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-java -ccl java
「-ccn」:為指定鏈碼名稱
「-ccl」:為指定鏈碼語言
deployCC 子命令將在 peer0.org1.example.com 和 peer0.org2.example.com 上安裝 asset-transfer-basic 鏈碼,如果第一次部署鏈碼,腳本將安裝鏈碼的依賴項。默認情況下,腳本安裝Go版本的 asset-transfer-basic 鏈碼,可以通過參數 -ccl 來安裝 Java 或 javascript 版本的鏈碼。
5.3. 與網絡交互
在啟用測試網絡后,可以使用 peer cli 客戶端與網絡進行交互,通過 peer cli 客戶端可以調用已部署的智能合約,更新通道,或安裝和部署新的智能合約。
首先確保操作目錄為test-network目錄,比如我的目錄是:
以下操作需確保在 test-network 目錄中進行操作:
執行以下命令將cli客戶端添加到環境變量中:
export PATH=${PWD}/../bin:$PATH
還需要將fabric-samples代碼庫中的FABRIC_CFG_PATH設置為指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
設置允許org1操作peer cli的環境變量:
export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org1MSP"export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspexport CORE_PEER_ADDRESS=localhost:7051
CORE_PEER_TLS_ROOTCERT_FILE 和 CORE_PEER_MSPCONFIGPATH 環境變量指向Org1的 organizations 文件夾中的的加密材料。
執行以下命令用一些資產來初始化賬本:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'
執行成功會返回 Chaincode invoke successful. result: status:200 如下圖所示:
執行以下指令來查詢通道賬本中的資產列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
六、關閉網絡
使用完測試網絡后,可執行以下命令關閉網絡:
./network.sh down
該命令將停止并刪除節點和鏈碼容器,刪除組織加密材料,并從Docker Registry移除鏈碼鏡像,另外還會刪除之前運行的通道項目:
七、使用認證機構創建網絡
Hyperledger Fabric使用公鑰基礎設施(PKI)來驗證所有網絡參與者的行為。 每個節點,網絡管理員和用戶提交的交易需要具有公共證書和私鑰以驗證其身份。
默認情況下,腳本使用cryptogen工具創建證書和密鑰,該工具用于開發和測試,并且可以快速為具有有效根信任的Fabric組織創建所需的加密材料。
測試網絡腳本還提供了使用證書頒發機構(CA)的網絡的啟動選項。在網絡中每個組織操作一個CA(或多個中間CA)來創建屬于他們的組織身份,所有由該組織運行的CA創建的身份享有相同的組織信任根源。
首先運行以下命令關停所有正在運行的網絡:
./network.sh down
使用CA參數啟動網絡:
./network.sh up -ca
執行命令成功后,通過打印的docker容器可以看到啟動了三個CA,每個網絡中的組織一個:
可以通過 tree 命令來查看Org1管理員用戶的MSP文件夾結構和文件:
tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
其中 signcerts 文件夾中存放著管理員用戶的證書,keystore 文件夾中存放著私鑰。
參考資料
https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html