目标:把max_message_count
从10
改为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,表示升级成功
转载请注明来源