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.作业场所监督检查是安全生产监督管理的一种重要形式,作业场所监督…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...