Hyperledger Fabric 入门笔记(十六)Fabric V2.5 测试网络部署补充 - 手动从通道中移除组织

时间:2024-11-07 13:22:50

文章目录

  • 一、手动从通道中移除组织
    • 1.1. 准备工作
    • 1.2. 流程
      • 1.2.1. 停止组织Org2的对等体
      • 1.2.2. 通道配置更新
        • 1.2.2.1. 获取现有通道配置
        • 1.2.2.2. 将通道配置转换为JSON格式并修剪
        • 1.2.2.3. 修改通道配置
        • 1.2.2.4. 签名并提交配置更新
      • 1.2.3. 重启Org1和Org3的Peer节点


一、手动从通道中移除组织

1.1. 准备工作

本节从包含了组织Org1、Org2和Org3的Fabric测试网络中移除组织Org2。移除之前需要先启动测试网络、创建通道并将组织Org3加入到通道中:

cd hyfa/fabric-samples/test-network
./network.sh down
./network.sh up createChannel -c channel1
cd addOrg3
./addOrg3.sh up -c channel1

可选的,可以继续在测试网络部署链码。

1.2. 流程

1.2.1. 停止组织Org2的对等体

在从测试网络中移除组织Org2之前,应当先停止Org2的对等体容器:

docker stop peer0.org2.example.com

如已部署链码,peer0.org2.example.com的链码容器会自动关闭。

1.2.2. 通道配置更新

1.2.2.1. 获取现有通道配置

返回test-network目录:

cd ..

将二进制文件和配置文件的目录加入环境变量:

export PATH=$PATH:${PWD}/../bin/
export FABRIC_CFG_PATH=${PWD}/../config/

使用setOrgEnv.sh脚本设置环境变量作为Org1操作peer CLI来获取通道配置:

export $(./setOrgEnv.sh Org1 | xargs)

再将测试网络的排序服务的TLS CA证书的路径设置为环境变量:

export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

获取最新的配置区块:

peer channel fetch config channel-artifacts/config_block.pb -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c channel1 --tls --cafile "$ORDERER_CA"
1.2.2.2. 将通道配置转换为JSON格式并修剪

进入存储通道配置区块的channel-artifacts文件夹:

cd channel-artifacts

使用configtxlator工具将此通道配置区块解码为JSON格式,去掉所有与想要进行的更改无关的标头、元数据、创建者签名等:

configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json
jq ".data.data[0].payload.data.config" config_block.json > config.json
1.2.2.3. 修改通道配置

再次使用jq工具从通道的Application.groups字段中删除Org2MSP,并将输出命名为modified_config.json。

jq 'del(.channel_group.groups.Application.groups.Org2MSP)' config.json > modified_config.json

现在可以将原始和修改后的通道配置转换回protobuf格式,并计算它们之间的差异。

configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
configtxlator compute_update --channel_id channel1 --original config.pb --updated modified_config.pb --output config_update.pb

这将输出一个名为config_update.pb的新protobuf二进制文件,然后把这个对象解码为可编辑的JSON格式:

configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json

将config_update.json封装在一个信封消息中:

echo '{"payload":{"header":{"channel_header":{"channel_id":"channel1", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json

最后转换为protobuf格式:

configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
1.2.2.4. 签名并提交配置更新

在将配置更新写入账本之前,需要必要的管理员用户的签名。这里需要Org1、Org2和Org3的签名。
返回test-network目录:

cd ..

作为Org1为此更新签名:

peer channel signconfigtx -f channel-artifacts/config_update_in_envelope.pb

使用setOrgEnv.sh脚本设置环境变量作为Org2操作peer CLI:

export $(./setOrgEnv.sh Org2 | xargs)

作为Org2为此更新签名:

peer channel signconfigtx -f channel-artifacts/config_update_in_envelope.pb

因为setOrgEnv.sh脚本不支持,所以使用以下命令设置环境变量作为Org3操作peer CLI:

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID=Org3MSP
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
export CORE_PEER_ADDRESS=localhost:11051

最后使用peer channel update命令提交更新:

peer channel update -f channel-artifacts/config_update_in_envelope.pb -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c channel1 --tls --cafile "$ORDERER_CA"

这里,Org3的管理员签名将自动附加,因此无需再次手动签名。

1.2.3. 重启Org1和Org3的Peer节点

重启其它组织的对等体以消除警告:

docker stop peer0.org1.example.com
docker start peer0.org1.example.com
docker stop peer0.org3.example.com
docker start peer0.org3.example.com