CentOS7中hyperledger-fabric1.1
根據蒐集的資料安裝測試並在安裝測試過程中整理的文件,如有不足希望不吝賜教。
目錄
一、環境介紹
Fabric相關元件以及工具介紹:
- orderer 共識節點。為交易排序,並生成區塊
- peer共識節點。為交易背書,並記錄區塊資訊
- crypto用於生成區塊鏈網路中相應使用者的相關證書檔案
- configtxgen 用於生成區塊鏈系統鏈碼的創世區塊、新建通道的配置檔案、以及組織中錨節點的配置檔案
本次Fabric區塊鏈網路部署環境:5臺 Centos 7系統的虛擬機器。
相關環境版本如下:
go version go1.10.2 linux/amd64
Docker version 18.03.1-ce, build 9ee9f40
docker-compose version 1.21.2, build a133471
linux:【rpm -q centos-release】
centos-release-7-5.1804.el7.centos.2.x86_64
Linux localhost.localdomain 4.16.13-1.el7.elrepo.x86_64 #1 SMP Wed May 30 14:31:51 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux
1個 orderer 節點,4個 peer 節點,使用 solo 共識演算法
172.17.1.40、172.17.0.233、172.17.0.239、172.17.0.240部署peer節點
172.17.0.241部署orderer節點
二、原始碼編譯、以及fabric 區塊鏈網路部署環境準備
單機部署測試時,go、docker、docker-compose、git等應該已經安裝完成並且已經完成環境變數等配置,fabric原始碼已經下載,此處不再贅述。如果後面步驟碰到未安裝的依賴等可自行安裝後繼續。
安裝編譯相關的依賴包 snappy-devel.x86_64、zlib-devel.x86_64、bzip2-devel.x86_64、libtoo-ltdl-devel.x86_64、libtool
可以使用命令直接安裝,命令如下:
yum -y install snappy-devel.x86_64 zlib-devel.x86_64 bzip2-devel.x86_64 libtoo-ltdl-devel.x86_64 libtool
從 github.com 上下載 go 語言編譯相關環境 gotools(golang.org 需要翻牆,所以從 github 上獲取)
在目錄$GOPATH/src/golang.org/x/下執行:
git clone https://github.com/golang/tools.git
三、編譯 fabric區塊鏈相關可執行程式
切換到 fabric 原始碼的目錄下面,通過 makefile 檔案,可以編譯出 fabric 專案的全部可執行檔案。
這次的演示例子中,只需要編譯部分必要檔案即可:orderer、peer、configtxgen、cryptogen。
注:以下命令,全部在$GOPATH/src/github.com/hyperledger/fabric 目錄下執行。
1.編譯go相關工具
cp -r $GOPATH/src/golang.org/x/tools/ $GOPATH/src/github.com/hyperledger/fabric/gotools/build/gopath/src
完成後執行:
make gotools
在執行make命令時可能會遇到的異常資訊(一):
can't load package: package golang.org/x/lint/golint: no Go files in /opt/gopath/src/github.com/hyperledger/fabric/gotools/build/gopath/src/golang.org/x/lint/golint
或
package golang.org/x/tools/go/ast/astutil: unrecognized import path "golang.org/x/tools/go/ast/astutil" (https fetch: Get https://golang.org/x/tools/go/ast/astutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
或
package golang.org/x/tools/go/gcexportdata: unrecognized import path "golang.org/x/tools/go/gcexportdata" (https fetch: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
例如:
解決辦法:
下載安裝golang.org/x/net、golint
cd $GOPATH/src/golang.org/x/ git clone https://github.com/golang/net.git net git clone https://github.com/golang/tools.git git clone https://github.com/golang/lint.git go install net go get golang.org/x/lint/golint
然後執行如下命令,如果出現沒有資料夾的異常,根據命令在相應位置建立即可。
在執行make命令時異常資訊(二):
解決辦法:
重試或者手動執行報錯的git命令(如下)再重試。
git clone https://github.com/kardianos/govendor /opt/gopath/src/github.com/hyperledger/fabric/gotools/build/gopath/src/github.com/kardianos/govendor
成功後類似如下截圖:
2.編譯 fabric基礎環境
make buildenv
在執行make命令時可能會遇到的異常資訊(一):
[[email protected] fabric]# make buildenv
(cd build/docker/gotools/bin && tar -jc *) > build/gotools.tar.bz2
tar: *: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
make: *** [build/gotools.tar.bz2] Error 2
或
[[email protected] fabric]# make buildenv
mkdir -p build/image/buildenv/payload
cp build/gotools.tar.bz2 build/docker/gotools/bin/protoc-gen-go build/image/buildenv/payload
cp: cannot stat ‘build/docker/gotools/bin/protoc-gen-go’: No such file or directory
make: *** [build/image/buildenv/payload] Error 1
解決辦法:
在出現錯誤1、2,3(截圖中標註)時重試,每次錯誤不同,當出現第三次報錯,如圖,進行如下操作:
執行命令:
go get -u github.com/golang/protobuf/protoc-gen-go
執行完成後可以在$GOPATH/bin/路徑下看到protoc-gen-go檔案,然後再執行命令:
cp /opt/gopath/bin/protoc-gen-go /opt/gopath/src/github.com/hyperledger/fabric/build/docker/gotools/bin/
針對上述異常,將其拷貝至指定目錄,再次執行make buildenv,成功截圖如下:
3.編譯區塊鏈服務相關工具
分別執行下面四條命令:
make orderer
make peer
make configtxgen
make cryptogen
編譯的可執行程式生成在./fabric/build/bin目錄下,設定該目錄至 PATH環境變數。可以修改/etc/profile檔案,在PATH後追加:
:/opt/gopath/src/github.com/hyperledger/fabric/build/bin 注意前面的冒號
在執行make命令時可能會遇到的異常資訊(一):
vendor/github.com/miekg/pkcs11/pkcs11.go:26:18: fatal error: ltdl.h: No such file or directory
#include <ltdl.h>
解決辦法:
安裝ltdl,命令如下:
yum -y install libtool-ltdl-devel
安裝完成後重試即可。
在執行make peer命令時可能會遇到的異常資訊:
curl: (6) Could not resolve host: services.gradle.org
The command '/bin/sh -c curl -sSL https://services.gradle.org/distributions/gradle-2.12-bin.zip > /tmp/gradle-2.12-bin.zip' returned a non-zero code: 6
make: *** [build/image/javaenv/.dummy-x86_64-1.1.1-snapshot-ff5e861] Error 6
解決辦法:
根據網上查詢的資料,需要修改dns,但是本次問題並沒有解決,而是重啟docker。以下為兩種方法,請自行測試。
1)修改DNS:
修改/etc/NetworkManager/NetworkManager.conf檔案,在main部分新增 “dns=none” 選項,如圖:
然後重新裝載上面修改的配置:
systemctl restart NetworkManager.service
再修改/etc/resolv.conf檔案,將dns改為114.114.114.114以及8.8.8.8,
2)重啟docker:
本次使用上面方法沒有解決,最後使用重啟docker的方法解決,重啟命令:
service docker restart
編譯成功截圖:
四、多機部署fabric網路(solo共識)
注意:以下步驟執行之前需要做一些檢查:
- 檢查orderer節點上7050埠是否開放、4個peer節點的7051、7052、7053埠是否開啟。然後用telnet(telnet IP port)命令或其他方法檢查埠是否可以訪問(可能需要安裝telnet)。或者直接關閉所有防火牆。
- 如果之前執行過操作,沒有成功而回頭重複以下步驟(尤其重新生成證書、重啟orderer、peer節點等操作),需要刪除所有機器上/var/hyperledger目錄下所有檔案。本路徑在配置檔案orderer節點上的orderer.yaml(FileLedger標籤下Location值)、peer節點上core.yaml(fileSystemPath值)中。否則在兩個peer從節點以及在執行某些操作時會提示包含“X509”的錯誤。
基本環境已經完成,下面將使用編譯出來的可執行程式及相關工具,來搭建一個 fabric 區塊鏈網路,並實現鏈碼的部署以及測試。
首先,分別在五臺虛擬機器中建立目錄/etc/hyperledger/fabric,以下的命令 全部在該目錄下執行,並且需要設定 fabric 網路執行的環境變數:
FABRIC_CFG_PATH=/etc/hyperledger/fabric
可以直接在/etc/profile中新增,如圖:
1.配置 fabric 網路使用者拓撲關係
通過配置檔案 crypto-config.yaml配置fabric 網路使用者拓撲關係。crypto-config.yaml 內容如下(crypto-config.yaml檔案可以從e2e目錄複製一份檔案到當前目錄):
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
Specs:
- Hostname: peer0
- Hostname: peer1
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
Specs:
- Hostname: peer0
- Hostname: peer1
如果設定了EnableNodeOUs,就在msp下生成config.yaml檔案。
該配置檔案,包含一個 orderer 節點,以及兩個 peer組織,兩個 peer 組織又分別包含了兩個 peer 節點。
使用 cryptogen 工具,從crypto-config.yaml配置檔案中生成使用者相應的祕鑰和證書檔案 命令如下:
cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
成功後截圖如下:
執行命令後,會在當前目錄下生成資料夾 crypto-config,包含節點使用者的祕鑰以及證書檔案,如圖:
通過scp命令分發 crypto-config資料夾,至其他4臺虛擬機器的/etc/hyperledger/fabric 目錄下(以下為例,根據實際修改主機ip):
scp -r crypto-config [email protected]:/etc/hyperledger/fabric/
2.配置Orderer 節點的啟動創世區塊,新建通道交易的相關配置
通過配置檔案 configtx.yaml 配置ordere 節點啟動需要的創始區塊資訊,以及新建應用通道的交易資訊。最初記錄時使用的是word,配置檔案內容太長,因此沒有全部記錄,以下截圖僅為部分,完整配置檔案統一放在附件(CentOS7 - hyperledger fabric1.1 - 1+4多機部署(solo共識)配置檔案)中,請自取,如果積分不足請留言。
修改完成後執行下面命令:
使用工具configtxgen生成 orderer 節點啟動所需的創世區塊:
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock genesis.block
使用工具 configtxgen生成建立應用通道的交易配置檔案:
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx testchannel.tx -channelID testchannel
使用工具 configtxgen 生成更新組織錨節點的配置資訊檔案:
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./Org1MSPanchors.tx -channelID testchannel -asOrg Org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./Org2MSPanchors.tx -channelID testchannel -asOrg Org2MSP
執行命令後,在當前目錄下會生成如下檔案:
genesis.block、testchannel.tx、Org1MSPanchors.tx、Org2MSPanchors.tx
通過 scp 命令傳送Org1MSPanchors.tx檔案至172.17.1.40
通過 scp 命令傳送Org2MSPanchors.tx檔案至172.17.0.239
通過 scp 命令傳送 testchannel.tx檔案至全部四臺peer主機
3.設定虛擬機器 Hosts 檔案
由於 fabric 網路啟動相關的配置檔案中,與網路地址相關的資訊都是填寫的域名,所以需要在 hosts 檔案中配置域名與 ip 的對應關係, orderer 節點和其他的4個 peer 節點的虛擬機器都需要配置相關的 hosts 資訊:vim /etc/hosts
172.17.1.40 peer0.org1.example.com
172.17.0.233 peer1.org1.example.com
172.17.0.239 peer0.org2.example.com
172.17.0.240 peer1.org2.example.com
172.17.0.241 orderer.example.com
其中域名是根據 cryprto-config.yaml 的配置資訊得來。
4.配置 orderer 啟動環境
在 orderer 節點的虛擬機器配置 orderer 節點啟動相關配置資訊 orderer.yaml,並儲存在/etc/hyperledger/fabric 目錄下。相關配置檔案內容見附件。
從 cypto-config 資料夾下,拷貝 orderer 節點的祕鑰以及證書檔案至 fabric 啟動環境變數目錄下:
cp -r ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp ./
cp -r ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls ./
根據前文的操作,fabric 網路 orderer 節點的執行環境目錄下必須有以下檔案及資料夾:
./crypto-config、./msp、./tls、orderer.yaml、genesis.block
啟動 orderer 節點:
orderer start
5.配置 peer 啟動環境
在 peer 節點的虛擬機器配置 peer 節點啟動相關配置資訊 core.yaml,並儲存在/etc/hyperledger/fabric 目錄下。相關配置檔案內容見附件。
從 crypto-config 資料夾下,拷貝 peer 節點的祕鑰以及證書檔案至 fabric 啟動環境變數目錄下:
cp -r ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp ./
cp -r ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls ./
注意:org1和peer0.org1應該在對應的目錄下拷貝對應的檔案資訊(可以參考 hosts 配置資訊的內容區分)
根據前文的操作,fabric 網路 peer 節點的執行環境目錄下必須有以下檔案及資料夾:
/crypto-config.tx、./msp、./tls、testchannel.tx、core.yaml、
Org1MSPanchors.tx(.1.40虛擬機器)、
Org2MSPanchors.tx(.0.239虛擬機器)
啟動 peer 節點:
peer node start
注意,拷貝 msp、tls 資料夾的動作可以不需要操作,只需要在對應的 orderer.yaml 以及 core.yaml 配置檔案中設定相應的路徑即可,這裡為了能夠與附件中的配置資訊一致,故把相應的祕鑰與證書檔案拷貝至fabric 網路執行環境變數的目錄下
6.建立應用通道
設定相應環境變數,4臺peer節點都需要設定(根據相應環境修改配置中相應的位置,後面測試連碼時也會用到,因此不用重複設定)
CORE_PEER_LOCALMSPID=Org1MSP
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/[email protected]1.example.com/msp
例如:
執行下面命令建立應用通道:
peer channel create -o orderer.example.com:7050 -c testchannel -f ./testchannel.tx --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
命令執行成功以後,會在當前目錄下生成 應用通道的創世區塊testchannel.block 檔案,只有使用該檔案,才可以加入對應的應用通道。使用 scp命令分發至其他3臺 peer 節點虛擬機器的 fabric 網路執行環境變數下(/etc/hyperledger/fabric)。以下為例:
scp -r testchannel.block [email protected]:/etc/hyperledger/fabric/
7.加入應用通道
執行命令加入應用通道(4臺peer節點都可以執行一遍):
peer channel join -b testchannel.block
加入應用通道的peer 節點虛擬機器都可以通過終端命令檢視加入的通過資訊,如圖,如果所有peer節點都執行了加入命令,都可以看到如下類似資訊:
peer channel list
8.更新錨節點配置
執行命令更新負責代表組織與其他節點通訊的錨節點(只需要在一臺上執行即可):
peer channel update -o orderer.example.com:7050 -c testchannel -f ./Org1MSPanchors.tx --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
錨節點負責代表組織與其他組織中的節點進行 Gossip 通訊。
五、測試鏈碼
1.安裝鏈碼
設定相應環境變數(根據相應環境修改配置):
如果在四.6步驟中已經修改過配置檔案(/etc/profile),則此處不需要重複操作。
打包鏈碼,由於這次的例子是基於 go 語言開發的智慧合約,會依賴 go 的開發環境進行安裝,如果使用 peer chaincode install 命令指定鏈碼路徑安裝,可能會造成其他虛擬上安裝的同樣的鏈碼無法同步例項化(go 開發環境不一致引起的問題),所以這裡使用 go chaincode package 打包鏈碼,然後通過安裝打包鏈碼檔案進行鏈碼的安裝。
注意:這裡進行測試的鏈碼是 fabric 原始碼中的樣例-p 指定的路徑在命令執行的時候會自動根據 GOPATH 環境變數自動補全字首,所以路徑一個在 $GOPATH/src/目錄下:
peer chaincode package -n test -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 1.0 test.pak
使用 scp 命令分發 test.pak 檔案至其他3臺 peer 節點虛擬機器的 fabric 網路執行環境變數路徑下。例如:
scp -r test.pak [email protected]:/etc/hyperledger/fabric/
安裝鏈碼
peer chaincode install test.pak
安裝鏈碼的 peer 節點伺服器可以通過終端命令檢視已安裝的鏈碼資訊,如圖:
peer chaincode -C testchannel list --installed
2.初始化鏈碼
初始化鏈碼,只需要在一臺 peer 節點的伺服器上執行例項化後自動建立鏈碼容器,其他 peer 節點伺服器會同步該例項化的鏈碼資訊,並建立鏈碼容器(需要啟動docker容器:service docker start)
peer chaincode instantiate -o orderer.example.com:7050 -C testchannel -n test -v 1.0 -c'{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
命令執行後對交易使用者 a賦值100,交易使用者 b 賦值200代幣。
使用命令檢視鏈碼容器資訊:docker ps。如圖:
使用命令:
peer chaincode query -n test -C testchannel -c'{"Args":["query","a"]}'
檢視使用者a(b)初始值:
3.測試交易
執行命令傳送一筆交易,命令 b 向 a 轉賬 40個代幣:
peer chaincode invoke -o orderer.example.com:7050 -C testchannel -n test -c'{"Args":["invoke","b","a","40"]}' --tls ture --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
再次查詢a、b餘額命令與五.2查詢命令相同:
查詢轉賬命令可以在任意peer節點執行,上面查詢在.1.40節點(日誌級別debug),下面查詢在.0.233節點(日誌級別info):
六、其他
1.git檢視遠端的所有分支列表
git branch -a
*表示當前使用分支
如果上面命令不加引數(git branch),則為檢視本地的git分支
END