拆解fabric-sample/first-network/byfn.sh——深入shell看過程
byfn是fabric-sample下的一個快速入門的demo君躺。
byfn全名意為:build your first network,就是用來構建一個你自己的第一個fabric超級賬本網(wǎng)絡挠蛉。
這個demo屬于入門級demo,也是一個快速幫助初學者了解超級賬本的啟動流程的一個最好的例子徒坡。
拆解byfn.sh
前面通過執(zhí)行的方式看到byfn.sh的執(zhí)行效果雕凹,接下來看看該腳本內(nèi)部的實際操作琼开。
記得我們啟動byfn腳本傳入了一個參數(shù):up
接下來就從入口開始探究一下byfn經(jīng)歷了哪些。
啟動
#Create the network using docker compose
if [ "${MODE}" == "up" ]; then
networkUp
elif [ "${MODE}" == "down" ]; then ## Clear the network
networkDown
elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
generateCerts
replacePrivateKey
generateChannelArtifacts
elif [ "${MODE}" == "restart" ]; then ## Restart the network
networkDown
networkUp
elif [ "${MODE}" == "upgrade" ]; then ## Upgrade the network from version 1.1.x to 1.2.x
upgradeNetwork
else
printHelp
exit 1
fi
我們通常的啟動指令為:./byfn.sh up
所以這里會調(diào)用“networkUp方法”
networkUp
# Generate the needed certificates, the genesis block and start the network.
function networkUp() {
checkPrereqs
# generate artifacts if they don't exist
##可以不必要單獨使用./byfn.sh generate精算,因為在networkUp的時候自動檢測是否存在證書文件瓢宦,不存在則創(chuàng)建
if [ ! -d "crypto-config" ]; then
##利用cryptogen生成新的Certs文件
generateCerts
##根據(jù)e2e模版yaml生成新的yaml,并將生成的Cert文件替換到y(tǒng)aml的CA節(jié)點的路徑中
replacePrivateKey
##利用configtxgen生成創(chuàng)世區(qū)塊灰羽、創(chuàng)建通道
generateChannelArtifacts
fi
## 1個order排序節(jié)點驮履、4個peer節(jié)點,p0o1,p1o1,p0o2,p1o2
## ...XXX... -c XXX -s couchdb ...XXX...
if [ "${IF_COUCHDB}" == "couchdb" ]; then
##如果選擇了couchdb則會啟動4臺couchdb節(jié)點用來分別掛載p0o1,p1o1,p0o2,p1o2
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1
else
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE up -d 2>&1
fi
if [ $? -ne 0 ]; then
echo "ERROR !!!! Unable to start network"
exit 1
fi
# now run the end to end script
##調(diào)用腳本啟動
docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE
if [ $? -ne 0 ]; then
echo "ERROR !!!! Test failed"
exit 1
fi
}
up方法:
- 版本校驗:
- 檢查當前docker本地“hyperledger/fabric-tools”鏡像的版本號與本地fabric可執(zhí)行文件configtxlator的版本號是否一致廉嚼,如果不一致也只是輸出警告信息玫镐,不會影響使用;
- 同時還有一個badversion(不支持列表)怠噪,如果上述2個版本號在不支持列表中恐似,會發(fā)出ERROR并退出;
- 檢查證書文件是否存在
- 判斷當前目錄下是否存在“config”目錄傍念,該目錄是由命令:“./byfn.sh generate” 生成矫夷;
- 同時我們也可以不必要單獨生成葛闷,因為在networkUp的時候自動檢測是否存在證書文件,不存在則創(chuàng)建口四;
- 生成證書文件
##利用cryptogen生成新的Certs文件 generateCerts ##根據(jù)e2e模版yaml生成新的yaml孵运,并將生成的Cert文件替換到y(tǒng)aml的CA節(jié)點的路徑中 replacePrivateKey ##利用configtxgen生成創(chuàng)世區(qū)塊、創(chuàng)建通道 generateChannelArtifacts
- 選擇DB類型
1. fabric支持兩種數(shù)據(jù)庫類型蔓彩,默認采用goleveldb治笨,也可以通過這里傳入命令的方式選擇使用CouchDB
``` bash
if [ "${IF_COUCHDB}" == "couchdb" ]; then
##如果選擇了couchdb則會啟動4臺couchdb節(jié)點用來分別掛載p0o1,p1o1,p0o2,p1o2
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1
else
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE up -d 2>&1
fi
```
2. 根據(jù)腳本我們知道可以使用“...XXX... -c XXX -s couchdb ...XXX...” -s參數(shù)來選擇couchdb
-
真正開始準備啟動,通過腳本我們可以很直觀的看到啟動流程
## Create channel 創(chuàng)建通道 echo "Creating channel..." createChannel ## Join all the peers to the channel 所有節(jié)點加入通道 echo "Having all peers join the channel..." joinChannel ## Set the anchor peers for each org in the channel 更新p0o1,p0o2錨節(jié)點信息 echo "Updating anchor peers for org1..." updateAnchorPeers 0 1 echo "Updating anchor peers for org2..." updateAnchorPeers 0 2 ## Install chaincode on peer0.org1 and peer0.org2 在p0o1,p0o2上安裝鏈碼 echo "Installing chaincode on peer0.org1..." installChaincode 0 1 echo "Install chaincode on peer0.org2..." installChaincode 0 2 # Instantiate chaincode on peer0.org2 初始化鏈碼赤嚼,可以在任意一臺peer上初始化即可全局生效 echo "Instantiating chaincode on peer0.org2..." instantiateChaincode 0 2 # Query chaincode on peer0.org1 查詢賬戶結果是否為100 echo "Querying chaincode on peer0.org1..." chaincodeQuery 0 1 100 # Invoke chaincode on peer0.org1 and peer0.org2 執(zhí)行一次invoke操作 echo "Sending invoke transaction on peer0.org1 peer0.org2..." chaincodeInvoke 0 1 0 2 ## Install chaincode on peer1.org2 在p1o2上安裝鏈碼 echo "Installing chaincode on peer1.org2..." installChaincode 1 2 # Query on chaincode on peer1.org2, check if the result is 90 在p1o2上查詢賬戶結果是否為轉賬后的90 echo "Querying chaincode on peer1.org2..." chaincodeQuery 1 2 90
至此旷赖,demo就結束了整個的工作。
在demo的演示過程中有很多命令值得我們記錄下來并且常用
- peer channel update XXX
- peer channel join XXX
- peer chaincode install XXX
- peer chaincode instantiate XXX
- peer chaincode query XXX
- peer chaincode invoke
謝謝更卒。