初始状态:本地跑有网络(fabric1.1),一个通道mychannel,通道中有3个组织org1、org2、org3;
1:在对应网络的文件夹下创建组织4文件夹org4-artifacts,在org-artifacts下创建组织4的configtx.yaml和org4-crypto.yaml可以参照原来网络中的crypto-config.yaml和configtx.yaml或者官方github上的org3-artifacts: https://github.com/hyperledger/fabric-samples/tree/release-1.1/first-network/org3-artifacts
2:生成org4的证书此时org4-artifacts文件夹下会多出crypto-config文件夹里面即为org4的证书,把org4-artifacts/crypto-config/peerOrganizations下的org4.example.com复制到原网络文件夹下的crypto-config/peerOrganizations中。该文件夹原来存放的是org1-3的证书
../bin/cryptogen generate --config=./org4-crypto.yaml
3:在原网络的configtx.yaml下加上org4的信息即org4-artifacts下configtx.yaml里的内容
4:生成org4的配置保存在channel-artifacts下
./bin/configtxgen -printOrg Org4MSP -profile ./configtx.yaml > ./channel-artifacts/org4.json
5:安装jq工具jq 可以对 JSON 进行过滤、修改等操作
apt install jq
6:进入原网络客户端容器获取当前通道的配置文件保存到config_block.pb里
docker exec -it cli bash
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --cafile $ORDERER_CA
7:原网络文件夹下创建一个tem文件夹
8:把config_block.pb拷贝到主机上操作
docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/config_block.pb ./tem
9:在tem内把config_block.pb解码为json格式
../bin/configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json0
10:把org4的内容加入到config.json中
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org4MSP":.[1]}}}}}' config.json ../channel-artifacts/org4.json > modified_config.json
11:把config.json和modified_config.pb编码成二进制文件
../bin/configtxlator proto_encode --input config.json --type common.Config --output config.pb
../bin/configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
12:用configtxlator计算出两个二进制的差异,输出到org4_update.pb
export CHANNEL_NAME=mychannel
../bin/configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org4_update.pb
13:将org4_update.pb解码为json文件
../bin/configtxlator proto_decode --input org4_update.pb --type common.ConfigUpdate | jq . > org4_update.json
14:用jq给org4_update.json补充标头
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat org4_update.json)'}}}' | jq . > org4_update_in_envelope.json
15:把org4_update_in_envelope.json编码为二进制文件
../bin/configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb
16:把二进制文件拷贝到容器里
docker cp org4_update_in_envelope.pb cli:/opt/gopath/src/github.com/hyperledger/fabric/peer
17:依次让原通道里的每个组织给新配置签名
CORE_PEER_ID=peer0.org2.example.com
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
CORE_PEER_LOCALMSPID=Org2MSP
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer channel signconfigtx -f org3_update_in_envelope.pb
设置cli容器的环境变量,把环境变量里的org2依次换为2、3,初始是以org1的成员身份依次执行
将通道更新提交至网络
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --cafile $ORDERER_CA
其中CHANNEL_NAME和ORDERER_CA为:
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel
提交完后将在cli容器中以org4的成员身份加入通道、安装链码可以正常操作链码即成功将组织加入通道。
参考博客:
https://www.cnblogs.com/jxd283465/p/13530044.html
https://www.cnblogs.com/llongst/p/12072885.html