hyperledger fabric 1.4 动态添加组织之 eyfn.sh详解

最近在学习hyperledger fabric相关知识,故写下此文以防日后遗忘。
eyfn.sh是官方提供的对byfn动态添加新组织的脚本。
本文试图通过了解eyfn.sh运行模式学习向fabric网络中添加节点或组织的具体方式,以便可以修改该脚本供自己使用。
主要参考https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html

当运行./eyfn.sh up 时主要步骤为:

  1. generateCerts ()
  2. generateChannelArtifacts()
  3. createConfigTx ()(脚本step1org3.sh)
  4. 启动docker容器
  5. 运行脚本step2org3.sh
  6. 运行脚本step3org3.sh
  7. test

以下对每个模块进行具体分析。

generateCerts

generateCerts 函数实现的功能较为简单,即使用工具cryptogen根据配置文件org3-crypto.yaml生成Org3的证书。
cryptogen generate --config=./org3-crypto.yaml
生成证书的路径为:fabric-samples/first-network/org3-artifacts

generateChannelArtifacts

generateChannelArtifacts函数完成了两步:

  1. 使用工具configtxgen生成Org3的描述文档org3.json
configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
  1. 将上一步中生成的证书复制到原来byfn生成网络的证书文件中
cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/

createConfigTx

docker exec Org3cli ./scripts/testorg3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE

在cli中进行如下步骤:
执行位于scripts的脚本step1org3.sh
step1org3.sh:

  1. 读取当前区块最新配置
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类型的文件。

  1. 将配置文件转换为json文件并添加org3.
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。

  1. 计算org3配置文件的增量
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}"
  1. 签名并提交更新
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}

启动docker容器

IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE_ORG3 up -d

根据docker-compose-org3.yaml启动docker。

脚本step2org3.sh

将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

脚本step3org3.sh

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,并在三个组织上实例化。

总结

向网络中添加组织的主要步骤为:

  1. 根据org3-crypto.yaml生成新org的证书。
  2. 生成Org3的描述文档org3.json。
  3. 获取当前区块状态信息,添加org3配置信息并与原信息对比获得增量信息,封装增量信息。
  4. 提交更新。
  5. 根据docker-compose-org3.yaml启动docker。
  6. 将org3的peer节点加入网络。
  7. 在org1,org2,org3上安装chaincode并将chaincode实例化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值