一、說明
區塊鏈網路的核心是分散式賬本,在這個賬本中記錄了網路中發生的所有交易資訊。
Hyperledger Fabric是一個是開源的,企業級的,帶許可權的分散式賬本解決方案的平臺。Hyperledger Fabric由模組化架構支撐,並具備極佳的保密性、可伸縮性、靈活性和可擴充套件性。Hyperledger Fabric被設計成支援不同的模組元件直接拔插啟用,並能適應在經濟生態系統中錯綜複雜的各種場景。
本文分享在 Centos下搭建 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/hyperledger
git 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/hyperledge...
https://github.com/hyperledge...
壓縮壓縮包,得到 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
執行以下命令複製 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.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'
如下圖所示:
修改完配置後,重新執行:
./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=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
環境變數指向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
資料夾中存放著私鑰。
參考資料
掃碼關注有驚喜!