最近在学习hyperledger fabric相关知识,故写下此文以防日后遗忘。
eyfn.sh是官方提供的对byfn动态添加新组织的脚本。
本文试图通过了解eyfn.sh运行模式学习向fabric网络中添加节点或组织的具体方式,以便可以修改该脚本供自己使用。
主要参考https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html
当运行./eyfn.sh up 时主要步骤为:
以下对每个模块进行具体分析。
generateCerts 函数实现的功能较为简单,即使用工具cryptogen根据配置文件org3-crypto.yaml生成Org3的证书。
cryptogen generate --config=./org3-crypto.yaml
生成证书的路径为:fabric-samples/first-network/org3-artifacts
generateChannelArtifacts函数完成了两步:
configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
docker exec Org3cli ./scripts/testorg3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE
在cli中进行如下步骤:
执行位于scripts的脚本step1org3.sh
step1org3.sh:
fetchChannelConfig ${CHANNEL_NAME} config.json
即执行
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --cafile $ORDERER_CA
此命令根据官网解释是
This command saves the binary protobuf channel configuration block to config_block.pb.
即返回目标通道的最新配置块,保存为.pb类型的文件。
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}"
使用configtxlator工具对之前生成的config_block.pb进行修改并保存为json格式。
注:对此配置文件config.json更深入的探讨参见https://hyperledger-fabric.readthedocs.io/en/latest/config_update.html
接下来
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json
是对前面保存的config.json修改,将之前生成的org3.json添加进去,并保存为modified_config.json。
createConfigUpdate ${CHANNEL_NAME} config.json modified_config.json org3_update_in_envelope.pb
这步执行了
configtxlator proto_encode --input "${ORIGINAL}" --type common.Config >original_config.pb
configtxlator proto_encode --input "${MODIFIED}" --type common.Config >modified_config.pb
configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb >config_update.pb
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate >config_update.json
即使用configtxlator工具将原配置文件config.json与修改后的配置文件modified_config.json转换回.pb格式,计算两者之间的增量,org3_update.pb,即为需要更新的内容。
org3_update.pb还需要进行封装,则需要将其转换为json格式,封装后再打包回.pb格式,最终生成文件为org3_update_in_envelope.pb。
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . >config_update_in_envelope.json
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope >"${OUTPUT}"
signConfigtxAsPeerOrg 1 org3_update_in_envelope.pb
peer channel update -f org3_update_in_envelope.pb -c ${CHANNEL_NAME} -o orderer.example.com:7050 --tls --cafile ${ORDERER_CA}
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE_ORG3 up -d
根据docker-compose-org3.yaml启动docker。
将org3的peer添加进网络
docker exec Org3cli ./scripts/step2org3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE
在Org3cil中进行如下步骤:
peer channel fetch 0 $CHANNEL_NAME.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
检索创世块并将org3的peer1和peer2加入网络中,再在org3peer0上安装chaincode 2.0
joinChannelWithRetry 0 3
joinChannelWithRetry 1 3
installChaincode 0 3 2.0
docker exec cli ./scripts/step3org3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE
在cli中执行:
installChaincode 0 1 2.0
installChaincode 0 2 2.0
upgradeChaincode 0 1
即在组织1和2中安装chaincode2.0,并在三个组织上实例化。
向网络中添加组织的主要步骤为: