4.创建和加入通道相关(network.sh脚本createChannel函数分析)[fabric2.2]

news2024/11/16 3:14:18

fabric的test-network例子有一个orderer组织、两个peer组织、每个组织一个节点,只有系统通道(system-channel),没有其他应用通道。我们可以使用./network.sh createChannel命令来创建一个名为mychannel的应用通道。

一、主要概念

通道

通道用于实现区块链网络中业务的隔离,一个联盟可以有多个通道,每个通道可代表一项业务,每个通道内的成员可以共享账本,不同通道的账本彼此隔离。一个组织可以加入多个通道,通道内的成员为业务参与方,可以向通道发送交易,经过共识后被通道内的Peer节点接收并更新到本地账本。

锚节点

锚节点主要用途,用来辅助发现通道内多个组织之间的节点,并将自身组织的节点信息同步至其他组织。锚节点修改锚节点需要发送更新通道配置交易。

通道配置交易

通道配置交易文件在创建通道和加入通道更新锚节点时来指定配置信息。

为什么叫通道配置交易文件?个人理解是创建通道和加入通道是作为交易发送至orderer节点的,所以。。。

二、创建及加入通道

cd /root/fabric/scripts/fabric-samples/test-network # 进入测试案例目录
./network.sh createChannel # 调用network.sh脚本创建通道

三、network.sh 脚本createChannel函数分析

network.sh脚本使用createChannel参数时调用的是createChannel函数

![(https://img-blog.csdnimg.cn/426279b880cd4e28a4c1464c207cadfc.png)

再来看createChannel()函数

function createChannel() {
  # Bring up the network if it is not already up.

  if [ ! -d "organizations/peerOrganizations" ]; then
    infoln "Bringing up network"
    networkUp  # 启动网络
  fi

  # 运行scripts/createChannel.sh脚本来创建通道
  # 创建通道,创建交易和锚节点更新.
  # 使用configtx.yaml配置文件创建通道
  scripts/createChannel.sh $CHANNEL_NAME $CLI_DELAY $MAX_RETRY $VERBOSE
}

查看scripts/createChannel.sh脚本文件,翻到最后可以发现整个脚本完成了四步操作,调用了四个函数:

  • 创建通道配置交易文件 channeltx
  • 创建通道
  • 将所有节点(org1 peer 和org2 peer)加入通道
  • 为通道中的每个组织设置锚点
## 创建通道交易文件 channeltx
infoln "Generating channel create transaction '${CHANNEL_NAME}.tx'"
createChannelTx # 调用createChannelTx 函数

FABRIC_CFG_PATH=$PWD/../config/
BLOCKFILE="./channel-artifacts/${CHANNEL_NAME}.block"

## 创建通道
infoln "Creating channel ${CHANNEL_NAME}"
createChannel  # 调用createChannel 函数
successln "Channel '$CHANNEL_NAME' created"

## 将所有节点(org1 peer 和org2 peer)加入通道
infoln "Joining org1 peer to the channel..."
joinChannel 1 # 调用joinChannel函数,将org1 peer加入通道
infoln "Joining org2 peer to the channel..."
joinChannel 2 ## 调用joinChannel函数,将org2 peer加入通道

##为通道中的每个组织设置锚点
infoln "Setting anchor peer for org1..."
setAnchorPeer 1 # 调用setAnchorPeer函数,设置org1的锚节点
infoln "Setting anchor peer for org2..."
setAnchorPeer 2 # 调用createChannel 函数

createChannelTx函数分析

函数的作用是创建通道配置交易文件 channeltx,函数的核心是调用了configtxgen工具。

createChannelTx() {
	set -x
	#configtxgen工具依赖configtx.yaml文件
	#使用TwoOrgsChanne模板,定义了应用通道配置,可以用来新建应用通道。
	#TwoOrgsChanne模板在test-network/configtx/configtx.yaml文件定义
	#-profile 指定使用的是configtx.yaml中某个用于生成的Profiles配置项。
	#-outputCreateChannelTx 通道配置交易文件的保存路径
	#-channelID 在configtx中使用的通道ID,就是通道名称
	#下面详细介绍 configtxgen工具的参数
	configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID $CHANNEL_NAME
	res=$?
	{ set +x; } 2>/dev/null
  verifyResult $res "Failed to generate channel configuration transaction..."
}

configtxgen工具

configtxgen工具主要功能包括:

  • 生成启动网络需要的系统通道初始区块,并支持检查区块内容;
  • 生成创建应用通道需要的配置交易,并支持检查交易内容;
  • 生成对锚点Peer(锚节点)的更新配置交易

configtxgen工具的可选参数:

# configtxgen --help # 使用帮助命令查看

Usage of configtxgen:
  -asOrg string
        作为特定组织(按名称)执行配置生成,仅包括组织(可能)有权设置的写入集中的值
  -channelCreateTxBaseProfile string
       指定一个配置文件以将其视为orderer系统通道的当前状态,以允许在通道创建tx文件生成期间修改非应用程序参数。仅与“outputCreateChannelTx”结合使用有效。
  -channelID string
       在configtx中使用的通道 ID
  -configPath string
        包含要使用的配置的路径(如果设置)
  -inspectBlock string
        打印指定路径的块中包含的配置
  -inspectChannelCreateTx string
        打印指定路径下事务中包含的配置
  -outputAnchorPeersUpdate string
       [已弃用] 创建一个配置更新来更新锚点(仅适用于默认通道创建,并且仅适用于第一次更新)
  -outputBlock string
        写入创世块的路径(如果设置)
  -outputCreateChannelTx string
        设置通道创建的configtx的保存路径路径(如果已设置)
  -printOrg string
        将组织的定义打印为JSON。(对于手动将组织添加到频道很有用)
  -profile string
        指定configtx.yaml中用于生成的配置项。
  -version
        显示版本信息

createChannel函数分析

函数的作用是创建通道,客户端需要发送请求给Orderer创建应用通道,然后等待orderer创建通道。在这里创建了一个名为mychannel通道。(在network.sh中定义了CHANNEL_NAME="mychannel")。

createChannel() {
	# setGlobals函数在scripts/envVar.sh文件中定义
	# 作用是为peer组织设置环境变量
	# 指定了组织的管理员用户的证书文件的位置
	# 需要配置交易文件channel.tx,并且只有组织的管理身份才能执行创建通道的命令
	setGlobals 1
	# 在 raft leader还没有设置前一直循环
	local rc=1
	local COUNTER=1
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
		sleep $DELAY
		set -x
		#调用peer channel命令的子命令create,需要由拥有创建通道权限组织管理员身份来调用,在指定的排序服务上创建新的应用通道
		#-o order服务地址
		#-c 创建通道的名称
		#--ordererTLSHostnameOverride 验证Orderer TLS时覆盖所校验的主机名
		#-f 指定创建通道所用的交易文件
		#--outputBlock 创建通道成功后,将初始区块写到本地指定文件,默认为./.block。
		#--tls 连接到Orderer服务时是否启用TLS
		#--cafile 信任的排序服务的TLS CA证书,PEM编码格式
		peer channel create -o localhost:7050 -c $CHANNEL_NAME --ordererTLSHostnameOverride orderer.example.com -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock $BLOCKFILE --tls --cafile $ORDERER_CA >&log.txt
		# 通道创建成功后会生成,初始区块文件mychannel.block
		res=$?
		{ set +x; } 2>/dev/null
		let rc=$res
		COUNTER=$(expr $COUNTER + 1)
	done
	cat log.txt
	verifyResult $res "Channel creation failed"
}

相同可以使用peer channel --help查看全部可以使用的参数。

joinChannel函数分析

函数的作用是将所有节点(org1 peer 和org2 peer)加入通道。

joinChannel被调用两次org1 peer和org1 peer2被加入节点。

# 将组织加入通道
joinChannel() {
  FABRIC_CFG_PATH=$PWD/../config/
  ORG=$1
  	# setGlobals函数在scripts/envVar.sh文件中定义
	# 作用是为peer组织设置环境变量
	# 指定了组织的管理员用户的证书文件的位置
	# 需要拥有所加入通道的初始区块文件,并且只有组织的管理身份才能执行创建通道的命令
	setGlobals 1
  setGlobals $ORG
	local rc=1
	local COUNTER=1
	## 有时加入需要时间,因此重试
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
    sleep $DELAY
    set -x
	# peer的join子命令会将指定的Peer节点加入指定的应用通道中
	# -b 指定通道初始区块文件路径
    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函数分析

函数的作用是为通道中的每个组织设置锚点,配置和更新锚节点的命令在setAnchorPeer.sh(需要在容器中运行)中。

setAnchorPeer() {
  ORG=$1
  # 在setAnchorPeer.sh脚本中配置和更新锚节点
  docker exec cli ./scripts/setAnchorPeer.sh $ORG $CHANNEL_NAME 
}

再来看scripts/setAnchorPeer.sh脚本:主要为三个步骤)
下面来看具体的函数实现:
在这里插入图片描述

# 注意:这必须在 CLI 容器中运行,因为它需要 jq 和 configtxlator
createAnchorPeerUpdate() {
  infoln "Fetching channel config for channel $CHANNEL_NAME"
  #  fetchChannelConfig在scripts/configUpdate.sh脚本中定义,将给定通道的当前道配置信息写入 JSON 文件
  fetchChannelConfig $ORG $CHANNEL_NAME ${CORE_PEER_LOCALMSPID}config.json

  infoln "Generating anchor peer update transaction for Org${ORG} on channel $CHANNEL_NAME"
# 选择是哪一个组织
  if [ $ORG -eq 1 ]; then
    HOST="peer0.org1.example.com"
    PORT=7051
  elif [ $ORG -eq 2 ]; then
    HOST="peer0.org2.example.com"
    PORT=9051
  elif [ $ORG -eq 3 ]; then
    HOST="peer0.org3.example.com"
    PORT=11051
  else
    errorln "Org${ORG} unknown"
  fi

  set -x
  # 修改配置增加锚节点
  jq '.channel_group.groups.Application.groups.'${CORE_PEER_LOCALMSPID}'.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "'$HOST'","port": '$PORT'}]},"version": "0"}}' ${CORE_PEER_LOCALMSPID}config.json > ${CORE_PEER_LOCALMSPID}modified_config.json
  { set +x; } 2>/dev/null

  # createConfigUpdate在scripts/configUpdate.sh脚本中定义,用于生成配置更新文件
  # 根据 {orgmsp}config.json 和 {orgmsp}modified_config.json两者之间的差异计算配置更新
  #,将其作为交易写入 {orgmsp}anchors.tx
  createConfigUpdate ${CHANNEL_NAME} ${CORE_PEER_LOCALMSPID}config.json ${CORE_PEER_LOCALMSPID}modified_config.json ${CORE_PEER_LOCALMSPID}anchors.tx
}
  #更新锚节点
  #peer channel update命令用于更新通道的配置信息,如组织、锚节点配置等
updateAnchorPeer() {
  peer channel update -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL_NAME -f ${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt
  res=$?
  cat log.txt
  verifyResult $res "Anchor peer update failed"
  successln "Anchor peer set for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME'"
}

至此创建通道和加入通道完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java开发】JUC进阶 04:线程池详解

1 线程池介绍由于频繁创建销毁线程要调用native方法比较消耗资源,为了保证内核的充分利用,所以引入了线程池的概念。📌 线程池优点降低资源消耗提高响应速度方便管理📌 创建线程池使用Executors创建使用ThreadPoolExecutor创建&am…

Git图解-为啥是Git?怎么装?

目录 零、学习目标 一、版本控制 1.1 团队开发问题 1.2 版本控制思想 1.2.1 版本工具 二、Git简介 2.1 简介 2.2 Git环境的搭建 三、转视频版 零、学习目标 掌握git的工作流程 熟悉git安装使用 掌握git的基本使用 掌握分支管理 掌握IDEA操作git 掌握使用git远程仓…

【教程】记录Typecho Joe主题升级与Joe魔改版

目录 升级Joe 其他魔改版 Joe主题挺好看的,很早之前我就装了。后来官方升级了主题,但没有给升级教程。这里记录一下我的升级过程,供大家参考。 Joe Github:GitHub - HaoOuBa/Joe: A Theme of Typecho 升级站点:小锋学…

WSL2使用Nvidia-Docker实现CUDA版本自由切换

众所周知,深度学习的环境往往非常麻烦,经常不同的项目所依赖的 torch、tensorflow 包对 CUDA 的版本也有不同的要求,Linux 下进行 CUDA 的管理比较麻烦,是一个比较头疼的问题。 随着 WSL2 对物理机显卡的支持,Nvidia-…

用二极管和电容过滤电源波动,实现简单的稳压 - 小水泵升压改装方案

简而言之,就是类似采样保持电路,当电源电压因为电机启动而骤降时,用二极管避免电容电压跟着降低,从而让电容上连接的低功耗芯片有一个比较稳定的供电电压。没什么特别的用处,省个LDO 吧,电压跌幅太大的时候…

最详细Sql语句优化大汇总 面试必问 含解释

欢迎补充和纠正!!! 目录 欢迎补充和纠正!!! 基础知识 相关索引的创建 一条sql语句的执行过程 sql语句关键字的执行顺序 SQL优化 使用explain来分析Sql语句 尽量用varchar代替char 使用数值代替字符…

Vector - CAPL - 定时器函数和使用

定时器在C语言中的使用我想学习过C编程的都不会陌生,它能够提供延时,完成等待一定的时间;它也可以实现多线程的操作,并行实行某些软件功能。那在CAPL中,定时器又能做哪些工作呢?又是怎么使用的呢&#xff1…

SPringCloud:Nacos快速入门及相关属性配置

目录 一、Nacos快速入门 1、在父工程中添加spring-cloud-alilbaba的管理依赖 2、如果有使用eureka依赖,将其注释 3、添加nacos的客户端依赖 4、修改yml文件,注释eureka配置 5、启动测试 二、Nacos相关属性配置 1、Nacos服务分级存储 2、根据集群…

ELasticsearch基本使用——基础篇

1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容例如:在GitHub搜索代码在电商网站搜索商品在谷歌搜索答案在打车软件搜索…

Oracle中merge Into的用法

Oracle中merge Into的用法 使用场景 在操作数据库时,数据存在的情况下,进行update操作;不存在的情况下,进行insert操作;在Oracle数据库中,能够使用merge into来实现。 基本语法 merge into table_name …

Go项目的目录结构基本布局

前言 随着项目的代码量在不断地增长,不同的开发人员按自己意愿随意布局和创建目录结构,项目维护性就很差,代码也非常凌乱。良好的目录与文件结构十分重要,尤其是团队合作的时候,良好的目录与文件结构可以减少很多不必要…

HashSet原理

HashSet原理HashSet原理1.概述2.底层代码3.原理图解4.总结4.1: 1.7原理总结4.2: 1.8原理总结HashSet原理 1.概述 ​ HashSet 实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的 迭代顺序;特别是它不保证…

MathType7最新版免费数学公式编辑器

话说我也算是 MathType准资深(DB)用户了,当然自从感觉用DB不好之后,我基本上已经抛弃它了,只是前不久因为个别原因又捡起来用了用,30天试用期间又比较深入的折腾了下,也算是变成半个MathType砖家,coco玛奇朵简单介绍一下这款软件:在很可能看到这儿的你还没有出生的某个年月&…

汇编语言程序设计(三)之汇编程序

系列文章 汇编语言程序设计(一) 汇编语言程序设计(二)之寄存器 汇编程序 经过上述课程的学习,我们可以编写一个完整的程序了。这章开始我们将开始编写完整的汇编语言程序,用编译和连接程序将它们连接成可…

反转链表——C语言经典单链表题目

首先,把oj题目的链接放在这,大家可以先去练习一下,再来看解析。 反转链表——力扣 题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 现在让我们来看一下解决代码,先看一下我写…

网上销售笔记本系统

技术:Java、JSP等摘要:本文讲述了基于B/S模式的笔记本电脑在线销售系统的设计与实现。所谓的笔记本电脑在线销售系统是通过网站推广互联企业的笔记本电脑和技术服务,并使客户随时可以了解企业和企业的产品,为客户提供在线服务和订…

04_Apache Pulsar的可视化监控管理、Apache Pulsar的可视化监控部署

1.4.Apache Pulsar的可视化监控管理 1.4.1.Apache Pulsar的可视化监控部署 1.4.Apache Pulsar的可视化监控管理 1.4.1.Apache Pulsar的可视化监控部署 第一步:下载Pulsar-Manager https://archive.apache.org/dist/pulsar/pulsar-manager/pulsar-manager-0.2.0/…

OpenCV-Python学习(22)—— OpenCV 视频读取与保存处理(cv.VideoCapture、cv.VideoWriter)

1. 学习目标 学习 OpenCV 的视频的编码格式 cv.VideoWriter_fourcc;学会使用 OpenCV 的视频读取函数 cv.VideoCapture;学会使用 OpenCV 的视频保存函数 cv.VideoWriter。 2. cv.VideoWriter_fourcc()常见的编码参数 2.1 参数说明 参数说明cv.VideoWr…

用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026

这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…

为什么我给蓝牙芯片KT6368A发送AT指令没有反应呢

目录 一、问题描述简介 为什么我给蓝牙芯片KT6368A发送AT指令没有反应呢?查看了文档也没找到具体的解决办法 二、详细描述 这个问题,主要分为两个部分去考虑 KT6368A的芯片,上电是否正常,也就是有没有跑起来,这个详…