Portainer部署Hyperledger Fabric 1.4.0 执行submitTransaction报背书失败问题
问题修复方案
核心现象
- 基于Portainer部署的Fabric 1.4.0版本区块链网络,已完成JavaScript版链码的安装与实例化
- 自研TypeScript应用与链码交互时,
evaluateTransaction(查询类操作)可正常执行 - 调用
submitTransaction(交易提交操作)时持续报错,核心报错信息为:2021-03-11T09:48:43.964Z - warn: [DiscoveryEndorsementHandler]: _build_endorse_group_member >> G2:0 - endorsement failed - Error: 14 UNAVAILABLE: failed to connect to all addresses 2021-03-11T09:48:43.967Z - error: [DiscoveryEndorsementHandler]: _endorse - endorsement failed::Error: Endorsement has failed - 排查dev-peer节点容器日志可确认:查询请求可正常送达peer节点,但交易类操作请求未在peer节点产生任何日志记录
- 已验证的临时生效方案:将
gateway.connect()入参中的discovery.enabled从true调整为false后,交易提交操作可正常执行
问题根因
该报错是Fabric SDK服务发现模块在容器化部署场景下的地址解析不匹配导致:
- 启用服务发现功能时,SDK会先向peer节点发起网络拓扑发现请求,获取网络中所有节点在集群内部的服务地址(即Docker/Portainer环境下的容器域名),而非应用配置文件中预先定义的外部可访问IP
- 由于应用运行在Fabric网络容器集群外部,无法解析、访问集群内部的容器域名,因此在准备背书提案阶段就会抛出
failed to connect to all addresses的连接失败错误 - 查询类操作
evaluateTransaction默认不需要走完整的服务发现、多节点背书流程,直接基于配置文件中定义的peer地址发起查询请求,因此不受该问题影响,可正常执行
修复路径
临时可用方案
直接关闭服务发现功能,即在gateway.connect()入参中配置:
{ "discovery": { "enabled": false } }
该配置下SDK将完全基于network-config.json中定义的peer、orderer地址发起请求,跳过拓扑发现环节。
长期适配方案
若需要保留服务发现功能以匹配链码背书策略要求,可按以下步骤调整:
- 修改peer节点核心配置文件
core.yaml,将peer.listenAddress设置为节点对外可访问的IP与端口,而非集群内部容器地址 - 在应用运行环境的hosts配置中,将服务发现返回的内部容器域名,映射到对应peer的外部可访问IP,确保SDK拿到的节点地址能被正常解析
- 校验
network-config.json中的所有peer、orderer地址配置,确保与节点实际对外暴露的访问IP、端口完全匹配 - 调整超时配置:当前配置中peer背书超时仅设置为300ms,生产环境下建议调整至30s以上,避免复杂链码逻辑执行时出现不必要的超时失败
内容的提问来源于stack exchange,提问作者duongtt
相关产品推荐
相关产品推荐

