ENDORSEMENT_POLICY_FAILURE 调用链代码函数时出错

ENDORSEMENT_POLICY_FAILURE error on on invocation of chaincode functions

在没有指定背书策略的情况下实例化链码时,链码中的函数调用工作正常,并且可以在 couchdb 数据库上看到存储的数据。但是在链码实例化期间明确指定背书策略为 "AND ('mohaMSP.peer','ecMSP.peer')" 时,链码函数的调用不会显示任何错误,但不会更新 couchdb 状态数据库。所以我检查了 peer0.moha.nid.com 上的日志,它显示了以下错误:

2019-01-29 09:46:00.851 UTC [valimpl] preprocessProtoBlock -> WARN cac6 Channel [nid-channel]: Block [7] Transaction index [0] TxId [bfed301afcaae5ad2ee8885c3cdbd39521827b25cabe92d6cf03f931da4ea391] marked as invalid by committer. Reason code [ENDORSEMENT_POLICY_FAILURE]

我已经在 peer0.ec.nid.com 和 peer0.moha.nid.com 上(即在两个组织中)安装了链码并验证了安装。如 peer channel list 命令所示,有三个节点加入了 nid-channel - peer0.moha.nid.com、peer1.moha.nid.com、peer0.ec.nid.com。

here is docker-compose.yaml file to start the network

here is docker-compose-base.yaml file

here is peer-base.yaml file

我是 运行 fabric 1.2.1 容器并将它们标记为最新。

Chaincode实例化命令:

peer chaincode instantiate -o orderer.nid.com:7050 -n car_reg -v 1 -C nid-channel -c '{"Args":[]}' -P "AND ('ecMSP.peer','mohaMSP.peer')"
  1. 如果在实例化时没有指定背书策略,背书策略默认为“频道内组织的任何成员”。即)"OR ('mohaMSP.member','ecMSP.member')"

  2. 当您明确指定背书策略 "AND ('mohaMSP.peer','ecMSP.peer')" 时,它会从每个 Org(mohaMSP、ecMSP)节点请求一个签名。 所以检查两个 Org 是否有认可的同行..

欲了解更多信息,setting-chaincode-level-endorsement-policies

试试这个:

-P "AND ('ecMSP.member','mohaMSP.member')"

也许您的同行没有 "peer" 角色。

查看此文档: Endorsement policy Identity Classification

我在调用链代码函数期间缺少 --peerAddresses 参数。现在解决了。感谢@Harshit 的评论

peer chaincode invoke -o orderer.nid.com:7050 -C nid-channel -n car_reg --peerAddresses peer0.moha.nid.com:7051 --peerAddresses peer0.ec.nid.com:7051 -c '{"Args":["createCar","1","bmw","tx","blue","me"]}'