#!/bin/bash
#
# Copyright IBM Corp All Rights Reserved
#
# SPDX-License-Identifier: Apache-2.0
#
# This is a collection of bash functions used by different scripts
# imports
. scripts/utils.sh
export CORE_PEER_TLS_ENABLED=true
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export PEER0_ORG3_CA=${PWD}/organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
enVar.sh 是一个由不同脚本使用的Bash函数集合。脚本中的主要变量被设置为默认值,并导入了utils.sh脚本中的其他函数。其中包括设置CORE_PEER_TLS_ENABLED和ORDERER_CA环境变量的默认值,以及设置每个组织的PEER0_CA证书的默认值。这些变量和函数可以帮助在不同的脚本中操作Hyperledger Fabric网络。
# Set environment variables for the peer org
setGlobals() {
这是一个用来设置 peer 节点环境变量的函数,根据传入的参数 $1
来确定要使用的组织的 ID,然后设置相应的环境变量,包括本地 MSP ID、TLS 根证书文件路径、MSP 配置文件路径、节点地址等。在函数最后,如果 VERBOSE
环境变量被设置为 true
,则输出所有与 CORE 相关的环境变量。
local USING_ORG=""
local
是一个关键字,用于声明一个局部变量。这里声明了一个名为USING_ORG
的局部变量,并将其赋值为空字符串。local
关键字使变量的作用域仅限于当前函数中,这意味着其他函数不能访问该变量。
if [ -z "$OVERRIDE_ORG" ]; then
USING_ORG=$1
else
USING_ORG="${OVERRIDE_ORG}"
fi
这段代码的作用是为了设置变量USING_ORG
的值。首先会检查环境变量OVERRIDE_ORG
是否为空,如果为空,则将函数的第一个参数$1
的值赋给USING_ORG
变量。否则,将OVERRIDE_ORG
变量的值赋给USING_ORG
变量。
这个设计的目的是允许在执行函数时重写环境变量OVERRIDE_ORG
的值,从而指定要使用的组织。如果OVERRIDE_ORG
环境变量为空,那么将使用函数的第一个参数来代替。如果环境变量OVERRIDE_ORG
不为空,那么函数的第一个参数将被忽略,而是使用环境变量OVERRIDE_ORG
来代替。
infoln "Using organization ${USING_ORG}"
if [ $USING_ORG -eq 1 ]; then
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
elif [ $USING_ORG -eq 2 ]; then
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
elif [ $USING_ORG -eq 3 ]; then
export CORE_PEER_LOCALMSPID="Org3MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG3_CA
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
export CORE_PEER_ADDRESS=localhost:11051
else
errorln "ORG Unknown"
fi
这段代码首先根据传入的参数$1
或者环境变量$OVERRIDE_ORG
来确定当前要使用的组织,然后将该组织相关的环境变量设置好,包括:
CORE_PEER_LOCALMSPID
:当前组织的 MSP IDCORE_PEER_TLS_ROOTCERT_FILE
:TLS 根证书的路径CORE_PEER_MSPCONFIGPATH
:Admin 用户的 MSP 配置文件路径CORE_PEER_ADDRESS
:当前节点的地址
if [ "$VERBOSE" == "true" ]; then
env | grep CORE
fi
}
这段代码用于检查是否开启了 VERBOSE 模式。如果开启了,就输出当前所有包含“CORE”的环境变量,这些环境变量都是与 Hyperledger Fabric 相关的。这个过程通过调用 env
命令来实现,并用 grep
命令筛选出包含“CORE”的变量。如果没有开启 VERBOSE 模式,则不会执行这段代码。
# Set environment variables for use in the CLI container
setGlobalsCLI() {
setGlobals $1
local USING_ORG=""
if [ -z "$OVERRIDE_ORG" ]; then
USING_ORG=$1
else
USING_ORG="${OVERRIDE_ORG}"
fi
if [ $USING_ORG -eq 1 ]; then
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
elif [ $USING_ORG -eq 2 ]; then
export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
elif [ $USING_ORG -eq 3 ]; then
export CORE_PEER_ADDRESS=peer0.org3.example.com:11051
else
errorln "ORG Unknown"
fi
}
这段代码定义了一个函数setGlobalsCLI()
,用于为CLI容器设置环境变量。函数中先调用了另一个函数setGlobals $1
,其中$1
是传递给setGlobalsCLI()
函数的第一个参数,用于设置指定组织的环境变量。接着,函数中根据传递的参数或者在环境变量中已经定义的OVERRIDE_ORG
来确定当前要使用的组织,并将其设置到环境变量USING_ORG
中。
最后,函数根据USING_ORG
的值来设置环境变量CORE_PEER_ADDRESS
,以指定当前要连接的peer节点的地址。如果USING_ORG
的值不是1、2或3,则会输出错误信息"ORG Unknown"。
parsePeerConnectionParameters() {
这是一个用于为链代码操作设置对等连接参数的辅助函数。
PEER_CONN_PARMS=""
PEERS=""
这两行代码定义了两个空变量:
PEER_CONN_PARMS
:用于存储对等节点的连接参数PEERS
:用于存储连接的对等节点的列表
while [ "$#" -gt 0 ]; do
这是一个while循环,它的条件是:只要"$#"变量(表示传递给当前函数的参数个数)大于0,就会一直执行循环体里的操作。"$#"
是一个特殊变量,用于表示传递给脚本或函数的参数个数。在Shell脚本中,$0
表示脚本本身的名字,$1
表示第一个参数,$2
表示第二个参数,以此类推。而"$#"
则表示传递给脚本或函数的参数个数。
setGlobals $1
PEER="peer0.org$1"
这两行代码是将 $1
参数传递给 setGlobals
函数并在函数内部将其用于设置与给定组织的对等节点交互的环境变量。在该函数中,$1
被视为当前正在处理的组织的编号。下一行代码中,使用 $1
将组织的编号添加到 peer0.org
字符串后面,从而为当前组织构造与对等节点交互所需的完整对等节点的名称。然后将其分配给 PEER
变量。
PEERS="$PEERS $PEER"
PEER_CONN_PARMS="$PEER_CONN_PARMS --peerAddresses $CORE_PEER_ADDRESS"
将每个peer节点的地址添加到PEERS变量中,用空格隔开。然后,将PEER_CONN_PARMS变量设置为"--peerAddresses"加上CORE_PEER_ADDRESS变量的值,并通过循环来拼接所有的PEER_CONN_PARMS参数。最终得到的PEER_CONN_PARMS变量就是chaincode操作所需的peer节点连接参数。
## Set path to TLS certificate
TLSINFO=$(eval echo "--tlsRootCertFiles \$PEER0_ORG$1_CA")
PEER_CONN_PARMS="$PEER_CONN_PARMS $TLSINFO"
这段代码是为了为每个 peer 设置 TLS 证书路径,确保在交互中访问 peer 时是加密的。它使用 eval
命令生成一个包含 TLS 证书路径的参数字符串,并将其附加到 PEER_CONN_PARMS
中。这个参数字符串是通过将 $PEER0_ORG1_CA
(或 $PEER0_ORG2_CA
、$PEER0_ORG3_CA
等)插入到 "--tlsRootCertFiles "
字符串中动态生成的。eval
命令的作用是将 --tlsRootCertFiles
和证书路径字符串合并成一个参数。因为 $PEER0_ORG1_CA
在之前被设置为对应组织的 TLS 证书路径。
# shift by one to get to the next organization
shift
done
shift命令将所有参数向左移动一个位置,也就是将$2的值赋给了$1,$3的值赋给了$2,以此类推。这样做是为了在下一次循环时能够正确地取到参数值。
# remove leading space for output
PEERS="$(echo -e "$PEERS" | sed -e 's/^[[:space:]]*//')"
}
循环结束后,将 $PEERS
中的 leading space 去掉,并返回 PEER_CONN_PARMS
和 PEERS
变量的值。echo -e "$PEERS" 打印出$PEERS
的值,并使用-e
选项使转义字符生效。如果$PEERS
包含多个空格,则echo
命令将这些空格合并为一个空格。sed -e 's/^[[:space:]]*// 使用sed工具进行字符串处理,其中的s代表替换,^[[:space:]]*代表匹配行首的所有空格,替换为空字符,即删除行首的空格,最后的//代表替换的内容为空。这个操作的效果是将字符串中每个peer之间的空格删除。
verifyResult() {
if [ $1 -ne 0 ]; then
fatalln "$2"
fi
}
这段代码定义了一个名为verifyResult
的函数,该函数接受两个参数。函数的目的是验证前一个命令是否成功执行,如果失败,则输出错误信息并终止脚本的执行。
具体来说,函数检查第一个参数是否等于0,如果不等于0,则意味着前一个命令执行失败,函数调用fatalln
函数并传递第二个参数作为错误信息。如果第一个参数等于0,则表示前一个命令执行成功,函数会继续执行脚本的下一个命令。