上一篇文章《Fabric2.0 学习进阶——镜像部署网络(二)》介绍了如何通过 fabric-sample 自带的脚本 byfn.sh 来启动 first-network 网络。为了弄清楚 Fabric 网络的启动过程,本节通过二进制可执行程序完成 Fabric 的自定义启动。
本节规划 Fabric 平台由 3 个 order 节点,2 个组织,4 个 peer 节点组成,每个组织两个 peer 节点。Fabric2.0 的共识机制只支持 raft 协议,该协议实现的共识必须至少 3 个节点,节点数最好为奇数。
本节所有操作均在 /usr/local/src/hyperleger/fabric/scripts/fabric-samples/first-network 目录执行。
进行后续操作之前,先设置好相关的环境变量。
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=${PWD}
3.1 生成证书
Fabric 平台是许可区块链平台,通过数字证书实现平台参与者对平台资源的访问操作权限,使网络具备更高的安全性。
证书生成需要使用 cryptogen 工具以及配置文件 crypto-config.yaml。根据平台的节点规划,修改(记得备份)crypto-config.yaml 如下:
上图中,Order 组织定义了三个节点:orderer,orderer2,orderer3,peer 组织包括 Org1 和 Org2 两个组织,每个组织包括 2 个节点,包括 Admin 用户和 1 个普通用户。
配置文件修改完成之后,直接运行如下命令完成 order 节点、peer 节点、管理员和用户的证书生成。
cryptogen generate --config=./crypto-config.yaml
成功执行之后,当前目录下将生成 crypto-config 目录,目录结构如下图所示:
![https://imgchr.com/i/NtsDbV]()
3.2 创世区块
创世区块的生成需要使用 configtxgen 工具以及配置文件 configtx.yaml。根据平台的节点规划,修改(记得备份)内容如下:
![https://imgchr.com/i/Nts65F]()
将 orderer4 和 orderer5 相关的配置注释,因为本文规划的 fabric 网络只包含 3 个 order 节点。
配置文件修改完成之后,执行如下命令:
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
成功执行之后,channel-artifacts 目录下将生成创世区块文件 genesis.block。
![https://imgchr.com/i/NtsyUU]()
对于创世区块的生成,fabric1.x 与 fabric2.0 有明显的区别,注意上述命令 profile 参数值。
3.3 生成通道交易配置文件
通道交易配置文件的生成,fabric1.x 与 fabric2.0 无明显区别,所使用命令和配置文件与生成创世区块使用的相同。
执行如下命令,完成通道交易配置文件的创建。
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
成功执行之后,channel-artifacts 目录下将生成通道交易配置文件 channel.tx。
![https://imgchr.com/i/NtsBD0]()
3.4 生成锚节点配置文件
锚节点配置文件的生成,fabric1.x 与 fabric2.0 无明显区别,所使用命令和配置文件与生成创世区块使用的相同。
执行如下命令,完成 Org1 和 Org2 两个组织锚节点配置文件的创建。
# 生成 Org1 的锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
# 生成 Org2 的锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
成功执行之后,channel-artifacts 目录下将生成两个锚节点配置文件 Org1MSPanchors.tx 和 Org2MSPanchors.tx。
![https://imgchr.com/i/Ntsags]()
3.5 启动 & 停止网络
Fabric 网络服务以 docker 方式启动,涉及命令 docker-compose 和配置文件 docker-compose-cli.yaml、docker-compose-etcdraft2.yaml、docker-compose-ca.yaml。
本文规划的 fabric 网络包括 10 个 docker 服务:4 个 peer 节点服务,3 个 order 节点服务,2 个 CA 服务,1 个 cli 服务。
修改配置文件 docker-compose-etcdraft2.yaml,注释掉 orderer4 和 orderer5 的相关配置。
![https://imgchr.com/i/Nts0uq]()
![https://imgchr.com/i/Nts28J]()
执行如下命令,将启动 3 个 order 节点服务,1 个 cli 节点服务,4 个 peer 节点服务和 2 个 CA 节点服务。
# 配置环境变量,CA 节点必需
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls \*_sk)
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls \*_sk)
# 根据指定配置文件启动容器服务
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-ca.yaml up -d
命令执行日志如下图所示:
![https://imgchr.com/i/NtsgC4]()
查看运行的 docker 服务,如下图所示:
![https://imgchr.com/i/NtshK1]()
停止网络执行命令:
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-ca.yaml down
Fabric 平台所有节点服务均正常启动,3.1 节 -3.4 节生成的配置文件都是为后续的交易操作而准备的,后续的操作均需进入 cli 容器执行相关命令。
3.6 创建通道
通道是 Fabric 的特性,可以在一个区块链平台上实现业务隔离,从逻辑上实现多链操作。
创建通道需要先进入 cli 容器,执行如下命令:
# 连接 cli 服务
docker exec -it cli bash
#定义 CA 文件路径
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#创建通道信息
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
#将生成的文件移动到 channel-artifacts 文件夹中
mv mychannel.block channel-artifacts/
3.7 peer 节点加入通道
上一步我们创建了一个名称为 mychannel 的通道,但该通道还没有任何 peer 节点加入,则无法进行交易操作,本节将 2 个组织的 4 个节点都加入到 mychannel 通道。
通过查看环境变量,当前 cli 容器使用的 org1.peer0 的配置。
![https://imgchr.com/i/NtsWvR]()
按照当前的配置,我们执行如下命令,先将 org1.peer0 节点加入 mychannel 通道。
peer channel join -b channel-artifacts/mychannel.block
执行成功结果如下图所示:
![https://imgchr.com/i/NtsR29]()
切换节点,将 org1.peer1 加入 mychannel 通道。
# 切换节点 org1.peer1
source scripts/utils.sh
setGlobals 1 1
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block
参照上述切换节点的方法,将 org2 组织的两个节点也加入通道。
# 切换节点 org2.peer0
source scripts/utils.sh
setGlobals 0 2
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block
#切换节点 org2.peer1
setGlobals 1 2
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block
至此,2 个组织的 4 个节点均已加入 mychannel 通道。
3.8 更新锚节点
锚节点是组织内的一种特殊 peer 节点,通过锚节点可以实现不同组织内节点间的通信。通常每次组织都要设置一个锚节点,下面分别对 org1 和 org2 两个组织设置锚节点,本文假设将组织中的 peer0 节点设置为锚节点。
# 切换到 org1.peer0 节点
setGlobals 0 1
#设置环境变量 ORDERER_CA
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#更新设置锚节点
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
#切换到 org2.peer0 节点
setGlobals 0 2
#设置环境变量 ORDERER_CA
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#更新设置锚节点
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
更新命令执行成功结果如下图所示:
![https://imgchr.com/i/Nts4Dx]()
经过我们的努力,我们手动配置并启动了一个 fabric 网络,包含 3 个 orderer 节点,2 个组织 4 个 peer 节点,2 个 ca 节点,1 个 cli 节点,1 个通道 mychannel,后续文章将基于该网络进行链码操作。
文章作者:xiaohui249
本文链接:http://javatech.wang/index.ph…
版本所有 ©转载时必须以链接形式注明作者和原始出处