本文对官方文档中关于在现有通道内添加新组织的步骤进行讲解,实际生产环境中需理解各个核心步骤,欢迎留言讨论,如有理解不到位的地方还请指正。
生成组织3的配置材料
- 通过org3-crypto.yaml生成证书:
cryptogen generate --config=./org3-crypto.yaml
- 替换docker-compose启动文件的CA证书私钥
cp docker-compose-ca3-template.yaml docker-compose-ca3.yaml
CURRENT_DIR=$PWD
cd org3-artifacts/crypto-config/peerOrganizations/org3.example.com/ca/
PRIV_KEY=$(ls *_sk)
cd "$CURRENT_DIR"
sed $OPTS "s/CA3_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-ca3.yaml
- 通过配置文件(configtx.yaml),生成org3通道的基本材料
- 将org3规格信息写入到json文件
export FABRIC_CFG_PATH=$PWD && ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
- 将order组织的MSP材料拷贝到org3组织材料下
cd ../ && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
- 将org3规格信息写入到json文件
准备CLI容器环境
- 进入cli容器
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
- 验证:
echo $ORDERER_CA && echo $CHANNEL_NAME
获取channel 配置最新版本区块
这里将最新版本配置区块保存到config_block.pb中:
peer channel fetch config config_block.pb -o [orderer.example.com:7050](http://orderer.example.com:7050) -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
配置区块解码
将最新配置区块信息解码到json文件中,同时去除去掉所有的header、metadata、creator signatures等信息:
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
Org3配置材料
- 使用jq工具将org3.json追加到通道配置文件里
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json
- 编码config.json到二进制文件中(只包含之前通道的组织信息)
onfigtxlator proto_encode --input config.json --type common.Config --output config.pb
- 编码modified_config.json到modified_config.pub(包含org3和之前的通道的组织)
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
- 使用configtxlator计算出两个二进制文件中的差异部分到org3_update.pb
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb
- 在提交组织3的加入之前,先解码到json文件
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json
- 然后需要添加信封信息(之前去掉的头信息等)
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json
- 再利用工具重新编码
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb
背书并提交组织3加入的更新交易
具体需要哪些组织管理员签名,根据mod_policy来,如不满足要求将会被order组织拒绝
- 利用org1管理员签名
peer channel signconfigtx -f org3_update_in_envelope.pb
- 利用org2管理员签名
- 设置环境变量
export CORE_PEER_LOCALMSPID="Org2MSP" export 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 export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
- 直接发送提交交易请求,会自动签名
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o [orderer.example.com:7050](http://orderer.example.com:7050) --tls --cafile $ORDERER_CA
- 查看日志进行验证:
docker logs -f peer0.org1.example.com
配置leader选举
将org3加入channel
- 先启动org3 peer容器和org3 cli容器
docker-compose -f docker-compose-org3.yaml up -d
- 进入cli容器
docker exec -it Org3cli 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
- 向order组织拉取该通道的创世区块请求
peer channel fetch 0 mychannel.block -o [orderer.example.com:7050](http://orderer.example.com:7050) -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
- 通过创世区块加入channel
peer channel join -b mychannel.block
- 加入其它org3的peer节点,例如:
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:12051
peer channel join -b mychannel.block
安装、初始化、调用链码
这部分内容跟安装链码相关,这里略过不表
结语
至此已经成功添加新组织到已有通道中,整个过程参照官方文档,可以对照理解每一步的意义和作用
网友评论