1. 程式人生 > >【超級賬本】fabric-ca — makeDocker.sh原始碼分析

【超級賬本】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

  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

  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

  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

  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:[email protected]$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
}