本文针对创建通道脚本进行分析,此脚本被创建测试网络脚本在执行命令./ createChannel时调用
调用脚本及参数默认值命令:scripts/ "mychannel" 3 5 false

目录

# 导入引用的脚本文件

# 函数 - 创建通道创世区块

# 函数 - 创建通道

# 函数 - 节点加入到通道中

# 函数 - 设置锚节点

# 脚本开始执行

# 创建通道创世区块

# 创建通道

# 节点加入到通道中

# 将组织org1中的peer节点加到通道中

# 将组织org2中的peer节点加到通道中

# 设置锚节点

# 设置组织org1的锚节点

# 设置组织org2的锚节点

脚本流程梳理图


以下是内容,文中浅蓝色字体及图片为分析备注,并根据一些备注生成了目录:

#!/bin/bash
# imports

# 导入引用的脚本文件

# envVar.sh脚本包含节点证书的环境变量,验证执行命令结果函数verifyResult、切换组织环境变量函数setGlobals等
. scripts/envVar.sh
# utils.sh脚本为打印输出信息功能,脚本调用了utils.sh脚本中的相关函数,如infoln、fatalln等函数,脚本简单,自行查看下
 . scripts/utils.shCHANNEL_NAME="$1"
 DELAY="$2"
 MAX_RETRY="$3"
 VERBOSE="$4"
 : ${CHANNEL_NAME:="mychannel"}
 : ${DELAY:="3"}
 : ${MAX_RETRY:="5"}
 : ${VERBOSE:="false"}# 若不存在目录channel-artifacts,则创建
 if [ ! -d "channel-artifacts" ]; then
     mkdir channel-artifacts
 fi

# 函数 - 创建通道创世区块

createChannelGenesisBlock() {
     # 搜索configtxgen命令,判断是否存在此二进制文件,若不存在,打印错误信息,程序终止
     which configtxgen
     if [ "$?" -ne 0 ]; then
         fatalln "configtxgen tool not found."
     fi
     set -x #脚本调试,会将下面执行的命令输出到屏幕上
    # 创建创世区块:生成创世区块mychannel.block文件,根据配置文件./configtx/configtx.yaml来创建Orderer系统通道的创世块
     configtxgen -profile TwoOrgsApplicationGenesis -outputBlock ./channel-artifacts/${CHANNEL_NAME}.block -channelID $CHANNEL_NAME
     res=$?
     { set +x; } 2>/dev/null #取消脚本调试,之后执行的命令不再输出到屏幕上  # 调用脚本./script/envVar.sh中的函数verifyResult,用来验证上面执行的命令是否报错,如果报错,则打印错误信息,程序终止
   verifyResult $res "Failed to generate channel configuration transaction..."
 }

# 函数 - 创建通道

createChannel() {
    # 调用脚本./script/envVar.sh中的函数setGlobals,为org1或org2的peer节点设置环境变量,参数1对应的是org1,2对应org2
     # 设置环境变量为org1
     setGlobals 1
     # Poll in case the raft leader is not set yet
     local rc=1
     local COUNTER=1  # 创建通道若未成功,可尝试5次
     while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
         sleep $DELAY
         set -x
         # 创建通道,将执行结果信息记录到log.txt文件中
         osnadmin channel join --channelID $CHANNEL_NAME --config-block ./channel-artifacts/${CHANNEL_NAME}.block -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY" >&log.txt
         
         res=$?
         { set +x; } 2>/dev/null
         let rc=$res
         COUNTER=$(expr $COUNTER + 1)
     done   # 打印log.txt,即打印创建通道结果信息
     cat log.txt# 调用脚本./script/envVar.sh中的函数verifyResult,用来验证上面执行的命令是否报错,如果报错,则打印错误信息,程序终止
     verifyResult $res "Channel creation failed"
 }# joinChannel ORG

# 函数 - 节点加入到通道中

joinChannel() {
   FABRIC_CFG_PATH=$PWD/../config/
   ORG=$1
  # 根据传递的参数设置环境变量,切换组织使用
   setGlobals $ORG
     local rc=1
     local COUNTER=1
     ## Sometimes Join takes time, hence retry
     # peer节点加入通道若未成功,可尝试5次
     while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
     sleep $DELAY
     set -x
    # 将节点加入通道,将执行结果信息记录到log.txt文件中
     peer channel join -b $BLOCKFILE >&log.txt
     res=$?
     { set +x; } 2>/dev/null
         let rc=$res
         COUNTER=$(expr $COUNTER + 1)
     done
     cat log.txt
     verifyResult $res "After $MAX_RETRY attempts, peer0.org${ORG} has failed to join channel '$CHANNEL_NAME' "
 }

# 函数 - 设置锚节点

setAnchorPeer() {
   ORG=$1  # docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分,脚本详细解析另起一篇文章(参见:Fabric v2.3 测试网络 - 脚本分析(三)- 创建通道 - 设置锚节点setAnchorPeer.sh解析),脚本位置如下图所示
   docker exec cli ./scripts/setAnchorPeer.sh $ORG $CHANNEL_NAME

fabric通道写入策略_txt文件


}

# 脚本开始执行
FABRIC_CFG_PATH=${PWD}/configtx
## Create channel genesis block
# 创建通道创世区块
infoln "Generating channel genesis block '${CHANNEL_NAME}.block'"
 createChannelGenesisBlockFABRIC_CFG_PATH=$PWD/../config/
 BLOCKFILE="./channel-artifacts/${CHANNEL_NAME}.block"## Create channel
# 创建通道
infoln "Creating channel ${CHANNEL_NAME}"
 createChannel
 successln "Channel '$CHANNEL_NAME' created"# 节点加入到通道中
## Join all the peers to the channel
# 将组织org1中的peer节点加到通道中
infoln "Joining org1 peer to the channel..."
 joinChannel 1# 将组织org2中的peer节点加到通道中
infoln "Joining org2 peer to the channel..."
 joinChannel 2# 设置锚节点
## Set the anchor peers for each org in the channel
# 设置组织org1的锚节点
infoln "Setting anchor peer for org1..."
 setAnchorPeer 1# 设置组织org2的锚节点
infoln "Setting anchor peer for org2..."
 setAnchorPeer 2successln "Channel '$CHANNEL_NAME' joined"

脚本流程梳理图

以上是脚本,对此脚本使用思维脑图梳理了流程,流程假设满足条件,满足必要条件(如相关配置文件已存在)且命令都可正常执行,如下图所示:

fabric通道写入策略_fabric_02