Hyperledger Fabric链码查询报Endorsement Failure错误如何解决
Hyperledger Fabric secured-asset-transfer场景私有数据查询失败排查方案
问题复现
执行以下链码查询命令时失败:
peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n secured -c '{"function":"GetAssetPrivateProperties","Args":["asset1"]}'
返回报错:
Error: endorsement failure during query. response: status:500 message:"asset private details does not exist in client org's collection: asset1"
核心错误:查询背书失败,状态码500,当前客户端所属组织的私有数据集合中不存在asset1对应的资产私有详情。
排查解决步骤
先确认资产公开数据是否存在
先调用公开资产查询接口,验证asset1是否已经成功创建上链:peer chaincode query -C mychannel -n secured -c '{"function":"ReadAsset","Args":["asset1"]}'如果公开资产都查询不到,说明之前的资产创建交易没有成功提交,需要重新执行资产创建流程,确保创建交易满足背书策略、成功写入通道账本后再查私有数据。
校验当前查询身份的组织权限
该报错的最常见原因是执行查询的peer所属组织不持有该资产的私有数据:- secured-asset-transfer场景中,资产私有属性默认写入资产所有方组织的隐式私有数据集合(命名规则为
_implicit_org_<组织MSPID>),GetAssetPrivateProperties接口仅支持查询当前客户端所属组织自己持有的私有属性。如果当前使用的是其他参与方(比如受让方、审计方组织)的peer节点执行命令,本身就没有该数据的访问权限,需要走场景约定的授权查询、密钥分发流程,不能直接调用该接口。 - 如果确认当前peer属于资产所有方组织,检查该peer是否正常加入通道、锚节点配置是否正确,排除gossip通信异常导致私有数据没有同步到当前节点的情况。本地测试环境可在资产创建完成后等待30秒左右再执行查询,给私有数据预留同步时间。
- secured-asset-transfer场景中,资产私有属性默认写入资产所有方组织的隐式私有数据集合(命名规则为
检查链码私有数据集合配置
确认链码部署时加载的collections_config.json配置符合场景要求:- 每个组织对应的隐式私有集合的访问策略配置正确,仅允许对应组织的节点读写集合数据
- 集合的
requiredPeerCount、maxPeerCount参数配置合理,避免资产创建时私有数据没有成功分发到组织内的节点就完成了交易排序。如果配置存在错误,需要重新升级链码更新集合配置,再重新创建资产测试。
排查私有数据同步故障
如果以上配置都验证无误,检查peer节点运行日志:- 搜索asset1对应的私有数据分发、拉取记录,确认是否存在数据校验失败、连接超时导致的私有数据拉取失败问题
- 核对peer节点
core.yaml中peer.gossip.pvtData模块的配置,确认没有开启私有数据拦截、没有配置错误的gossip广播参数。配置修正后重启peer节点,等待私有数据自动完成同步后重试查询。
内容的提问来源于stack exchange,提问作者jainth asokan
相关产品推荐
相关产品推荐

