Hyperledger Fabric - 自定义createChannel命令
前提条件
启动上一步的自定义network网络
./network-myself.sh up
拷贝配置文件
以下文件是配置文件及相关脚本文件:
mkdir configtx #创建配置文件目录
cp ../test-network/configtx/configtx.yaml ./configtx/ #拷贝测试网络中的配置文件,用于创建通道创世区块使用
cp ../test-network/scripts/setAnchorPeer.sh ./scripts/ #拷贝测试网络中的配置文件,用于创建通道时设置锚节点使用
cp ../test-network/scripts/envVar.sh ./scripts/
cp ../test-network/scripts/configUpdate.sh ./scripts/
cp ../test-network/scripts/utils.sh ./scripts/
configtx.yaml文件指定新通道的通道配置,configtxgen工具使用configtx.yaml文件中定义的通道配置来创建通道配置,并将其写入protobuf格式,然后由Fabric读取。同时也会为系统通道创建完整的创世块。
setAnchorPeer.sh 设置锚节点脚本,在设置节点时使用。
envVar.sh、configUpdate.sh、utils.sh被setAnchorPeer.sh调用,因些一起拷贝过来。
创建目录channel-artifacts
mkdir channel-artifacts
设置环境变量
设置排序节点的公钥、私钥、证书位置,设置peer节点证书位置
export CORE_PEER_TLS_ENABLED=true
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export PEER0_ORG3_CA=${PWD}/organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
export FABRIC_CFG_PATH=${PWD}/configtx #configtx.yaml文件所在的目录
export BLOCKFILE="./channel-artifacts/mychannel.block"
FABRIC_CFG_PATH:configtx.yaml文件所在的目录
BLOCKFILE:区块链文件位置
生成通道创世区块mychannel.block文件
使用configtxgen工具通过配置文件./configtx/configtx.yaml来创建Orderer系统通道的创世块
configtxgen -profile TwoOrgsApplicationGenesis -outputBlock ./channel-artifacts/mychannel.block -channelID mychannel
设置环境变量org1 并重置FABRIC_CFG_PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
创建通道
osnamdin channel命令与排序节点进行通信时需要使用TLS证书与私钥,在Fabric v2.3版本中创建通道时,直接创建应用通道,不再创建由排序服务管理的系统通道了。
osnadmin channel join --channelID mychannel --config-block ./channel-artifacts/mychannel.block -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
将组织中peer节点加入通道
设置环境变量为org1
此处调用envVar.sh脚本中的函数及参数 setGlobals 1,得到以下脚本
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
将节点加入通道
peer channel join -b $BLOCKFILE
将org2的peer节点加入通道
设置环境变量为org2
此处调用envVar.sh脚本中的函数及参数 setGlobals 2,得到以下脚本
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
将节点加入通道
peer channel join -b $BLOCKFILE
设置锚节点
组织的peer节点加入通道后,应至少选择一个peer节点成为锚节点。当前有2个组织,每个组织只有一个peer节点,因此为这2个peer节点设定锚节点。
设置org1中的锚节点
docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
docker exec cli ./scripts/setAnchorPeer.sh 1 mychannel
设置org2中的锚节点
docker exec cli ./scripts/setAnchorPeer.sh 2 mychannel
生成创建通道脚本
前提条件
保留本文步骤1中前提条件中生成的文件,当前目录存在的文件如所示:
[root@localhost test-network-myself]# tree
.
├── channel-artifacts
│ └── mychannel.block
├── configtx
│ └── configtx.yaml #本次新增文件:创建通道创世块使用
├── crypto-config.yaml
├── docker
│ └── docker-compose-test-net.yaml
├── network-myself.sh #本次将做修改的文件:增加创建通道功能
├── organizations
│ ├── ccp-generate.sh
│ ├── ccp-template.json
│ └── ccp-template.yaml
├── scripts
│ ├── configUpdate.sh #本次新增文件:被创建锚节点调用的脚本文件
│ ├── envVar.sh #本次新增文件:设置环境变量、切换组织函数、验证执行命令结果函数等
│ ├── setAnchorPeer.sh #本次新增文件:创建锚节点脚本文件
│ └── utils.sh 本次新增文件: 打印输出信息脚本文件
└── system-genesis-block
编辑脚本文件network-myself.sh
此脚本为简化版本,没有过多的验证,即认为每个命令都会正常执行。
修改network-myself.sh内容为以下:
#!/bin/bash
#开启自己的测试网络
function networkUpMyself() {
# 关闭自己的测试网络
networkDownMyself
set -x
# 生成组织及证书
cryptogen generate --config=./crypto-config.yaml --output="organizations"
# 执行ccp-generate.sh脚本,生成通用连通配置文件
./organizations/ccp-generate.sh
# 启动网络
export DOCKER_SOCK=/var/run/docker.sock
docker-compose -f $COMPOSE_FILE_BASE up -d
set +x
}
#关闭自己的测试网络
function networkDownMyself() {
set -x
#停止和删除容器、网络、卷、镜像
export DOCKER_SOCK=/var/run/docker.sock
docker-compose -f $COMPOSE_FILE_BASE down --volumes --remove-orphans
#删除节点目录
rm -rf ./organizations/*Organizations
#删除block
rm -rf ./system-genesis-block/*.block
set +x
}
# 创建通道
function createChannelMyself() {
# 通过是否存在目录organizations/peerOrganizations,判断是否启动了网络,若没有此目录,则启动网络
if [ ! -d "organizations/peerOrganizations" ]; then
networkUpMyself
fi
# 设置环境变量,设置排序节点的公钥、私钥、证书位置,设置peer节点证书位置
export CORE_PEER_TLS_ENABLED=true
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export PEER0_ORG3_CA=${PWD}/organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
# configtx.yaml文件所在的目录
export FABRIC_CFG_PATH=${PWD}/configtx
# 区块链文件位置
export BLOCKFILE="./channel-artifacts/mychannel.block"
# 生成创世区块mychannel.block文件,根据配置文件./configtx/configtx.yaml来创建Orderer系统通道的创世块
configtxgen -profile TwoOrgsApplicationGenesis -outputBlock ./channel-artifacts/mychannel.block -channelID mychannel
# 重置环境变量
export FABRIC_CFG_PATH=$PWD/../config/
# 设置环境变量为org1,调用envVar.sh脚本中的函数及参数 setGlobals 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
sleep 3
# 创建通道
osnadmin channel join --channelID mychannel --config-block ./channel-artifacts/mychannel.block -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
# 设置环境变量为org1,调用envVar.sh脚本中的函数及参数 setGlobals 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
sleep 3
# 将org1的节点加入通道
peer channel join -b $BLOCKFILE
# 设置环境变量为org2,调用envVar.sh脚本中的函数及参数 setGlobals 2
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
sleep 3
# 将org2节点加入通道
peer channel join -b $BLOCKFILE
# 设置组织org1的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
docker exec cli ./scripts/setAnchorPeer.sh 1 mychannel
# 设置组织org2的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
docker exec cli ./scripts/setAnchorPeer.sh 2 mychannel
}
# docker-compose yaml文件地址
COMPOSE_FILE_BASE=docker/docker-compose-test-net.yaml
#参数命令
MODE=$1
if [ "${MODE}" == "up" ]; then
echo "开启自己的测试网络"
networkUpMyself
elif [ "${MODE}" == "down" ]; then
echo "关闭自己的测试网络"
networkDownMyself
elif [ "${MODE}" == "createChannel" ]; then
echo "创建通道"
createChannelMyself
else
echo "up 开启自己的测试网络"
echo "down 关闭自己的测试网络"
echo "createChannel 创建通道"
exit 1
fi
脚本中增加了创建通道函数createChannelMyself
测试 - 创建通道
./network-myself.sh createChannel

浙公网安备 33010602011771号