You need to enable JavaScript to run this app. Portainer部署Hyperledger Fabric 1.4.0 执行submitTransaction报背书失败问题
优惠活动
大模型
产品
解决方案
定价
更多

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服务发现模块在容器化部署场景下的地址解析不匹配导致:

  1. 启用服务发现功能时,SDK会先向peer节点发起网络拓扑发现请求,获取网络中所有节点在集群内部的服务地址(即Docker/Portainer环境下的容器域名),而非应用配置文件中预先定义的外部可访问IP
  2. 由于应用运行在Fabric网络容器集群外部,无法解析、访问集群内部的容器域名,因此在准备背书提案阶段就会抛出failed to connect to all addresses的连接失败错误
  3. 查询类操作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 15:36:04