前提条件

启动上一步的自定义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. find_package()使用指南

    关于find_package() 在使用cmake引用第三方库(比如OpenCV)时,我们总是使用find_package()这个指令来实现对包的查找(比如find_package(OpenCV)). ...

  2. 2020年最新版区块链面试题1-copy

    1. 什么是区块链? 回答:区块链是不间断的经济交易数字分类帐,可以进行编程,以记录不仅是金融交易,还可以记录几乎所有有价值的东西.简单来说,它是一个不可变记录的分散式分布式数据库,该数据库由计算机集 ...

  3. SpringBoot启动报错:HikariPool-1 - Exception during pool initialization.

    不说废话,直接上错误信息: 2020-06-23 10:48:19.899 INFO 10608 --- [ main] cn.wps.ep.account.sync.Application : St ...

  4. try-catch-finally的使用

    /* * 一.异常的处理:抓抛模型 * * 过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象. * 并将此对象抛出. * 一旦抛出对象 ...

  5. Popup弹出层滚动不流畅

    使用 Vant 框架中的 van-popup 组件(弹框组件);导致列表上下滑动不流畅 Popup 弹出层 滚动不流畅 <van-popup v-model="conFlag" ...

  6. wsgi服务器

    wsgi服务器DRP原则:Don't repeat yourself1.wsgi接口:全称 Web Server Gateway Interface (web服务器网关接口) 请求:request 响 ...

  7. 自动安装zabbix-agentd脚本 自己写的

    zabbix_agent_install.sh #!/bin/bash #auther by wangxp ZABBIX_AGENT_DIR="/usr/local/zabbix" ...

  8. Doris BloomFilter原理

    1.Bloom Filter的核心是一个[m]位的bitset和[k]个hash函数. 初始时bitset中所有位的值都设置为0,假设取[m = 10],[k = 3],用蓝色表示某位为0,红色表示为 ...

  9. Java中的输出格式化

    在Java中,输出格式化是一个非常重要的功能,尤其是在需要精确控制输出格式的场景下. 以下是对代码中输出部分的详细解释: 原代码中的输出: System.out.printf("%.6f\n ...

  10. AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀!

    1 AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀! 1.1 背景   在AI编程大行其道的背景下,各种AI编程工具:Cursor.VSCode的各种插件.Trae等等搞得不亦乐乎!您 ...