Fabric 2.2 测试网络 setAnchorPeer.sh 详解

#!/bin/bash
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

# import utils
. scripts/envVar.sh
. scripts/configUpdate.sh

这是一个 Bash 脚本文件,包含两个 import 指令,引入了 envVar.shconfigUpdate.sh 脚本中定义的变量和函数。这些脚本很可能定义了与 Fabric 相关的环境变量和常用操作函数。 envVar.sh 详解见http://t.csdn.cn/CuDxKconfigUpdate.sh详解见http://t.csdn.cn/OjyxT

# NOTE: this must be run in a CLI container since it requires jq and configtxlator 
createAnchorPeerUpdate() {
  infoln "Fetching channel config for channel $CHANNEL_NAME"
  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
  # Modify the configuration to append the anchor peer 
  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

  # Compute a config update, based on the differences between 
  # {orgmsp}config.json and {orgmsp}modified_config.json, write
  # it as a transaction to {orgmsp}anchors.tx
  createConfigUpdate ${CHANNEL_NAME} ${CORE_PEER_LOCALMSPID}config.json ${CORE_PEER_LOCALMSPID}modified_config.json ${CORE_PEER_LOCALMSPID}anchors.tx
}

这是一个用于在区块链网络中添加组织锚节点的Shell脚本函数。它通过运行fetchChannelConfig函数来获取特定通道的配置块,并根据组织的MSP ID生成修改后的配置,以添加锚节点。锚节点是组织在通道中用于路由事务和查询的特殊节点。

该函数根据组织的MSP ID确定要添加锚节点的主机和端口。然后,它使用jq命令将锚点节点的配置添加到组织的修改后的配置文件中,并使用createConfigUpdate函数生成用于添加锚点节点的配置更新事务。该事务被保存在名为${orgmsp}anchors.tx的文件中。

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 命令使用了 jq 工具,用于对 JSON 数据进行处理和转换。具体来说,它对一个 JSON 配置文件进行了修改,添加了一个指定组织的 Anchor Peer。

下面是具体的参数含义:

  • jq: jq 命令用于对 JSON 数据进行处理和转换。

  • '.channel_group.groups.Application.groups.'${CORE_PEER_LOCALMSPID}'.values: 这部分 jq 命令用于选定指定组织所在的 Application 组,并在其 values 部分添加 Anchor Peer 配置。其中,${CORE_PEER_LOCALMSPID}是一个环境变量,代表了当前组织的本地 MSP ID。

  • +=: 这是 jq 中的一个操作符,用于添加一个新的键值对到指定的 JSON 对象中。

  • "AnchorPeers": 新增加的键名,代表 Anchor Peer 配置。

  • {"mod_policy": "Admins","value":{"anchor_peers": [{"host": "'$HOST'","port": '$PORT'}]},"version": "0"}: 新增加的键值对,代表 Anchor Peer 的具体配置。其中:

    • mod_policy:配置更新的权限策略。这里设置为 Admins,表示只有 Admin 用户可以对该配置进行更新。
    • value:Anchor Peer 的具体配置信息。这里包括了 Anchor Peer 的 host 和 port。
    • version:更新的版本号。这里设置为 "0",表示当前是第一次更新该配置。
  • ${CORE_PEER_LOCALMSPID}config.json: 要被修改的 JSON 文件名。

  • > ${CORE_PEER_LOCALMSPID}modified_config.json: 修改后的 JSON 数据输出到一个新文件中,用于后续的操作。

createConfigUpdate ${CHANNEL_NAME} ${CORE_PEER_LOCALMSPID}config.json ${CORE_PEER_LOCALMSPID}modified_config.json ${CORE_PEER_LOCALMSPID}anchors.tx 命令会使用configtxlator工具计算出一个关于配置更改的更新,该更新基于两个输入文件:原始的config.json文件和已修改的modified_config.json文件。计算结果将被写入anchors.tx文件中,该文件包含一个用于添加锚定对等体的配置更新事务。具体来说,该命令会执行以下步骤:

  1. 使用configtxlator将原始的config.json文件和已修改的modified_config.json文件编码为protobuf格式。
  2. 使用configtxlator计算出关于配置更改的更新,将结果写入config_update.pb文件中。
  3. 使用configtxlator将config_update.pb文件解码为json格式,将结果写入config_update.json文件中。
  4. 创建一个envelope(信封)对象,将其作为json格式的字符串构造,并使用configtxlator将其编码为protobuf格式。这个envelope对象包含了一个通道配置更新的信息,这个更新是一个关于锚定对等体的配置更改。
  5. 将构造好的protobuf格式的envelope对象写入anchors.tx文件中。
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'"
}

此函数在 CHANNEL_NAME 指定的通道上更新 CORE_PEER_LOCALMSPID 指定的组织的锚节点。

它使用对等通道更新命令将 ${CORE_PEER_LOCALMSPID}anchors.tx 文件中包含的交易提交给 orderer.example.com:7050 的排序节点。 -o orderer.example.com:7050:指定排序服务的地址和端口; --ordererTLSHostnameOverride 标志用于覆盖订购者 TLS 证书的默认主机名,该证书通常设置为订购者的 IP 地址;--tls 标志启用 TLS 通信,--cafile 标志指定排序者的 TLS 证书的位置。

如果更新成功,该函数将输出一条成功消息。 否则,它将使用退出代码和错误消息调用 verifyResult 函数。

ORG=$1
CHANNEL_NAME=$2
setGlobalsCLI $ORG

createAnchorPeerUpdate 

updateAnchorPeer 

这些命令在脚本中的组合将会为指定的组织 $ORG 创建并添加锚节点到指定通道 $CHANNEL_NAME 中。

具体而言,这些命令执行以下操作:

  1. setGlobalsCLI $ORG 将环境变量设置为指向该组织的对等节点 CLI 容器,以便可以执行链代码、通道和身份验证操作。

  2. createAnchorPeerUpdate 将生成一个包含新锚节点的组织配置更新,并将其保存到 ${CORE_PEER_LOCALMSPID}anchors.tx

  3. updateAnchorPeer 将使用 ${CORE_PEER_LOCALMSPID}anchors.tx 文件中的更新提交到指定的通道 $CHANNEL_NAME 中。该命令使用 TLS 连接到 $ORDERER_CA(指定的 CA 根证书),并将事务发送到 $ORDERER_ADDRESS(指定的排序节点)进行排序和共识处理。如果提交失败,则会记录失败消息并退出。否则,将输出成功消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值