Hyperledger Fabric 是一个开源的企业级许可分布式分类帐技术(DLT)平台,专为在企业环境中使用而设计。有基础的同学应该都对 Hyperledger Fabric 共识机制有一点了解,Fabric 共识机制分为 Solo、Kafka。
Solo 模式存在单点故障问题,容易导致网络瘫痪,不适用于生产;因此生产推荐使用 Kafka。Kafka 依赖 ZooKeeper,可以容忍部分节点失效。本 Chat 将基于 Kafka 共识实现排序节点的分布式网络搭建,采用图文的方式让读者更加容易理解。
主要内容有:
Fabric 基础环境搭建(Docker、Docker Compose、Go);
Fabric 证书文件配置及工具的使用,通道配置及使用;
Fabric 基于 Kafka 共识的分布式网络搭建(含 CA、CouchDB);
Fabric 通道创建、加入,链码的安装、实例化、交易测试等。
本次环境搭建将基于 3 个 ZooKeeper 服务、4 个 Kafka 服务、3 个排序节点服务、2 个组织,每个组织一个 CA 服务、3 个节点,组织 1 两个节点,组织 2 一个节点,每个节点对应一个 CouchDB,总共 4 台服务器进行配置。网络节点规划如下:
192.168.100.100:zookeeper0、kafka0、orderer0
192.168.100.101:zookeeper1、kafka1、orderer1、peer0.org1、ca0、couchdb0
192.168.100.102:zookeeper2、kafka2、orderer2、peer1.org1、couchdb1
192.168.100.102:kafka3、peer0.org2、ca1、couchdb2
前提
服务器:CentOS 7
服务器之间网络是通的
每台服务器 /etc/hosts 文件新增 order 节点及其他节点的 IP 映射
防火墙是关闭的,不然会遇到服务启动,但访问不了的情况。
查看防火墙状态:firewall-cmd --state
关闭防火墙:systemctl stop firewalld.service
禁止开机启动:systemctl disable firewalld.service
基础环境搭建
备注:4 台机器都要进行基础环境的搭建。
1. Docker 安装
1) 使用 root 权限登录 CentOS。确保 yum 包更新到最新。执行命令:
yum update
2) 卸载旧版本(如果安装过旧版本的话):
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
3) 安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 Device Mapper 驱动依赖的。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4) 设置 yum 源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5) 安装最新版本 Docker:
yum install docker-ce
6) 设置开机自启动:
systemctl start docker
systemctl enable docker
7) 验证安装:
docker version
2. docker-compose 安装
1) 安装:
curl -L “https://github.com/docker/compose/releases/download/1.22.0/docker-compose-(uname -s)-(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
2) 添加 docker-compose 可执行权限:
chmod +x /usr/local/bin/docker-compose
3) 验证安装:
docker-compose version
3. Go 安装
1) 获取 Go 安装包:
wget -c https://storage.googleapis.com/golang/go1.11.1.linux-amd64.tar.gz
2) 解压:
tar -C /usr/local/ -zxvf go1.11.1.linux-amd64.tar.gz
3) 编辑环境变量:
vi /etc/profile
新增:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=/root/go/
4) 配置立即生效:
source /etc/profile
5) 验证:
go version
4. 镜像及二进制文件下载,参考官网提供的方式
在 GOPATH 下面新建目录 src/github.com/hyperledger,进到该目录执行:
wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
获取 bootstrap.sh 执行文件(如果没有 wget 命令可以使用 yum install wget 安装),该文件包含 fabric-samples、镜像、二进制文件的下载。
给 bootstrap.sh 添加可执行权限:
chmod +x bootstrap.sh
执行 bootstrap.sh:./bootstrap.sh 即可下载 fabric-samples、镜像、二进制文件。
二进制文件默认下载到 fabric-samples 下面的 bin 目录:
建议可以将其加入到 PATH 环境变量中,这样可以在任意位置执行这些命令,编辑 /etc/profile,新增以下配置,保存退出后执行 source /etc/profile 使配置生效。
export PATH=$PATH:/root/go/src/github.com/hyperledger/fabric-samples/bin
使用 docker images 命令查看已经下载的镜像。
Kafka 分布式网络搭建部署
因编辑器原因,我将 Kafka 集群部署涉及的所有文件单独放到 这篇文章中。
步骤一:编写 crypto-config.yaml 和 configtx.yaml 配置文件,分别用于生成证书和通道配置信息
在 192.168.100.100 服务器上操作
cd $GOPATH/src/github.com/hyperledger/fabric-samples
创建目录
mkdir kafka_cluster
后续操作都在该目录下。
新增 crypto-config.yaml 文件:
https://blog.csdn.net/u010857052/article/details/90215027
新增 configtx.yaml 文件:
https://blog.csdn.net/u010857052/article/details/90215027
步骤二:根据上述编辑的文件生成证书和通道配置信息
1) 生成证书跟私钥文件
cryptogen generate --config=./crypto-config.yaml
查看目录结构
2) 生成创世区块及通道配置区块
创建目录:mkdir channel-artifacts
使用 configtxgen 生成创世区块:
configtxgen -channelID kafka-channel -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
其中
channelID:channel 名称,如果不指定默认是 testchainid
profile:配置文件中的节点,用于生成相关配置文件
outputBlock:输出区块文件路径
3) 使用 configtxgen 生成创世区块
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
其中
profile:配置文件中的节点,用于生成相关配置文件
outputCreateChannelTx:指定生成 channel 配置文件的路径
channelID:channel 名称
4) 将目录下的所有文件全部拷贝到其他服务器同级目录备用
scp 命令格式:
scp [参数] [原路径] [目标路径]
scp -r ./ [email protected]:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster
scp -r ./ [email protected]:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster
scp -r ./ [email protected]:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster
步骤三:编写各个服务器的配置文件
192.168.100.100 服务器配置 docker-compose-up.yaml
192.168.100.101 服务器配置 docker-compose-up.yaml
192.168.100.102 服务器配置 docker-compose-up.yaml
192.168.100.103 服务器配置 docker-compose-up.yaml
详细代码见
https://blog.csdn.net/u010857052/article/details/90215027
步骤四:启动所有节点服务
1) 分别在 4 个服务器启动所有服务:
docker-compose -f docker-compose-up.yaml up -d
2) 检查各个服务状态以及服务对应的情况:
步骤五:通道创建、节点加入通道
在 peer0.org1.example.com 节点 192.168.100.101 上面进行测试。
1) 进入容器:docker exec -it cli bash
2) 创建通道:peer channel creat
参数:
-o:指定 order 节点的 IP 端口
-c:通道名称
-f:指定通道配置文件路径
–tls:与 order 通信是否启用 tls
–cafile:使用 tls 时,所使用的 orderer 的证书
peer channel create -o orderer0.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
创建成功后会在当前目录生成 mychannel.block 文件。
3) 加入通道
peer channel join
参数:
-b:指定通道文件
peer channel join -b mychannel.block
4) 退出 CLI 容器,保存通道文件 mychannel.block 到宿主机,然后上传给其他服务器,用于其他服务器上的节点加入通道。
复制容器中的 mychannel.block 到宿主机:
docker cp 32fbbf20c9df:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./
拷贝至其他有节点的服务器
scp -r mychannel.block [email protected]:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster/
scp -r mychannel.block [email protected]:/root/go/src/github.com/hyperledger/fabric-samples/kafka_cluster/
步骤六:安装、实例化链码、交易测试
在 peer0.org1.example.com 节点 192.168.100.101 上面进行测试。
在 docker-compose-up.yaml 中我们指定了链码的位置,通过宿主机的 chaincode/go 目录映射到容器中的目录,该链码是官方提供的例子,可以在 fabric-samples/chaincode/chaincode_example02 目录中找到。
1) 进入容器:
docker exec -it cli bash
2) 安装链码 peer chaincode install,链码路径是相对于容器的路径。
参数:
-n:链码名称
-p:链码的路径
-v:版本号
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/ -v 1.0
3) 初始化链码 peer chaincode instantiate,指定背书策略,链码实例化只需要执行一次,其他节点不需要重复实例化操作,实例化时间较长,需要耐心等待。
参数:
-o:指定 order 节点的 IP 端口
–tls:与 order 通信是否启用 tls
–cafile:使用 tls 时,所使用的 orderer 的证书
-C:通道名称
-n:链码名称
-v:版本号
-c:请求参数
-P:背书策略,此处指定 Org1MSP 或 Org2MSP 中的成员参与背书
peer chaincode instantiate -o orderer0.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","200","b","400"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
4) 交易查询
peer chaincode query
参数:
-C:通道名称
-n:链码名称
-c:请求参数
peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
5) 转账交易
peer chaincode invoke
参数:
-C:通道名称
-n:链码名称
-c:请求参数
–tls:与 order 通信是否启用 tls
–cafile:使用 tls 时,所使用的 orderer 的证书
peer chaincode invoke --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c ‘{“Args”:[“invoke”,“a”,“b”,“20”]}’
此时再查询 a 账户的余额应该为 180。
步骤七:其他 2 个节点加入通道,链码安装、交易测试
1) 192.168.100.102 服务器上,先将上面拷贝的通道配置文件拷贝到容器里面:
docker cp mychannel.block b588d2429319:/opt/gopath/src/github.com/hyperledger/fabric/peer/
2) 加入通道:
peer channel join -b mychannel.block
3) 安装链码:
peer chaincode install -n mycc -p github.com/hyperledger/fabric/kafka/chaincode/go/example02/ -v 1.0
4) 交易查询:
peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
因为此前已经再 192.168.100.101 上面做了转账交易,所以此时查询余额为 180。
5) 转账查询测试:
peer chaincode invoke --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c ‘{“Args”:[“invoke”,“a”,“b”,“20”]}’
最后一个节点在 192.168.100.103 上,操作同 192.168.100.102。
各位读者在搭建的过程中如果遇到什么问题或者有什么建议都可以在读者圈进行咨询。