fabric学习(7)——更新channel配置

目标:把max_message_count10改为20

进入cli容器

docker exec -it cli bash

设置ca路径和channel_name

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

新建文件夹updatesizecfg

mkdir updatesizecfg
cd updatesizecfg

拉取最新配置

peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

去除所有的头部、元数据、创建者签名等无关内容后,转换成json

configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json

修改json配置,为防止出错,不要直接用vi编辑,使用jq工具
找到该参数路径

export MAXBATCHSIZEPATH=".channel_group.groups.Orderer.values.BatchSize.value.max_message_count"

打印出来原来的值

jq "$MAXBATCHSIZEPATH" config.json

显示为10
更新该值,并输出到modified_config.json中

jq "$MAXBATCHSIZEPATH = 20" config.json > modified_config.json

打印modified_config.json中max_message_count的值

jq "$MAXBATCHSIZEPATH" modified_config.json

显示为20

将 config.json 文件倒回到 protobuf 格式,命名为 config.pb :

configtxlator proto_encode --input config.json --type common.Config --output config.pb

将 modified_config.json 编码成 modified_config.pb:

configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

现在使用 configtxlator 去计算两个protobuf 配置的差异。这条命令会输出一个新的 protobuf 二进制文件,命名为 modified_config.pb

configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output update_size.pb

将这个对象解码成可编辑的 JSON 格式,并命名为 update_size.json

configtxlator proto_decode --input update_size.pb --type common.ConfigUpdate | jq . > update_size.json

现在有了一个解码后的更新文件,update_size.json,需要用信封消息来包装它。这个步骤要把之前裁剪掉的头部信息还原回来。
命名这个新文件为 update_size_in_envelope.json

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

使用configtxlator 工具将他转换为 Fabric 需要的完整独立的 protobuf 格式。将最后的更新对象命名为 update_size_in_envelope.pb

configtxlator proto_encode --input update_size_in_envelope.json --type common.Envelope --output update_size_in_envelope.pb

下面的步骤是参考官方文档Adding an Org to a Channel的,实际上不对,因为加入一个新的组织,是需要原有组织同意的,但修改通道的配置,则是在修改order的配置,因此需要用Order的管理员用户登录,贴上错误步骤:
Org1签名

peer channel signconfigtx -f update_size_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 update_size_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA

这里报错了:

Error: got unexpected status: BAD_REQUEST -- error applying config update to existing channel 'mychannel': error authorizing update: error validating DeltaSet: policy for [Value]  /Channel/Orderer/BatchSize not satisfied: implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 1 of the 'Admins' sub-policies to be satisfied

正确的步骤:
切换到order的admin用户

CORE_PEER_LOCALMSPID=OrdererMSP
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp/

执行升级:

peer channel update -f update_size_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA

成功!

检查配置是否生效:

peer channel fetch config new_config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

转换成json

configtxlator proto_decode --input new_config_block.pb --type common.Block | jq .data.data[0].payload.data.config > new_config.json

打印出来新的值

jq "$MAXBATCHSIZEPATH" new_config.json

显示20,表示升级成功


转载请注明来源

×

喜欢就点赞,疼爱就打赏