Hyperledger Fabric 1.4系统通道Orderer更新版本验证错误排查
解决Hyperledger Fabric 1.4系统通道添加Orderer时的版本冲突问题
错误原因解析
你遇到的尝试将[Policy]/Channel/Orderer/OrgMSP/Admins的版本设为0,但该密钥当前版本已是0错误,本质是Fabric的配置版本校验机制导致的:
Fabric要求所有配置修改必须基于最新的配置状态,且被修改的配置项必须递增其版本号,否则Orderer会判定该修改无效(因为版本号未变化,视为重复操作或基于旧配置的修改)。
版本字段更新规则
- 不需要更新所有版本字段:只需要针对你实际修改的配置路径对应的版本号进行递增,未改动的配置项版本保持原样即可。比如你是添加新Orderer,主要需要更新的是
/Channel/Orderer/Endpoints或对应Orderer组织节点配置的版本,而非所有Policy或配置项的版本。 - 如果误修改了未涉及的配置项(比如本例中的Admin策略)但未递增版本,就会触发上述错误。
配置pb文件的版本处理方式
- 使用官方工具(configtxlator、configtx)生成pb时:工具会自动对比修改前后的配置,仅对被修改的配置项递增版本号,无需手动指定。
- 手动修改配置JSON再转pb时:必须手动找到你修改的配置项对应的
version字段,将其值+1(比如从0改为1),否则会出现版本冲突。
修复步骤(实操指南)
导出系统通道最新配置,确保基于最新状态修改:
# 获取系统通道配置块 peer channel fetch config config_block.pb -o <目标Orderer地址> -c <系统通道名称> # 转成JSON格式方便编辑 configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json仅修改必要配置:复制
config.json为modified_config.json,只添加新Orderer的相关配置(比如在Channel.Orderer.Endpoints数组中加入新Orderer的地址,或更新Orderer组织的节点信息),不要改动未涉及的配置项(比如本例中的Admin策略)。生成合法的配置更新pb文件:
# 将原始配置转成pb configtxlator proto_encode --input config.json --type common.Config --output config.pb # 将修改后的配置转成pb configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb # 计算配置更新diff(工具自动处理版本递增) configtxlator compute_update --channel_id <系统通道名称> --original config.pb --updated modified_config.pb --output config_update.pb # 转成JSON查看更新内容 configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate | jq . > config_update.json # 打包成可提交的Envelope格式 echo '{"payload":{"header":{"channel_header":{"channel_id":"<系统通道名称>", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json # 转成最终的pb文件 configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb签名并提交配置更新:由符合系统通道修改策略的Org管理员依次签名,再提交给Orderer:
# 管理员签名 peer channel signconfigtx -f config_update_in_envelope.pb # 提交到Orderer peer channel update -f config_update_in_envelope.pb -c <系统通道名称> -o <目标Orderer地址>
关于另外两个通道无日志的说明
你更新的是系统通道,应用通道不会自动生成系统通道配置更新的相关日志,这是正常现象。若后续需要让应用通道使用新添加的Orderer,无需单独更新应用通道配置(Fabric 1.4中应用通道会自动同步系统通道的Orderer节点列表)。
内容的提问来源于stack exchange,提问作者Bentipe
相关产品推荐
相关产品推荐

