文章目录
- 一、手动从通道中移除组织
- 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