拆解fabric-sample/first-network/byfn.sh——深入shell看过程
byfn是fabric-sample下的一个快速入门的demo。
byfn全名意为:build your first network,就是用来构建一个你自己的第一个fabric超级账本网络。
这个demo属于入门级demo,也是一个快速帮助初学者了解超级账本的启动流程的一个最好的例子。
拆解byfn.sh
前面通过执行的方式看到byfn.sh的执行效果,接下来看看该脚本内部的实际操作。
记得我们启动byfn脚本传入了一个参数:up
接下来就从入口开始探究一下byfn经历了哪些。
启动
#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
所以这里会调用“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的时候自动检测是否存在证书文件,不存在则创建
if [ ! -d "crypto-config" ]; then
##利用cryptogen生成新的Certs文件
generateCerts
##根据e2e模版yaml生成新的yaml,并将生成的Cert文件替换到yaml的CA节点的路径中
replacePrivateKey
##利用configtxgen生成创世区块、创建通道
generateChannelArtifacts
fi
## 1个order排序节点、4个peer节点,p0o1,p1o1,p0o2,p1o2
## ...XXX... -c XXX -s couchdb ...XXX...
if [ "${IF_COUCHDB}" == "couchdb" ]; then
##如果选择了couchdb则会启动4台couchdb节点用来分别挂载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
##调用脚本启动
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可执行文件configtxlator的版本号是否一致,如果不一致也只是输出警告信息,不会影响使用;
- 同时还有一个badversion(不支持列表),如果上述2个版本号在不支持列表中,会发出ERROR并退出;
- 检查证书文件是否存在
- 判断当前目录下是否存在“config”目录,该目录是由命令:“./byfn.sh generate” 生成;
- 同时我们也可以不必要单独生成,因为在networkUp的时候自动检测是否存在证书文件,不存在则创建;
- 生成证书文件
##利用cryptogen生成新的Certs文件 generateCerts ##根据e2e模版yaml生成新的yaml,并将生成的Cert文件替换到yaml的CA节点的路径中 replacePrivateKey ##利用configtxgen生成创世区块、创建通道 generateChannelArtifacts
- 选择DB类型
1. fabric支持两种数据库类型,默认采用goleveldb,也可以通过这里传入命令的方式选择使用CouchDB
``` bash
if [ "${IF_COUCHDB}" == "couchdb" ]; then
##如果选择了couchdb则会启动4台couchdb节点用来分别挂载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. 根据脚本我们知道可以使用“...XXX... -c XXX -s couchdb ...XXX...” -s参数来选择couchdb
-
真正开始准备启动,通过脚本我们可以很直观的看到启动流程
## Create channel 创建通道 echo "Creating channel..." createChannel ## Join all the peers to the channel 所有节点加入通道 echo "Having all peers join the channel..." joinChannel ## Set the anchor peers for each org in the channel 更新p0o1,p0o2锚节点信息 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 执行一次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
谢谢。
网友评论