Fabric v2.3 测试网络 - 脚本分析(二)- 创建通道createChannel.sh解析

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

目录

# 导入引用的脚本文件

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

# 函数 - 创建通道

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

# 函数 - 设置锚节点

# 脚本开始执行

# 创建通道创世区块

# 创建通道

# 节点加入到通道中

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

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

# 设置锚节点

# 设置组织org1的锚节点

# 设置组织org2的锚节点

脚本流程梳理图


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

#!/bin/bash

# imports  

# 导入引用的脚本文件

# envVar.sh脚本包含节点证书的环境变量,验证执行命令结果函数verifyResult、切换组织环境变量函数setGlobals等

. scripts/envVar.sh

# utils.sh脚本为打印输出信息功能,network.sh脚本调用了utils.sh脚本中的相关函数,如infoln、fatalln等函数,脚本简单,自行查看下
. scripts/utils.sh

CHANNEL_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_CFG_PATH=${PWD}/configtx

## Create channel genesis block

# 创建通道创世区块

infoln "Generating channel genesis block '${CHANNEL_NAME}.block'"
createChannelGenesisBlock

FABRIC_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 2

successln "Channel '$CHANNEL_NAME' joined"

脚本流程梳理图

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

上一篇:Fabric v2.3 测试网络 - 启动测试网络脚本文件network.sh解析

下一篇:Fabric v2.3 测试网络 - 脚本分析(三)- 创建通道 - 设置锚节点setAnchorPeer.sh解析 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值