Hyperledger Fabric - 自定义createChannel命令
前提条件
启动上一步的自定义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命令的更多相关文章
- Hyperledger Fabric CA的命令行用法
介绍Hyperledger Fabric CA的命令行方式简单用法 Hyperledger Fabric CA由server和client两部分组成. 设置两个环境变量 export FABRIC_C ...
- Hyperledger Fabric 命令整理
Peer节点命令 Peer node start 启动一个Peer节点: peer node start status 获取当前节点的状态信息 peer node status reset 重置当前节 ...
- Hyperledger Fabric 常用命令
Peer常用命令: #peer chaincode --help #peer channel list --help --logging-level <string> #<strin ...
- Hyperledger Fabric 2.x 自定义智能合约
一.说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制:智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑. 本 ...
- hyperledger fabric 架设命令
单节点架设 Order 网络: cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/ rm -rf channel-artifacts ...
- 基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例
相关实验源码已上传:https://github.com/wefantasy/FabricLearn 前言 在基于truffle框架实现以太坊公开拍卖智能合约中我们已经实现了以太坊智能合约的编写及部署 ...
- Hyperledger Fabric部署与测试(Ubuntu)
Fabric部署与测试 Fabric部署与测试最正确的还是参照官方链接:Hyperledger Fabric官方链接 ok,接下来开始部署Fabric.(以Ubuntu为例) 一.部署Fabric 1 ...
- Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署
6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...
- Hyperledger Fabric 建立一个简单网络
Building you first network 网络结构: 2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service 打开fabric-sa ...
- 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...
随机推荐
- [.NET] 使用客户端缓存提高API性能
使用客户端缓存提高API性能 摘要 在现代应用程序中,性能始终是一个关键的考虑因素.无论是提高响应速度,降低延迟,还是减轻服务器负载,开发者都在寻找各种方法来优化他们的API.在Web开发中,利用客户 ...
- biancheng-Spring Cloud Alibaba Nacos
参考http://c.biancheng.net/springcloud/what-is-alibaba.html http://c.biancheng.net/springcloud/nacos.h ...
- 高性能队列Disruptor
背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能 ...
- Web访问过程
WEB访问的具体过程: 命令 浏览器中查看DNS chrome://net-internals/#dns 查看本地DNS ipconfig/displaydns 查看HOST文件 C:\Windows ...
- Rust多线程中安全的使用变量
在Rust语言中,一个既引人入胜又可能带来挑战的特性是闭包如何从其所在环境中捕获变量,尤其是在涉及多线程编程的情境下. 如果尝试在不使用move关键字的情况下创建新线程并传递数据至闭包内,编译器将很可 ...
- 第9章 LINQ 运算符
第9章 LINQ 运算符 本章所有例子所使用的 names 数组都是一致的: string[] names = {"Tom", "Dick", "Ha ...
- Flink流处理-简单案例-01
一.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Linux环境Docker使用代理推拉镜像
闲扯几句 不知不觉已经2月中了,1个半月忙得没写博客,这篇其实很早就想写了(可追溯到Docker刚刚无法拉镜像的时候),由于工作和生活上的事比较多又在备考软考架构,拖了好久-- 简单记录下怎么做的,以 ...
- C# Graphic 操作记录
C# 在图片上绘制文字 /// <summary> /// 生成文字图片 /// </summary> /// <param name="text"& ...
- Linux - 内核版本升级
测试时间:2024年5月15日,本文测试CentOS7.9的内核版本升级 测试结论:不要选择手动编译的方式!!! 一.使用第三方仓库(ELRepo) (1)升级前内核查看(3.10.0-1160.el ...