前提条件

启动上一步的自定义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

Hyperledger Fabric - 自定义createChannel命令的更多相关文章

  1. Hyperledger Fabric CA的命令行用法

    介绍Hyperledger Fabric CA的命令行方式简单用法 Hyperledger Fabric CA由server和client两部分组成. 设置两个环境变量 export FABRIC_C ...

  2. Hyperledger Fabric 命令整理

    Peer节点命令 Peer node start 启动一个Peer节点: peer node start status 获取当前节点的状态信息 peer node status reset 重置当前节 ...

  3. Hyperledger Fabric 常用命令

    Peer常用命令: #peer chaincode --help #peer channel list --help --logging-level <string> #<strin ...

  4. Hyperledger Fabric 2.x 自定义智能合约

    一.说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制:智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑. 本 ...

  5. hyperledger fabric 架设命令

    单节点架设 Order 网络: cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/ rm -rf channel-artifacts ...

  6. 基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例

    相关实验源码已上传:https://github.com/wefantasy/FabricLearn 前言 在基于truffle框架实现以太坊公开拍卖智能合约中我们已经实现了以太坊智能合约的编写及部署 ...

  7. Hyperledger Fabric部署与测试(Ubuntu)

    Fabric部署与测试 Fabric部署与测试最正确的还是参照官方链接:Hyperledger Fabric官方链接 ok,接下来开始部署Fabric.(以Ubuntu为例) 一.部署Fabric 1 ...

  8. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署

    6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...

  9. Hyperledger Fabric 建立一个简单网络

    Building you first network 网络结构: 2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service 打开fabric-sa ...

  10. 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

    摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...

随机推荐

  1. 《深入理解Mybatis原理》Mybatis中的缓存实现原理

    一级缓存实现 什么是一级缓存? 为什么使用一级缓存? 每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话. 在对数据库的一次会话中, ...

  2. WPF 设置DataGrid 选中的背景色和前景色

    <DataGrid > <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <S ...

  3. linux内核 list_for_each_entry

    1. linux内核中的list用法 在linus内核中,list一般这样使用: struct list_head { struct list_head *priv; struct list_head ...

  4. selenium等待的三种方式(详细)

    1.强制等待 time.sleep(3) 这种方式会是操作强行等待3s才会进行下一步操作,但是这种放法,可能会延长测试的时间,如果元素在1s中出现,就会浪费2s的时间,并且这种放法单次有效,每次需要等 ...

  5. 自定义swagger扩展解析jsondoc

    需求规定 为了减少注释和swagger注解的重复定义, 通过规范注释, 让swagger可以通过javadoc来产生 替换@Api.@ApiOperation.@ApiModel.@ApiModelP ...

  6. TCP/IP协议笔记

    TCP/IP 一.TCP/IP简介 TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol),是用于因特网 (Int ...

  7. 小程序uView中loadMore 加载更多

    <u-loadmore :status="status" :icon-type="iconType" :load-text="loadText& ...

  8. Linux命令格式详解

    Linux命令格式详解 在Linux系统中,命令行界面是用户与系统交互的重要方式之一.通过命令行,用户可以执行各种任务,从简单的文件操作到复杂的系统配置.为了更有效地使用命令行,理解Linux命令的基 ...

  9. Git与Github远程仓库使用

    目录 连接远程仓库Github 配置git信息 生成key 添加Key 测试连通 Git基本了解 初级使用 初始化项目 建议修改编码显示 查看项目文件内容改动状态 修改好推送暂存区 提交本地版本库 推 ...

  10. [SDOI2016] 数字配对 题解

    发现题目中描述的配对条件可以理解为:\(pc_i-pc_j=1\) 且 \(a_i\bmod a_j=0\),其中 \(pc_i\) 表示 \(a_i\) 的质因数个数. 自然想到以 \(pc\) 奇 ...