概述流程
生成证书
编写新组织的configtx.yaml
生成,新组织的json文件
启动容器
获取最新系统配置的pb文件(可能需要tls证书)
利用configtxlator将pb转换成json
将新组织的json加入到最新区块的json中
利用configtxlator将原始的,修改后的json转换成pb文件
计算原始pb和新增加组织的pb增量
将该增量转换成json,向增量加入如下json。
1
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . >config_update_in_envelope.json
将第10步改好的json转换成pb格式。
为这个做好的增量pb签名
peer channel update 更新到区块上。
在新组织的peer节点加入通道
实验
在1.4版本的first-network例子中实验。成功将新组织加入到mychannel通道
1 | cd org3-artifacts |
生成证书
1 | ../../bin/cryptogen generate --config=./org3-crypto.yaml |
生成org3的json字符串
1 | export FABRIC_CFG_PATH=$PWD && ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json |
拷贝order证书到org3目录下
1 | cd ../ && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/ |
获取mychannel的配置区块
1 | peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA |
转为json
1 | configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json |
将org3加入到此json中
1 | jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json |
转为pb
1 | configtxlator proto_encode --input config.json --type common.Config --output config.pb |
转为pb
1 | configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb |
计算pb之间的增量
1 | configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb |
转为json
1 | configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json |
加入header信息
1 | echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json |
转为pb
1 | configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb |
org1签名
1 | peer channel signconfigtx -f org3_update_in_envelope.pb |
切换到org2签名
1 | 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 |
上传新配置
1 | peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA |
编写docker-compose文件
1 | docker-compose -f docker-compose-org3.yaml up -d |
进入容器
1 | docker exec -it Org3cli bash |
获取第0个区块
1 | peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA |
加入到channel里边
1 | peer channel join -b mychannel.block |
切换到另一peer
1 | export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/ca.crt && export CORE_PEER_ADDRESS=peer1.org3.example.com:7051 |
加入到channel里边
1 | peer channel join -b mychannel.block |
配置锚节点(可选)
1 | peer channel fetch config config_block.pb -o orderer.example.com:7050 -c mychannel --tls --cafile $ORDERER_CA |