本篇博文为上篇博文“为通道添加新的组织”的可选部分。
更新通道配置包含Org3锚节点
因为Org1
和Org2
已经在通道配置中定义了锚节点,所以Org3
的peer
节点可以与Org1
和Org2
的peer
节点建立gossip
连接。同样,新添加的组织如Org3
也应该在通道配置中定义自己的锚节点,让其它组织的新peer
可以直接发现一个Org3
的peer
。
从Org3-CLI
继续,为了定义一个Org3锚节点对通道配置进行更新,该过程与上次的配置更新相似。
1.获取最新配置区块:
1 | peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA |
结果如下:
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA |
2. 文件转换与配置添加
configtxlator
将.pb
文件转化为.json
文件,同时jq
工具去掉头部,元数据和签名。
1 | configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json |
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json |
现在的config.json
代表着将要被更新的最新的通道配置,再次使用jq
工具更新配置JSON文件,添加Org3
锚节点。
1 | jq '.channel_group.groups.Application.groups.Org3MSP.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer0.org3.example.com","port": 11051}]},"version": "0"}}' config.json > modified_anchor_config.json |
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# jq '.channel_group.groups.Application.groups.Org3MSP.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer0.org3.example.com","port": 11051}]},"version": "0"}}' config.json > modified_anchor_config.json |
将.json
文件转换为 .pb
文件,并计算增量:
1 | configtxlator proto_encode --input config.json --type common.Config --output config.pb |
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# configtxlator proto_encode --input config.json --type common.Config --output config.pb |
将anchor_update.pb
转化为anchor_update.json
:
1 | configtxlator proto_decode --input anchor_update.pb --type common.ConfigUpdate | jq . > anchor_update.json |
将更新封装在信封信息(envelope message)中,重新添加之前丢弃的头部,输出anchor_update_in_envelope.json
文件:
1 | echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat anchor_update.json)'}}}' | jq . > anchor_update_in_envelope.json |
将anchor_update_in_envelope.json
转化为anchor_update_in_envelope.pb
1 | configtxlator proto_encode --input anchor_update_in_envelope.json --type common.Envelope --output anchor_update_in_envelope.pb |
结果:
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# ls |
最后进行签名并提交更新,因为这只是对Org3
的更新,所以只需要Org3
在更新签名即可。由于当前环境身份为Org3
身份,因此不需要切换身份。
1 | peer channel update -f anchor_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA |
1 | root@e6a67979d990:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel update -f anchor_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA |
orderer接收得到配置更新请求,添加一个配置更新区块。当所有peer接收到该区块,则会处理配置更新。
查看其中一个容器日志,当处理一个新区块中的配置交易时,可以看到gossip
重新建立连接,代表配置更新已经成功应用了
1 | docker logs -f peer0.org1.example.com |
1 | mit=4ms) commitHash=[742a4724235b86378598f9f77115dee0bac62859d79062a43de1a151b43cef81] |
到目前为止,已经成功提交两个配置更新操作,包括添加Org3到通道中和为Org3定义锚节点。
最后更新: 2019年10月24日 14:06
原始链接: https://silence-linhl.github.io/blog/2019/10/24/addorg2/