CentOS7中hyperledger-fabric1.1多机部署及部分异常处理(solo共识,手动非docker方式)

版权声明:转载请注明来源 https://blog.csdn.net/qq_38591756/article/details/82959236

根据搜集的资料安装测试并在安装测试过程中整理的文档,如有不足希望不吝赐教。


本文介绍CentOS7中hyperledger-fabric1.1多机部署使用solo共识非docker方式,后面再补充一个kafka共识的步骤。(kafka共识:《》)

参考文档:

Hyperledger Fabric 区块链多机部署(以下内容主要参考该博客,博客以fabric1.0为例介绍,如有需要请参考原文,还要感谢作者的指导)

fabric多节点集群部署(4+1)详解

当时测试时因为这两篇看的比较多,因此记录了下来,还有一部分资料没有记录已经找不到记录了,在此一并感谢。

目录

一、环境介绍

二、源码编译、以及fabric 区块链网络部署环境准备

三、编译 fabric区块链相关可执行程序

1.编译go相关工具

2.编译 fabric基础环境

3.编译区块链服务相关工具

四、多机部署fabric网络(solo共识)

1.配置 fabric 网络用户拓扑关系

2.配置Orderer 节点的启动创世区块,新建通道交易的相关配置

3.设置虚拟机 Hosts 文件

4.配置 orderer 启动环境

5.配置 peer 启动环境

6.创建应用通道

7.加入应用通道

8.更新锚节点配置

五、测试链码

1.安装链码

2.初始化链码

3.测试交易

六、其他

1.git查看远程的所有分支列表


一、环境介绍

Fabric相关组件以及工具介绍:

- orderer 共识节点。为交易排序,并生成区块

- peer共识节点。为交易背书,并记录区块信息

- crypto用于生成区块链网络中相应用户的相关证书文件

- configtxgen 用于生成区块链系统链码的创世区块、新建通道的配置文件、以及组织中锚节点的配置文件

本次Fabric区块链网络部署环境:5台 Centos 7系统的虚拟机。

其中golang、docker、内核升级等安装配置全部是使用单机测试https://blog.csdn.net/qq_38591756/article/details/82826979)的配置,相关的安装配置步骤可以参考下面给出的链接或者自行搜索相关安装配置资料。

相关环境版本如下:

golang:【go version】《CentOS7安装golang

    go version go1.10.2 linux/amd64

docker:【docker --version】《CentOS7 - Docker&Docker-Compose安装

    Docker version 18.03.1-ce, build 9ee9f40

docker-compose:【docker-compose --version】《CentOS7 - Docker&Docker-Compose安装

    docker-compose version 1.21.2, build a133471

linux:【rpm -q centos-release

    centos-release-7-5.1804.el7.centos.2.x86_64

linux内核:【uname -a】《CentOS7修改内核版本

    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命令时可能会遇到的异常信息(一):

[root@localhost 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

[root@localhost 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/Admin@org1.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

猜你喜欢

转载自blog.csdn.net/qq_38591756/article/details/82959236