Hyperledger Fabric 示例启动流程(二)

2023-11-18

test-network启动流程

在这里插入图片描述

1 启动测试网络

此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络。

./network.sh up
  • createOrgs 使用cryptogen工具或者Fabric CA来创建Org1、Org2、Orderer组织的身份证书
  • createConsortium 使用configtxgen工具来创建联盟,生成系统通道的创世区块genesis.block
1.1 createOrgs

(1)cryptogen工具创建组织的身份证书

cryptogen generate --config=./organizations/cryptogen/crypto-config-org1.yaml --output="organizations"
cryptogen generate --config=./organizations/cryptogen/crypto-config-org2.yaml --output="organizations"
cryptogen generate --config=./organizations/cryptogen/crypto-config-orderer.yaml --output="organizations"

crypto-config-org1.yaml

PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 1
      SANS:
        - localhost
    Users:
      Count: 1

crypto-config-orderer.yaml

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer
        SANS:
          - localhost

Template:模板定义节点的配置模式
Specs:另外一种配置模式
Count:节点总数
Hostname :全限定域名 命名格式
Domain:域名
Users :添加到管理员的用户帐户数

(2)执行ccp-generate.sh脚本创建Org1和Org2的ccp文件,生成json和yaml两种配置共四个文件。

  • connection_org1.json
  • connection_org1.yaml
  • connection_org2.json
  • connection_org2.yaml
1.2 createConsortium

cryptogen工具创建联盟,指定TwoOrgsOrdererGenesis和系统通道ID,生成genesis.block,configtx.yaml文件配置了系统通道、Orderer配置、联盟配置,这些配置信息都要保存到创始区块中。这个配置文件稍后分析

configtxgen -profile TwoOrgsOrdererGenesis -channelID system-channel -outputBlock ./system-genesis-block/genesis.block

fabric-samples/test-network/configtx/configtx.yaml

Profiles:

    TwoOrgsOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
1.3 启动docker镜像
COMPOSE_FILE_BASE=docker/docker-compose-test-net.yaml
docker-compose ${COMPOSE_FILES} up -d 2>&1

docker-compose-test-net.yaml
启动了orderer.example.com、peer0.org1.example.com、peer0.org2.example.com三个镜像
image:指定镜像
environment:配置dockder容器内的环境变量
working_dir:指定工作目录
command:启动后执行的命令
volumes:挂载卷,MPS证书、TLS证书,创始区块
ports:指定端口
networks:指定网络

2 创建应用通道

执行createChannel脚本,以下五个步骤

  • createChannelTx
  • createAncorPeerTx
  • createChannel
  • joinChannel
  • updateAnchorPeers
2.1 createChannelTx创建通道配置文件

configtxgen工具创建mychannel.tx配置文件,指定configtx.yaml文件中的TwoOrgsChannel參數

createChannelTx() {

	set -x
	configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID $CHANNEL_NAME
	res=$?
	{ set +x; } 2>/dev/null
	if [ $res -ne 0 ]; then
		fatalln "Failed to generate channel configuration transaction..."
	fi

}
2.2 createAncorPeerTx创建锚节点配置文件

configtxgen工具创建Org1MSPanchors.tx和Org2MSPanchors.tx配置文件,指定configtx.yaml文件中的TwoOrgsChannel參數

createAncorPeerTx() {

	for orgmsp in Org1MSP Org2MSP; do

	infoln "Generating anchor peer update transaction for ${orgmsp}"
	set -x
	configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/${orgmsp}anchors.tx -channelID $CHANNEL_NAME -asOrg ${orgmsp}
	res=$?
	{ set +x; } 2>/dev/null
	if [ $res -ne 0 ]; then
		fatalln "Failed to generate anchor peer update transaction for ${orgmsp}..."
	fi
	done
}
2.3 createChannel创建通道

setGlobals 1指定了Org1的peer,连接peer创建应用通道,指定通道配置文件,生成应用通道创始区块mychannel.block

createChannel() {
	setGlobals 1
	# Poll in case the raft leader is not set yet
	local rc=1
	local COUNTER=1
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
		sleep $DELAY
		set -x
		peer channel create -o localhost:7050 -c $CHANNEL_NAME --ordererTLSHostnameOverride orderer.example.com -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile $ORDERER_CA >&log.txt
		res=$?
		{ set +x; } 2>/dev/null
		let rc=$res
		COUNTER=$(expr $COUNTER + 1)
	done
	cat log.txt
	verifyResult $res "Channel creation failed"
	successln "Channel '$CHANNEL_NAME' created"
}
2.4 joinChannel组织加入通道

将Org1和Org2的peer都加入到通道中,需要传入通道创始区块

joinChannel() {
  ORG=$1
  setGlobals $ORG
	local rc=1
	local COUNTER=1
	## Sometimes Join takes time, hence retry
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
    sleep $DELAY
    set -x
    peer channel join -b ./channel-artifacts/$CHANNEL_NAME.block >&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' "
}
2.5 updateAnchorPeers更新锚节点

将Org1和Org2的peer,更新对应的锚节点配置文件

updateAnchorPeers() {
  ORG=$1
  setGlobals $ORG
	local rc=1
	local COUNTER=1
	## Sometimes Join takes time, hence retry
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
    sleep $DELAY
    set -x
		peer channel update -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt
    res=$?
    { set +x; } 2>/dev/null
		let rc=$res
		COUNTER=$(expr $COUNTER + 1)
	done
	cat log.txt
  verifyResult $res "Anchor peer update failed"
  successln "Anchor peers updated for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME'"
  sleep $DELAY
}

3 部署链码

执行deployCC.sh脚本,以下八个步骤

  • packageChaincode
  • installChaincode
  • queryInstalled
  • approveForMyOrg
  • checkCommitReadiness
  • commitChaincodeDefinition
  • queryCommitted
  • chaincodeInvokeInit
3.1 packageChaincode
packageChaincode() {
  ORG=$1
  setGlobals $ORG
  set -x
  peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  verifyResult $res "Chaincode packaging on peer0.org${ORG} has failed"
  successln "Chaincode is packaged on peer0.org${ORG}"
}
3.2 installChaincode
installChaincode() {
  ORG=$1
  setGlobals $ORG
  set -x
  peer lifecycle chaincode install ${CC_NAME}.tar.gz >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  verifyResult $res "Chaincode installation on peer0.org${ORG} has failed"
  successln "Chaincode is installed on peer0.org${ORG}"
}
3.3 queryInstalled
queryInstalled() {
  ORG=$1
  setGlobals $ORG
  set -x
  peer lifecycle chaincode queryinstalled >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  PACKAGE_ID=$(sed -n "/${CC_NAME}_${CC_VERSION}/{s/^Package ID: //; s/, Label:.*$//; p;}" log.txt)
  verifyResult $res "Query installed on peer0.org${ORG} has failed"
  successln "Query installed successful on peer0.org${ORG} on channel"
}
3.4 approveForMyOrg
approveForMyOrg() {
  ORG=$1
  setGlobals $ORG
  set -x
  peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --package-id ${PACKAGE_ID} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  verifyResult $res "Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' failed"
  successln "Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME'"
}
3.5 checkCommitReadiness
checkCommitReadiness() {
  ORG=$1
  shift 1
  setGlobals $ORG
  infoln "Checking the commit readiness of the chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'..."
  local rc=1
  local COUNTER=1
  # continue to poll
  # we either get a successful response, or reach MAX RETRY
  while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
    sleep $DELAY
    infoln "Attempting to check the commit readiness of the chaincode definition on peer0.org${ORG}, Retry after $DELAY seconds."
    set -x
    peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} --output json >&log.txt
    res=$?
    { set +x; } 2>/dev/null
    let rc=0
    for var in "$@"; do
      grep "$var" log.txt &>/dev/null || let rc=1
    done
    COUNTER=$(expr $COUNTER + 1)
  done
  cat log.txt
  if test $rc -eq 0; then
    infoln "Checking the commit readiness of the chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME'"
  else
    fatalln "After $MAX_RETRY attempts, Check commit readiness result on peer0.org${ORG} is INVALID!"
  fi
}
3.6 commitChaincodeDefinition
commitChaincodeDefinition() {
  parsePeerConnectionParameters $@
  res=$?
  verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters "

  # while 'peer chaincode' command can get the orderer endpoint from the
  # peer (if join was successful), let's supply it directly as we know
  # it using the "-o" option
  set -x
  peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} $PEER_CONN_PARMS --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  verifyResult $res "Chaincode definition commit failed on peer0.org${ORG} on channel '$CHANNEL_NAME' failed"
  successln "Chaincode definition committed on channel '$CHANNEL_NAME'"
}
3.7 queryCommitted
queryCommitted() {
  ORG=$1
  setGlobals $ORG
  EXPECTED_RESULT="Version: ${CC_VERSION}, Sequence: ${CC_SEQUENCE}, Endorsement Plugin: escc, Validation Plugin: vscc"
  infoln "Querying chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'..."
  local rc=1
  local COUNTER=1
  # continue to poll
  # we either get a successful response, or reach MAX RETRY
  while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
    sleep $DELAY
    infoln "Attempting to Query committed status on peer0.org${ORG}, Retry after $DELAY seconds."
    set -x
    peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name ${CC_NAME} >&log.txt
    res=$?
    { set +x; } 2>/dev/null
    test $res -eq 0 && VALUE=$(cat log.txt | grep -o '^Version: '$CC_VERSION', Sequence: [0-9]*, Endorsement Plugin: escc, Validation Plugin: vscc')
    test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
    COUNTER=$(expr $COUNTER + 1)
  done
  cat log.txt
  if test $rc -eq 0; then
    successln "Query chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME'"
  else
    fatalln "After $MAX_RETRY attempts, Query chaincode definition result on peer0.org${ORG} is INVALID!"
  fi
}
3.8 chaincodeInvokeInit
chaincodeInvokeInit() {
  parsePeerConnectionParameters $@
  res=$?
  verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters "

  # while 'peer chaincode' command can get the orderer endpoint from the
  # peer (if join was successful), let's supply it directly as we know
  # it using the "-o" option
  set -x
  fcn_call='{"function":"'${CC_INIT_FCN}'","Args":[]}'
  infoln "invoke fcn call:${fcn_call}"
  peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n ${CC_NAME} $PEER_CONN_PARMS --isInit -c ${fcn_call} >&log.txt
  res=$?
  { set +x; } 2>/dev/null
  cat log.txt
  verifyResult $res "Invoke execution on $PEERS failed "
  successln "Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME'"
}

4 启动过程详解

  • ./network.sh为两个peer节点和一个order节点创建了证书和密钥,默认情况下,脚本会利用在organizations/cryptogen文件夹下的加密工具。
  • 脚本利用configtxgen工具创建了系统的创世块,它使用configtx/configtx.yaml文件来创建创世块,并存储在system-genesis-block文件夹中。
  • 当上述两步完成之后,./network.sh会启动网络,脚本利用在docker文件夹下的docker-compose-test-net.yaml文件创建peer和orderer节点。
  • 如果使用了createChannel子命令,脚本还会运行script文件夹下的createChannel.sh脚本来创建所需要的channel,脚本会用peer命令来创建channel,加入两个组织。
  • 如果运行了deployCC命令,脚本会在所有peers上运行script下的deployCC.sh脚本来安装fabcar chaincode,在chaincode的定义被提交到channel之后,peer命令会调用init函数来初始化chaincode,并将所需的数据放入chaincode中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hyperledger Fabric 示例启动流程(二) 的相关文章

  • C/C++ &与&&

    表示逻辑与的意思 即为and 当运算符两边的表达式的结果都为true时 整个运算结果才为true 否则 只要有一方为false 则结果为false 比如 12 23的结果就是1 12 1 的结果是1 123 0的结果就是0 还具有短路的功能

随机推荐

  • Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM

    GDB调试C 工程非ROS 1 通过运行可执行程序来进入gdb CMakeLists中的修改 SET CMAKE BUILD TYPE Debug SET CMAKE CXX FLAGS DEBUG ENV CXXFLAGS O0 Wall
  • 2023-05-29 Unity 2进制5——Excel配置表工具

    文章目录 一 Excel 读取操作 一 打开 Excel 表 二 获取单元格信息 二 Excel 表配置工具 一 基础知识 二 配置工具 三 演示步骤 1 ExcelTool 2 BinaryMgr 一 Excel 读取操作 一 打开 Ex
  • 推荐系统(3)——最经典的推荐算法(协同过滤算法原理部分)

    一 最经典的推荐算法 协同过滤推荐算法 Collaborative Filtering 算法思想 物以类聚 人以群分 基本的协同过滤推荐算法基于以下假设 跟你喜好相似的人喜欢的东西你也很有可能喜欢 基于用户的协同过滤推荐 User base
  • 思科模拟器:三层交换实现不同vlan间的通信(图文)

    我们实现不同vlan间通信不止有这一种办法 比如我们常用的单臂路由可以实现不同vlan间通信 我以前的博客也有发布 不会的可以关注一下以前的文章 但是他经常应用于中小企业他的缺陷有 1 单臂 为网络骨干链路 容易形成网络瓶颈 2 子接口依然
  • python 包、模块学习总结

    模块基础 1 基本概念 模块是最高级别的程序组织单元 它将程序代码和数据封装起来以便重用 从实际角度来看 模块往往对应于python程序文件 或是用外部语言如C Java或C 编写而成的扩展 每一个文件都是一个模块 并且模块导入其他模块之后
  • gitlab安装并汉化

    gitlab安装并汉化 准备工作 Gitlab安装包分2种gitlab ce gitlab ee gitlab为社区免费版本 gitlab ee为企业收费版本 在功能上没有太大的区别 应没有使用过与安装过 网也没有资料 只是在网查询到一篇文
  • git上传仓库内容超过100M解决方法git

    git上传仓库内容超过100M解决办法git 报错例如 原因是上传文件最大只能上传100M 所以这里要把太大的文件删除 然后重新提交git 操作步骤如下 1 先找到文件的具体路径 执行方法上述报错中有 参考 git rev list obj
  • vscode c++解决包含头文件红色波浪线问题

    安装c c 插件后 按ctrl shift p 点击打开了c cpp properties json文件 对其中的IncludePath进行编辑 示例如下 includePath workspaceFolder workspaceFolde
  • CAP理论

    CAP理论在互联网界有着广泛的知名度 知识稍微宽泛一点的工程师都会把其作为衡量系统设计的准则 大家都非常清楚地理解了CAP 任何分布式系统在可用性 一致性 分区容错性方面 不能兼得 最多只能得其二 因此 任何分布式系统的设计只是在三者中的不
  • 靶机练习 No.23 Vulnhub靶机DarkHole 2 .git信息泄露 .bash_history历史命令提权

    靶机练习 No 23 Vulnhub靶机DarkHole 2 0x00 环境准备 0x01 信息收集 步骤一 ip 探测 步骤二 端口扫描 0x02 漏洞挖掘 思路一 web漏洞挖掘 git信息收集 思路二 22ssh 爆破 步骤一 git
  • CentOS7 运维 - 系统基础优化大全

    CentOS7 运维 系统基础优化大全 一 更换Yum源 国内源地址 备份CentOS官方源 使用阿里yum源 使用本地yum源 使用清华yum源 推荐 二 防火墙 临时关闭防火墙 永久关闭防火墙 关闭SELinux 临时关闭 永久关闭 三
  • Linux下SVN操作常用命令

    1 检出 svn co http 路径 目录或文件的全路径 本地目录全路径 username 用户名 password 密码 svn co svn 路径 目录或文件的全路径 本地目录全路径 username 用户名 password 密码
  • FLUKE DSX-5000 CH线缆测试仪怎么升级到新国标

    FLUKE DSX 5000 CH线缆测试仪怎么升级新标准GB T50312 2016 下面山东朗坤小编带给您FLUKE DSX 5000 CH线缆测试仪升级带有新标准软件的整体步骤 一起来学习吧 升级到5 1之后必须使用Linkware9
  • 全网最全总结,有源码,期望、有效值、方差、相关系数、自相关函、互相关函数,还分不清吗

    原文来自公众号 工程师看海 1 期望 期望也就是平均值 是一个数值 反应的是随机变量平均取值的情况 期望也叫做加权平均 在信号中代表直流分量 当随机变量X满足均匀分布时 对一段长度为N的离散序列X x n n 0 1 2 N 1 其期望E
  • 深度学习-1.1卷积

    卷积是一种数学运算 教科书上一般定义 首先有两个函数函数 f g 然后这两个函数的卷积 f g 如下 连续形式 离散形式 1 先将函数g t 延y轴翻转为g t 这是 卷 的由来 2 其中n是卷积的参数 将g t 平移n个长度 变为g n
  • Lua调用C的动态库步骤及接口分析

    Lua调用C的动态库 C语言可以完成一些lua不好实现的功能 当程序主体使用lua完成时 便需要掌握该技巧调用C来帮助我们达到目的 通过调用C的动态库简化操作流程 大致流程如下 使用C语言编写方法提供给lua调用 将C文件打包成动态库 lu
  • excel中怎样将数据合并到一个单元格用逗号隔开

    打开需要操作的Excel表格 将数据合并在一个单元格 并用逗号隔开 如图所示 excel中怎样将数据合并到一个单元格用逗号隔开 选中B1单元格 并输入分隔符号逗号 excel中怎样将数据合并到一个单元格用逗号隔开 单击B1单元格 向下拖动B
  • 使用 ChatGPT 辅助学习——为自己找一个老师

    我们每个人都有许多标签 例如高中生 成绩中等 文科 根据这些标签我和其他拥有相同标签的人分配了相同的教程 班级和老师 这可以带来效率上的提升 因为同一份教程 老师就可以服务几十上百人 而无须为每个人定制 但也正是这样造成了忽略个性的问题 而
  • STM32F103野火之中断

    顾名思义STM32中中断分为内核中断和外部中断 内核中断称为 异常 外部中断称为 中断 IPR寄存器STM只使用了高四位低四位没有使用所以共有2 4种情况 EXTI的功能框图分为两个部分 红色轨迹 模式为中断控制 有中断控制寄存器位决定 绿
  • Hyperledger Fabric 示例启动流程(二)

    test network启动流程 1 启动测试网络 此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络 network sh up createOrgs 使用cryptogen工具或者Fabric CA来创建Org1 Org2