
一、說明
區(qū)塊鏈網(wǎng)絡(luò)的核心是分布式賬本,在這個賬本中記錄了網(wǎng)絡(luò)中發(fā)生的所有交易信息。
Hyperledger Fabric是一個是開源的,企業(yè)級的,帶權(quán)限的分布式賬本解決方案的平臺。Hyperledger Fabric由模塊化架構(gòu)支撐,并具備極佳的保密性、可伸縮性、靈活性和可擴展性。Hyperledger Fabric被設(shè)計成支持不同的模塊組件直接拔插啟用,并能適應(yīng)在經(jīng)濟生態(tài)系統(tǒng)中錯綜復(fù)雜的各種場景。
本文分享在 Centos下搭建 Hyperledger Fabric 2.4 環(huán)境并進行簡單的網(wǎng)絡(luò)測試。
?
二、環(huán)境準備
2.1. 環(huán)境依賴
- Git 客戶端
- Golang 1.17.5以上版本
- Docker 18.03以上版本
?
2.2. 檢查環(huán)境
Docker版本
docker -v

?
Golang語言環(huán)境
go version

?
三、Fabric 源碼安裝
3.1. 創(chuàng)建目錄
在 GOPATH 目錄下創(chuàng)建 Fabric 的文件夾:
mkdir -p $GOPATH/src/github.com/hyperledger
?
3.2. 下載源碼
cd $GOPATH/src/github.com/hyperledger
git clone https://gitee.com/hyperledger/fabric.git
這里使用國內(nèi)的碼云的鏡像倉庫

?
3.3. 修改安裝腳本
如果本地網(wǎng)絡(luò)訪問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. 執(zhí)行安裝腳本
./bootstrap.sh
如下圖所示,腳本執(zhí)行成功之后會下載一個 fabric-samples 工程和一堆fabric的docker鏡像:


?
分別手動下載 fabric 和 fabric-ca 編譯后的壓縮包,存放在 fabric/scripts/ 目錄下:
由于碼云鏡像倉庫的發(fā)布包只有源碼,我們需要編譯后的所以只能想辦法去github下載。

壓縮壓縮包,得到 bin 與 config 兩個文件夾:
tar -zxvf hyperledger-fabric-linux-amd64-2.4.1.tar.gz
tar -zxvf hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz
執(zhí)行以下命令復(fù)制 fabric-samples 目錄中
cp -r bin fabric-samples/
cp -r config fabric-samples/
?
四、啟動test-network測試網(wǎng)絡(luò)
進入test-network目錄
cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
執(zhí)行以下命令:
./network.sh up
如果出現(xiàn)下圖的報錯:

則需要修改 docker-compose 的版本,在test-network目錄下分別編輯以下文件:
vim docker/docker-compose-test-net.yaml
vim docker/docker-compose-couch.yaml
vim docker/docker-compose-ca.yaml
vim addOrg3/docker/docker-compose-couch-org3.yaml
vim addOrg3/docker/docker-compose-org3.yaml
其中把 version: '3.7' 修改為 version: '3.6' 如下圖所示:

修改完配置后,重新執(zhí)行:
./network.sh up
如下圖所示,已成功啟動一個 orderer節(jié)點 和兩個 peer節(jié)點:

至此一個基于 Hyperledger Fabric 的測試網(wǎng)絡(luò)就搭建完成了。
?
五、測試網(wǎng)絡(luò)使用
可以執(zhí)行以下命令打印腳本的幫助文本:
./network.sh -h
5.1. 創(chuàng)建Channel
現(xiàn)在我們的機器上正在運行對等節(jié)點和排序節(jié)點, 我們可以使用腳本創(chuàng)建用于在Org1和Org2之間進行交易的Fabric通道。
Fabric channel 是特定網(wǎng)絡(luò)成員之間的專用通信層,通道只能由被邀請加入通道的組織使用,并且對網(wǎng)絡(luò)的其他成員不可見。 每個通道都有一個單獨的區(qū)塊鏈賬本,被邀請的組織“加入”他們的對等節(jié)點來存儲其通道賬本并驗證交易,建立一個通道相當于建立了一個子鏈。
使用network.sh腳本在Org1和Org2之間創(chuàng)建通道并加入他們的對等節(jié)點,執(zhí)行以下命令創(chuàng)建一個通道:
./network.sh createChannel
如下圖所示創(chuàng)建成功后默認名稱為 mychannel

可使用 -c 來指定通道名稱,以下命令將創(chuàng)建一個名為 channel1 的通道:
./network.sh createChannel -c channel1
?
5.2. 在通道啟動一個鏈碼
創(chuàng)建通道后,可以開始使用智能合約與通道賬本交互。智能合約包含管理區(qū)塊鏈賬本上資產(chǎn)的業(yè)務(wù)邏輯,由成員運行的應(yīng)用程序網(wǎng)絡(luò)可以在賬本上調(diào)用智能合約創(chuàng)建,更改和轉(zhuǎn)讓這些資產(chǎn),應(yīng)用程序還通過智能合約查詢,以在分類賬上讀取數(shù)據(jù)。
在Fabric中,智能合約作為鏈碼以軟件包的形式部署在網(wǎng)絡(luò)上。鏈碼安裝在組織的對等節(jié)點上,然后部署到某個通道,然后可以在該通道中用于認可交易和區(qū)塊鏈賬本交互。在將鏈碼部署到通道前,該頻道的成員需要就鏈碼定義達成共識,建立鏈碼治理。何時達到要求數(shù)量的組織同意后,鏈碼定義可以提交給通道,并且可以使用鏈碼了。
創(chuàng)建頻道后,可以使用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 鏈碼,可以通過參數(shù) -ccl 來安裝 Java 或 javascript 版本的鏈碼。
?
5.3. 與網(wǎng)絡(luò)交互
在啟用測試網(wǎng)絡(luò)后,可以使用 peer cli 客戶端與網(wǎng)絡(luò)進行交互,通過 peer cli 客戶端可以調(diào)用已部署的智能合約,更新通道,或安裝和部署新的智能合約。
首先確保操作目錄為test-network目錄,比如我的目錄是:
以下操作需確保在 test-network 目錄中進行操作:

執(zhí)行以下命令將cli客戶端添加到環(huán)境變量中:
export PATH=${PWD}/../bin:$PATH
還需要將fabric-samples代碼庫中的FABRIC_CFG_PATH設(shè)置為指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
設(shè)置允許org1操作peer cli的環(huán)境變量:
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
CORE_PEER_TLS_ROOTCERT_FILE 和 CORE_PEER_MSPCONFIGPATH 環(huán)境變量指向Org1的 organizations 文件夾中的的加密材料。
執(zhí)行以下命令用一些資產(chǎn)來初始化賬本:
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":[]}'
執(zhí)行成功會返回 Chaincode invoke successful. result: status:200 如下圖所示:

執(zhí)行以下指令來查詢通道賬本中的資產(chǎn)列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

?
六、關(guān)閉網(wǎng)絡(luò)
使用完測試網(wǎng)絡(luò)后,可執(zhí)行以下命令關(guān)閉網(wǎng)絡(luò):
./network.sh down
該命令將停止并刪除節(jié)點和鏈碼容器,刪除組織加密材料,并從Docker Registry移除鏈碼鏡像,另外還會刪除之前運行的通道項目:

?
七、使用認證機構(gòu)創(chuàng)建網(wǎng)絡(luò)
Hyperledger Fabric使用公鑰基礎(chǔ)設(shè)施(PKI)來驗證所有網(wǎng)絡(luò)參與者的行為。 每個節(jié)點,網(wǎng)絡(luò)管理員和用戶提交的交易需要具有公共證書和私鑰以驗證其身份。
默認情況下,腳本使用cryptogen工具創(chuàng)建證書和密鑰,該工具用于開發(fā)和測試,并且可以快速為具有有效根信任的Fabric組織創(chuàng)建所需的加密材料。
測試網(wǎng)絡(luò)腳本還提供了使用證書頒發(fā)機構(gòu)(CA)的網(wǎng)絡(luò)的啟動選項。在網(wǎng)絡(luò)中每個組織操作一個CA(或多個中間CA)來創(chuàng)建屬于他們的組織身份,所有由該組織運行的CA創(chuàng)建的身份享有相同的組織信任根源。
首先運行以下命令關(guān)停所有正在運行的網(wǎng)絡(luò):
./network.sh down
使用CA參數(shù)啟動網(wǎng)絡(luò):
./network.sh up -ca
執(zhí)行命令成功后,通過打印的docker容器可以看到啟動了三個CA,每個網(wǎng)絡(luò)中的組織一個:

可以通過 tree 命令來查看Org1管理員用戶的MSP文件夾結(jié)構(gòu)和文件:
tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/

其中 signcerts 文件夾中存放著管理員用戶的證書,keystore 文件夾中存放著私鑰。
?
參考資料