Fabric 2.2 测试网络 enVar.sh 详解

#!/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 ID
  • CORE_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_PARMSPEERS 变量的值。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,则表示前一个命令执行成功,函数会继续执行脚本的下一个命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值