运行Fabric ERC-1155链码BatchTransferFrom时偶发ProposalResponsePayloads不匹配报错
问题定性
你遇到的报错不属于Fabric链码调用的正常情况,本质是多背书节点执行同一笔链码提案生成的读写集不一致,触发了Fabric的背书校验规则导致交易被拦截。你给出的两类报错属于同一问题的不同端表现:
- 命令行调用报错:
Error: could not assemble transaction: ProposalResponsePayloads do not match - proposal response: version:1 response:<status:200 > payload: ...
- Node SDK调用报错:
2021-08-30T09:59:41.794Z - error: [DiscoveryHandler]: compareProposalResponseResults[undefined] - read/writes result sets do not match index=1 2021-08-30T09:59:41.794Z - error: [Transaction]: Error: No valid responses from any peers. Errors: peer=undefined, status=grpc, message=Peer endorsements do not match
常见触发原因(ERC-1155 BatchTransferFrom场景专属)
- 链码二次开发引入非确定性逻辑:官方fabric-samples里的ERC-1155实现本身不存在非确定性问题,如果你做过二次改造,检查是否新增了读取节点本地时间、生成随机数、依赖节点本地环境变量这类逻辑,不同背书节点执行时拿到的变量值不同会直接导致读写集不一致。
- 节点状态同步滞后:部分背书节点还未同步之前的区块数据,读取到的通证持有量、账户状态为旧值,和其他已完成同步的节点读取到的最新状态不同,最终生成的读写集存在差异。
- 调用参数解析差异:如果BatchTransferFrom传递的多笔转账参数没有固定排序,或者数值类型没有统一用字符串传递,不同节点对参数的解析结果存在差异也会导致执行结果不一致。
- 链码版本不一致:部分背书节点上安装的链码为旧版本,和其他节点的链码逻辑不同,执行结果自然不匹配。
排查方案
- 先将背书策略临时调整为单节点背书,如果报错消失即可确认是多节点执行结果不一致导致的问题,再进一步定位根因。
- 开启所有背书节点的链码debug日志,对比同一笔提案在不同节点的输入参数、读取的状态值、写入的状态值,找到差异点即可定位问题。
- 检查所有背书节点的区块高度是否一致,确认是否存在节点同步滞后的问题。
- 校验所有背书节点上安装的链码版本、哈希是否完全一致,排除旧版本链码残留的问题。
内容的提问来源于stack exchange,提问作者Baran Kılıç
相关产品推荐
相关产品推荐

