ENDORSEMENT_POLICY_FAILURE用于调用链代码请求,即使有足够的认可成功

时间:2018-03-15 14:45:04

标签: sdk hyperledger-fabric hyperledger

我的网络由2个组织组成,每个组织有2个对等方,1个CA(每个组织),1个独立订购者。

我在所有对等设备上安装了链代码,并通过CLI通过认证策略"AND('Org1.member', 'Org2.member')"进行了实例化。

我在peer0.org1.example.com

上使用此命令进行实例化

peer chaincode instantiate -C mychannel -n mycc -P "AND('Org1.member', 'Org2.member')"

现在,当我尝试通过节点SDK调用请求时,我收到了所有成功的认可响应,但在发送给订购者后发生了ENDORSEMENT_POLICY_FAILURE错误。

我使用渠道功能sendTransactionProposalverifyProposalResponse通过compareProposalResponseResults检查了收到的认可。

peerorderer日志中没有提供额外信息来调试此错误。任何帮助将不胜感激。

我正在使用Hyperledger Fabric v1.0.1node sdk v1.0.0来运行这些测试。

1 个答案:

答案 0 :(得分:0)

verifyProposalResponse compareProposalResponseResults 不会验证是否存在足够的认可。

  

compareProposalResponseResults - 检查一组提案的实用程序方法,以检查它们是否包含相同的认可结果写集。这将验证认可的同行都同意链码执行的结果。

它将检查所有提案响应是否包含完全相同的响应。假设您的链代码应该返回值X.它验证所有提案响应是否包含X而不包含任何其他内容。这是一种有价值的方法,可确保您不会在读写集中出现不匹配。

  

verifyProposalResponse - 验证单个提案响应的实用程序方法。它检查以下方面:   1.代言人的身份属于渠道的合法MSP,可以成功反序列化   2.认可签名可以通过背书人的身份证明成功验证。

所以你需要检查一下你是否从同行那里得到了足够的回应。虽然没有直接的方法来做到这一点。您可以尝试以下几种方式:

  1. 计算proposalResponses数组的长度
  2. 手动检查每个提案响应的MSP ID(通过将提案响应转换为字符串)
  3. 作为预防措施,添加通道对象中的所有对等项,让SDK自动将其发送给通道中的所有对等方。这是通过不在 sendTransactionProposal ChaincodeInvokeRequest 对象中设置目标来完成的。 [请参阅:https://fabric-sdk-node.github.io/global.html#ChaincodeInvokeRequest]