【超级账本】fabric-ca — makeDocker.sh源码分析

概述

在first-network例子中,msp的初始化是依赖工具生成,而fabric-ca是专门启动CA节点的。这部分的代码基本落实是这样的:

  1. 由start.sh启动
  2. 在start.sh中调用makeDocker.sh初始话docker compose.yaml文件;
  3. 在makeDocker.sh所创建的yaml文件里,每个容器所需要执行的脚本定义在script目录下,包括order、peer、ca等。其中run-fabric-ca.sh应该是测试节点。
writeRootFabricCA

功能:启动ROOT CA节点
镜像: hyperledger/fabric-ca
执行脚本: start-root-ca.sh

start-root-ca.sh 脚本主要做如下一些工作

  1. 初始话根证书CA服务器,执行init命令,执行完应生成一个自签名的根证书ca-cert.pem
fabric-ca-server init -b $BOOTSTRAP_USER_PASS
  1. 修改fabric-ca-server-config.yaml配置文件,修改的是组织结果配置部分
sed -i "/affiliations:/a \\   $aff" \
   $FABRIC_CA_SERVER_HOME/fabric-ca-server-config.yaml
  1. 启动CA服务器(根证书)
fabric-ca-server start
writeIntermediateCA

功能:启动中间证书节点
镜像: hyperledger/fabric-ca
执行脚本: start-intermediate-ca.sh

start-intermediate-ca.sh 脚本主要做如下一些工作

  1. 等待根证书的节点启动
waitPort "root CA to start" 60 $ROOT_CA_LOGFILE $ROOT_CA_HOST 7054
  1. 初始话中间证书的CA服务器,这里PARENT_URL是根证书的URL
fabric-ca-server init -b $BOOTSTRAP_USER_PASS -u $PARENT_URL
  1. 修改fabric-ca-server-config.yaml,同根证书节点
  2. 启动CA服务器(中间证书),同根证书节点
writeSetupFabric

功能:注册order、peer节点的ID,以及创建创世区块等通道资源,在这个例子中请求注册获取ID是通过中间证书CA服务器
镜像: hyperledger/fabric-ca-tools
执行脚本: setup-fabric.sh 参考笔记《11.fabric-sample fabric-ca — setup-fabric.sh》

writeOrderer

功能:启动排序节点
镜像: hyperledger/fabric-ca-orderer
执行脚本: start-orderer.sh

start-orderer.sh 主要的工作如下:

  1. 注册排序节点的TLS证书
fabric-ca-client enroll -d --enrollment.profile tls -u $ENROLLMENT_URL -M /tmp/tls --csr.hosts $ORDERER_HOST
  1. 注册排序节点的认证证书
fabric-ca-client enroll -d -u $ENROLLMENT_URL -M $ORDERER_GENERAL_LOCALMSPDIR
  1. 创建本地的MSP文件夹
finishMSPSetup $ORDERER_GENERAL_LOCALMSPDIR
copyAdminCert $ORDERER_GENERAL_LOCALMSPDIR
  1. 启动排序节点
writePeer

功能:启动记账节点
镜像: hyperledger/fabric-ca-peer
执行脚本: start-peer.sh

start-peer.sh 主要工作如下:

  1. 生成服务端TLS证书和秘钥对
fabric-ca-client enroll -d --enrollment.profile tls -u
$ENROLLMENT_URL -M /tmp/tls --csr.hosts $PEER_HOST
  1. 生成客户端TLS证书和秘钥对,分别针对PEER和PEER CLI
# Generate client TLS cert and key pair for the peer
genClientTLSCert $PEER_NAME $CORE_PEER_TLS_CLIENTCERT_FILE $CORE_PEER_TLS_CLIENTKEY_FILE

# Generate client TLS cert and key pair for the peer CLI
genClientTLSCert $PEER_NAME /$DATA/tls/$PEER_NAME-cli-client.crt /$DATA/tls/$PEER_NAME-cli-client.key
  1. 生成认证证书,同排序节点
  2. 生成本地MSP文件,同排序节点
  3. 启动记账节点
writeRunFabric

功能:运行之前创建的fabric网络
镜像: hyperledger/fabric-ca-tools
执行脚本: run-fabric.sh,这部分和first-network比较类似,主要关注如下这个场景。

前置条件:在setup-fabric.sh 的registerPeerIdentities函数执行步骤中该用户信息被注册。

fabric-ca-client register -d --id.name $USER_NAME --id.secret $USER_PASS
  1. 利用revokeFabricUserAndGenerateCRL函数,将user的权限撤销,核心代码如下:
abric-ca-client revoke -d --revoke.name $USER_NAME --gencrl

备注:这部分是在admin权限下执行的

  1. 利用switchToUserIdentity函数将当前权限转为user,核心代码如下:
fabric-ca-client enroll -d -u https://$USER_NAME:$USER_PASS@$CA_HOST:7054

备注:相当于将当前的环境变量做了修改,在正式的生产环境下,这台服务器上应该是不会存在admin账户的。

  1. 此时执行链码会爆出权限错误,代码如下:
function queryAsRevokedUser {
   set +e
   logr "Querying the chaincode in the channel '$CHANNEL_NAME' on the peer '$PEER_HOST' as revoked user '$USER_NAME' ..."
   local starttime=$(date +%s)
   # Continue to poll until we get an expected response or reach QUERY_TIMEOUT
   while test "$(($(date +%s)-starttime))" -lt "$QUERY_TIMEOUT"; do
      sleep 1
      peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >& log.txt
      if [ $? -ne 0 ]; then
        err=$(cat log.txt | grep "access denied")
        if [ "$err" != "" ]; then
           logr "Expected error occurred when the revoked user '$USER_NAME' queried the chaincode in the channel '$CHANNEL_NAME'"
           set -e
           return 0
        fi
      fi
      echo -n "."
   done
   set -e 
   cat log.txt
   cat log.txt >> $RUN_SUMFILE
   return 1
}

你可能感兴趣的:(区块链)