【超級賬本】fabric-ca — makeDocker.sh原始碼分析
阿新 • • 發佈:2018-12-12
概述
在first-network例子中,msp的初始化是依賴工具生成,而fabric-ca是專門啟動CA節點的。這部分的程式碼基本落實是這樣的:
- 由start.sh啟動
- 在start.sh中呼叫makeDocker.sh初始話docker compose.yaml檔案;
- 在makeDocker.sh所建立的yaml檔案裡,每個容器所需要執行的指令碼定義在script目錄下,包括order、peer、ca等。其中run-fabric-ca.sh應該是測試節點。
writeRootFabricCA
功能:啟動ROOT CA節點
映象: hyperledger/fabric-ca
執行指令碼: start-root-ca.sh
- 初始話根證書CA伺服器,執行init命令,執行完應生成一個自簽名的根證書ca-cert.pem
fabric-ca-server init -b $BOOTSTRAP_USER_PASS
- 修改fabric-ca-server-config.yaml配置檔案,修改的是組織結果配置部分
sed -i "/affiliations:/a \\ $aff" \
$FABRIC_CA_SERVER_HOME/fabric-ca-server-config.yaml
- 啟動CA伺服器(根證書)
fabric-ca-server start
writeIntermediateCA
功能:啟動中間證書節點 映象: hyperledger/fabric-ca 執行指令碼: start-intermediate-ca.sh
- 等待根證書的節點啟動
waitPort "root CA to start" 60 $ROOT_CA_LOGFILE $ROOT_CA_HOST 7054
- 初始話中間證書的CA伺服器,這裡PARENT_URL是根證書的URL
fabric-ca-server init -b $BOOTSTRAP_USER_PASS -u $PARENT_URL
- 修改fabric-ca-server-config.yaml,同根證書節點
- 啟動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
- 註冊排序節點的TLS證書
fabric-ca-client enroll -d --enrollment.profile tls -u $ENROLLMENT_URL -M /tmp/tls --csr.hosts $ORDERER_HOST
- 註冊排序節點的認證證書
fabric-ca-client enroll -d -u $ENROLLMENT_URL -M $ORDERER_GENERAL_LOCALMSPDIR
- 建立本地的MSP資料夾
finishMSPSetup $ORDERER_GENERAL_LOCALMSPDIR
copyAdminCert $ORDERER_GENERAL_LOCALMSPDIR
- 啟動排序節點
writePeer
功能:啟動記賬節點 映象: hyperledger/fabric-ca-peer 執行指令碼: start-peer.sh
- 生成服務端TLS證書和祕鑰對
fabric-ca-client enroll -d --enrollment.profile tls -u
$ENROLLMENT_URL -M /tmp/tls --csr.hosts $PEER_HOST
- 生成客戶端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
- 生成認證證書,同排序節點
- 生成本地MSP檔案,同排序節點
- 啟動記賬節點
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
- 利用revokeFabricUserAndGenerateCRL函式,將user的許可權撤銷,核心程式碼如下:
abric-ca-client revoke -d --revoke.name $USER_NAME --gencrl
備註:這部分是在admin許可權下執行的
- 利用switchToUserIdentity函式將當前許可權轉為user,核心程式碼如下:
fabric-ca-client enroll -d -u https://$USER_NAME:[email protected]$CA_HOST:7054
備註:相當於將當前的環境變數做了修改,在正式的生產環境下,這臺伺服器上應該是不會存在admin賬戶的。
- 此時執行鏈碼會爆出許可權錯誤,程式碼如下:
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
}