4.创建和加入通道相关(network.sh脚本createChannel函数分析)[fabric2.2]
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函数

再来看createChannel()函数
function createChannel() {# Bring up the network if it is not already up.if [ ! -d "organizations/peerOrganizations" ]; theninfoln "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_NAMEres=$?{ set +x; } 2>/dev/nullverifyResult $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=1local COUNTER=1while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; dosleep $DELAYset -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.blockres=$?{ set +x; } 2>/dev/nulllet rc=$resCOUNTER=$(expr $COUNTER + 1)donecat log.txtverifyResult $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 1setGlobals $ORGlocal rc=1local COUNTER=1## 有时加入需要时间,因此重试while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; dosleep $DELAYset -x# peer的join子命令会将指定的Peer节点加入指定的应用通道中# -b 指定通道初始区块文件路径peer channel join -b $BLOCKFILE >&log.txtres=$?{ set +x; } 2>/dev/nulllet rc=$resCOUNTER=$(expr $COUNTER + 1)donecat log.txtverifyResult $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.jsoninfoln "Generating anchor peer update transaction for Org${ORG} on channel $CHANNEL_NAME"
# 选择是哪一个组织if [ $ORG -eq 1 ]; thenHOST="peer0.org1.example.com"PORT=7051elif [ $ORG -eq 2 ]; thenHOST="peer0.org2.example.com"PORT=9051elif [ $ORG -eq 3 ]; thenHOST="peer0.org3.example.com"PORT=11051elseerrorln "Org${ORG} unknown"fiset -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.txcreateConfigUpdate ${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.txtres=$?cat log.txtverifyResult $res "Anchor peer update failed"successln "Anchor peer set for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME'"
}
至此创建通道和加入通道完成。
相关文章:
4.创建和加入通道相关(network.sh脚本createChannel函数分析)[fabric2.2]
fabric的test-network例子有一个orderer组织、两个peer组织、每个组织一个节点,只有系统通道(system-channel),没有其他应用通道。我们可以使用./network.sh createChannel命令来创建一个名为mychannel的应用通道。 一、主要概念 …...
若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)
如何自定义注解 aop的基本知识与应用 若依对用户的一些更新删除等敏感操作操作进行了日志记录 注解定义和切面处理的项目位置 第一步:自定义注解log 定义了注解的相关信息。这里定义的属性可以在使用时加以定义 注解Target和Retention的作用 第二步切面逻辑…...
防止暴力破解ssh的四种方法
一. 方法介绍 防止暴力破解的四种方法: 1 密码要写的足够的复杂,通常建议将密码写16位,并且无连贯的数字或者字母;当然也可以固定一个时间修改一次密码,推荐是一个月修改一次会稳妥一些2 修改ssh的端口号,…...
jsp试卷分析管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP试卷分析管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
可选链运算符(?.)与空值合并运算符(??)
1. 可选链运算符Optional chaining(?.) MDN定义 可选链运算符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (n…...
JavaScript 闭包
JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。全局变量函数可以访问函数内部定义的变量,如:实例function myFunction() {var a 4;return a * a;}尝试一下 函数也可以访问函数外部定义的变量,如:实例var a 4…...
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
今日想法今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。所以用到了下方三个东西。Viewbindingbuild.gradle配置首先在app模块的build.gradle里添加一下代码默认情况下,每一个布局xml文件都会生成…...
20230305英语学习
Climate Change Is Suffocating Large Parts of the Ocean 研究:气候变化正在使海洋“缺氧” One day more than a decade ago, Eric Prince was studying the tracks of tagged fish when he noticed something odd.Blue marlin off the southeastern United State…...
【Linux】手把手教你在CentOS上使用docker 安装MySQL8.0
文章目录前言一. docker的安装1.1 从阿里下载repo镜像1.2 安装docker1.3 启动docker并查看版本二. 使用docker安装MySQL8.02.1 拉取MySQL镜像2.2 创建容器2.3 操作MySQL容器2.4 远程登录测试总结前言 大家好,又见面了,我是沐风晓月,本文主要…...
论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts
论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts 今天介绍一篇发表于 2022 年 ACM Tranaction on Graphic 上的文章,这篇文章通过多帧曝光将 HDR 与 SR 放在一起解决,与一般的文章不同的地方在于,这篇文…...
国内的PMP考试通过率高达97%?
自认为是虚高,虽然国人在考试方面的确独树一帜的强,应该也没有这样夸张。 如果自学,大概是50%,如果有老师教,那大概是60%到80%,还是比较高的。 为什么自学那么低?除了自身的自制力的问题&…...
IOC(概念和原理)
文章目录1. IOC容器概念2. IOC底层原理3. IOC(接口)4. IOC操作Bean管理(概念)5. IOC操作Bean管理(基于xml方式)5.1 基于xml创建对象5.2 基于xml方式注入属性5.2.1 DI:依赖注入,就是注…...
操作系统 - 第二章
一、进程的定义、组成、组织、特征 一、进程的定义 从不同的角度,进程有不同的定义 1、进程是程序的一次执行过程; 2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动; 3、进程是具有独立功能的程序在数据集合上运行的过程…...
进程控制~
进程控制 (创建、终止,等待,程序替换) 进程创建: pid_t fork();父子进程,数据独有,代码共享,各有各的地址 pit_t vfork();父进程阻塞,直到子进程exit退出或者程序替换之…...
HCIP第一个实验
实验要求与实验拓扑子网划分分析将骨干链路看成一个整体,路由器后的2个环回地址先看成一个,最后再进行拆分。计算得出,一共需要划分为6个子网段,取三位。再将每一条网段,按照题目要求进行划分最后完成子网划分。子网划…...
阿里云轻量服务器--Docker--dubbo-admin安装(连接zookeeper nacos)
前言:当使用dubbo 作为微服务的接口调用,在dubbo 注册到zookeeper 或者nacos 中时 可以安装dubbo-admin 作为服务的监测; 1 Dubbo Admin 介绍: Dubbo 框架提供了丰富的服务治理功能如流量控制、动态配置、服务 Mock、服务测试等…...
树莓派Pico W无线WiFi开发板使用方法及MicroPython编程实践
树莓派Pico W开发板是树莓派基金会于2022年6月底推出的一款无线WiFi开发板,它支持C/C和MicroPython编程。本文介绍树莓派Pico W无线WiFi开发板的使用方法及MicroPython编程示例,包括树莓派Pico W开发板板载LED使用及控制编程示例,Pico W开发板…...
Redis学习【11】之分布式系统
文章目录一 数据分区算法1.1 顺序分区1.1.1 轮询分区算法1.1.2 时间片轮转分区算法1.1.3 数据块分区算法1.1.4 业务主题分区算法1.2 哈希分区1.2.1 节点取模分区算法1.2.2 一致性哈希分区算法1.2.3 虚拟槽分区算法二 分布式系统环境搭建与运行2.1 系统搭建2.1.1 系统架构2.1.2 …...
光速c数列的猜想:光猜
光速c数列的猜想:光猜 2023-03-05 10:26:30 猜测:不同的宇宙光速c并不同 分成等级数列c0,c1,c2,...cn... 地球所处宇宙的真空光速c为c1,其中c0或许假设为光在纯水中速度乎 亦有可能仅有六级对应六道。 宇宙外,容器外也,超过光速c1,为光速c2,可看到容器…...
2023年全国最新交安安全员精选真题及答案12
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 21.作业场所监督检查是安全生产监督管理的一种重要形式,作业场所监督…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
