根据搜集的资料安装测试并在安装测试过程中整理的文档,如有不足希望不吝赐教。
本文介绍CentOS7中hyperledger-fabric1.1多机部署使用solo共识非docker方式,后面再补充一个kafka共识的步骤。(kafka共识:《CentOS7中hyperledger-fabric1.1 - 2+6多机安装部署、部分异常处理以及使用configtxlator对区块基本信息查询(kafka共识,手动非docker方式)》)
参考文档:
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共识)
注意:以下步骤执行之前需要做一些检查:
- 检查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: OrdererDomain: example.comSpecs:- Hostname: orderer
PeerOrgs:- Name: Org1Domain: org1.example.comEnableNodeOUs: trueTemplate:Count: 2Users:Count: 1Specs:- Hostname: peer0- Hostname: peer1- Name: Org2Domain: org2.example.comEnableNodeOUs: trueTemplate:Count: 2Users:Count: 1Specs:- 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 root@172.17.0.233:/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 Org1MSPconfigtxgen -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/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 root@172.17.0.233:/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 root@172.17.0.233:/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