#!/bin/bash
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# import utils
. scripts/envVar.shh
这是一个 Bash 脚本文件,包含一个 import 指令,引入了 envVar.sh
脚本中定义的变量和函数。envVar.sh详解见
http://t.csdn.cn/sgmSw
fetchChannelConfig() {
ORG=$1
CHANNEL=$2
OUTPUT=$3
setGlobals $ORG
infoln "Fetching the most recent configuration block for the channel"
set -x
peer channel fetch config config_block.pb -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL --tls --cafile $ORDERER_CA
{ set +x; } 2>/dev/null
infoln "Decoding config block to JSON and isolating config to ${OUTPUT}"
set -x
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}"
{ set +x; } 2>/dev/null
}
这段代码中定义了一个名为fetchChannelConfig的函数,该函数接受三个参数:ORG、CHANNEL和OUTPUT,表示组织名称、通道名称和输出文件名称。函数首先调用setGlobals函数设置环境变量,然后使用peer命令从orderer节点获取通道的最新配置块,并将其保存到config_block.pb文件中。接着,使用configtxlator工具将config_block.pb文件转换为JSON格式,并从中提取配置信息,将其保存到输出文件中。
peer channel fetch config config_block.pb -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL --tls --cafile $ORDERER_CA 命令用于从排序节点获取通道的最新配置块,并将其保存为名为 config_block.pb 的 protobuf 文件。 以下是此命令中使用的每个标志的详细说明:
- peer channel fetch config :这是 Fabric Peer 命令,用于从指定 Orderer 获取指定频道的配置块(config block)。
- config_block.pb:这是输出文件名,表示将获取到的配置块保存在当前目录下的该文件中。 文件扩展名 .pb 代表协议缓冲区。
- -o orderer.example.com:7050:这指定了要连接的排序节点的地址。 在本例中,它是 orderer.example.com,端口号为 7050。
- --ordererTLSHostnameOverride orderer.example.com:此标志用于覆盖排序节点的 TLS 主机名检查。 在这种情况下,它被设置为与排序节点地址相同的值。
- -c $CHANNEL:这指定要为其获取配置块的通道的名称。 $CHANNEL 的值作为参数传递给函数。
- --tls:此标志指定应该使用 TLS 连接到订购者。
- --cafile $ORDERER_CA:此标志指定将用于验证 TLS 连接的 CA 证书文件的路径。 $ORDERER_CA 的值在 envVar.sh 脚本中设置,指向排序节点的 CA 证书。
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}" 这条指令的含义是:
- 使用configtxlator工具对config_block.pb文件进行解码,解码出common.Block类型的数据结构。
- 然后使用jq工具从解码后的结果中提取出有效的配置信息。
- 最后将提取出来的配置信息输出到指定的文件(OUTPUT)中。
更具体地说,该指令的作用是将config_block.pb文件中的配置信息解码并提取出来,输出到指定的文件中,方便后续进行配置更新或比较等操作。
# createConfigUpdate <channel_id> <original_config.json> <modified_config.json> <output.pb>
# Takes an original and modified config, and produces the config update tx
# which transitions between the two
# NOTE: this must be run in a CLI container since it requires configtxlator
createConfigUpdate() {
CHANNEL=$1
ORIGINAL=$2
MODIFIED=$3
OUTPUT=$4
set -x
configtxlator proto_encode --input "${ORIGINAL}" --type common.Config >original_config.pb
configtxlator proto_encode --input "${MODIFIED}" --type common.Config >modified_config.pb
configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb >config_update.pb
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate >config_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . >config_update_in_envelope.json
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope >"${OUTPUT}"
{ set +x; } 2>/dev/null
}
这是一个用于创建配置更新文件的函数。给定原始配置文件和修改后的配置文件,它将生成一个用于更新通道配置的事务。具体步骤如下:
-
使用configtxlator将原始配置文件和修改后的配置文件编码成protobuf格式,分别存储为original_config.pb和modified_config.pb文件。
-
使用configtxlator计算出原始配置文件和修改后的配置文件之间的差异,并将结果存储为config_update.pb文件。这个差异是用来更新通道配置的。
-
使用configtxlator将config_update.pb解码成JSON格式,并存储为config_update.json文件。
-
构建一个包含config_update.json数据的配置更新信封,用于提交到通道。
-
使用configtxlator将配置更新信封编码为protobuf格式,并将其输出到指定的文件中。
configtxlator
是Hyperledger Fabric提供的一个用于处理配置的工具,可以用于编码、解码和计算配置更新的工具。下面是常用的命令:
configtxlator proto_encode
: 将一个protobuf消息编码成另一种格式的protobuf消息configtxlator proto_decode
: 将一个protobuf消息解码成另一种格式的protobuf消息configtxlator compute_update
: 根据给定的两个配置计算一个配置更新configtxlator proto_diff
: 计算给定的两个protobuf消息之间的差异
configtxlator
通常用于处理channel的配置更新。在Hyperledger Fabric中,通常是将一个channel的当前配置与修改后的配置进行比较,得到两者之间的差异,然后将差异封装成一个配置更新的envelope。这个envelope可以被peer节点用来更新channel的配置。configtxlator
工具可以帮助完成这个过程。
# signConfigtxAsPeerOrg <org> <configtx.pb>
# Set the peerOrg admin of an org and sign the config update
signConfigtxAsPeerOrg() {
ORG=$1
CONFIGTXFILE=$2
setGlobals $ORG
set -x
peer channel signconfigtx -f "${CONFIGTXFILE}"
{ set +x; } 2>/dev/null
}
这个函数的作用是使用指定组织的Peer节点管理员身份对给定的配置更新文件进行签名。函数使用了之前定义的setGlobals
函数来设置正确的环境变量。然后,peer channel signconfigtx
命令被调用来对指定的配置更新文件进行签名。签名后的结果被自动添加到文件中,以形成可传递到其他组织进行签名的完整配置更新事务。
peer channel signconfigtx -f "${CONFIGTXFILE}" 命令是用来让节点签名指定的config update文件。在Hyperledger Fabric中,config update文件用于更改系统通道和应用通道的配置。该命令的-f选项用于指定要签名的config update文件的路径。签名后,节点的证书和私钥将用于保证更改的真实性和完整性。