1. 程式人生 > >CentOS7中hyperledger-fabric1.1

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共識)

注意:以下步驟執行之前需要做一些檢查:

  1. 檢查orderer節點上7050埠是否開放、4peer節點的705170527053埠是否開啟。然後用telnettelnet IP port)命令或其他方法檢查埠是否可以訪問(可能需要安裝telnet)。或者直接關閉所有防火牆。
  2. 如果之前執行過操作,沒有成功而回頭重複以下步驟(尤其重新生成證書、重啟ordererpeer節點等操作),需要刪除所有機器上/var/hyperledger目錄下所有檔案。本路徑在配置檔案orderer節點上的orderer.yamlFileLedger標籤下Location值)、peer節點上core.yamlfileSystemPath值)中。否則在兩個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 ./

注意:org1peer0.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

注意,拷貝 msptls 資料夾的動作可以不需要操作,只需要在對應的 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