本文针对创建通道脚本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解析

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

  1. Fabric v2.3测试网络 - 创建通道 返回结果分析

    创建通道使用的命令 [root@localhost test-network]# ./network.sh createChannel 创建通道使用的命令用到了以下一些工具,如下图所示: 下面是创建通 ...

  2. 基于Fabric的商业票据交易网络案例分析

    商业票据交易网络案例分析 前言 准备环境 Java/JavaScript Node.js v8(如果要运行 JavaScript 客户端应用程序) Maven,用于构建 Java 应用程序 Java ...

  3. DNS测试bat脚本分析

    /********************************************************************* * Author : lile * Modified : ...

  4. 白鹭php源码,egret 2D引擎源码分析(二) 创建播放器

    本帖最后由 fightingcat 于 2016-7-16 00:26 编辑 上一篇讲到了引擎的入口runEgret为每一个播放器标签(就是index.html中看到的那个 之前web.WebPlay ...

  5. Fabric v2.3 手动模拟(一) - 测试网络./network.sh up命令创建自己的网络

    目录 0. 引言 1. 创建自己的网络目录 (1)进入fabric-samples目录 (2)创建文件夹test-network-myself(自己的网络目录) (3)进入test-network-m ...

  6. Hyperledger Fabric2.3 环境搭建及Fabric 测试网络使用

    一.安装ubuntu20 Download Ubuntu Desktop | Download | Ubuntu 二.安装环境 参考: Prerequisites - hyperledger-fabr ...

  7. Fabric 搭建测试网络并部署智能合约

    1.搭建网络: 详见博客 2.对Test Network的创建和关闭 cd ${HOME}/fabric-samples/test-network 创建网络: ./network.sh up关闭网络: ...

  8. FabricV2.2测试网络搭建以及开发环境部署

    部署测试网络 Prerequisites: 安装docker.docker-compose git.cURL 要求docker版本 下载Fabric源码,Binaries和Docker Images ...

  9. 3.Hyperledger Fabric v2.0 CA组件

    Hyperledger Fabric v2.0 CA组件 目的: 通过CA服务生成msp证书和tls证书,并启动fabric网络 由于使用CA生成证书时,需要注册为各个组织生成证书,为了便于理解,所以 ...

最新文章

  1. 开源助力!武汉新型冠状病毒防疫开源信息收集平台
  2. 为.net中的ListBox控件添加双击事件
  3. 数据库中查询记录时是否每次只能使用一个索引?
  4. 01-Flutter移动电商实战-项目学习记录
  5. PJ2018T4 对称二叉树 树形结构
  6. Opencv3 形态学操作
  7. 从「及格线」到优等生,威马只用一台W6
  8. 简述直方图和柱形图的区别_如何区分直方图与柱形图
  9. Oracle项目管理系统的BIM应用
  10. 当mqtt客户端向服务端发送信息出现掉包的问题
  11. SNF快速开发平台项目实践介绍
  12. FinalReport连接MYSQL数据库失败经验分享
  13. ei计算机相关 小木从,怀念楼讲心那棵小木钩瞒
  14. SiTime硅晶振MEMS谐振子制作工艺详解
  15. 【Latex】记录写毕业论文时用到的操作
  16. win7设置桌面豆绿色
  17. C#Application.DoEvents();的作用。
  18. nodeJS与npx之间的三两事
  19. echart 地图显示不全解决
  20. hadoop分布式环境搭建

热门文章

  1. 给自己弄一个酷酷的Github主页吧
  2. OpenStack ussuri 私有云平台搭建
  3. 基于Django的大型超市管理系统毕业设计
  4. 关于MySQL拒绝访问的解决方法
  5. MYSQL 强制使用索引
  6. 3DUnity编程与设计_HW5
  7. 新上任的领导如何才能顺利打开工作局面?
  8. identifier “bind“ is undefined 解决方案
  9. 怎么把图片拼在一起?分享几种简单好用拼图小技巧
  10. 避障算法 - VO、RVO 以及 ORCA (RVO2)[转载]