Hyperledger fabric Hyperledger Fabric v1.4中即使在背书策略失败后仍提交块

Hyperledger fabric Hyperledger Fabric v1.4中即使在背书策略失败后仍提交块,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,我已将我的背书策略设置为“和('Org1MSP.peer','OrgMainMSP.peer')”,这意味着我需要两个组织的证书才能成功执行交易 执行的交易如下: 对等链码调用-o order0.org.com:7050--tls--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderorganizations/org.com/orders/order0.org.com/msp/tlscacerts/tlsc

我已将我的背书策略设置为“和('Org1MSP.peer','OrgMainMSP.peer')”,这意味着我需要两个组织的证书才能成功执行交易

执行的交易如下:

对等链码调用-o order0.org.com:7050--tls--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderorganizations/org.com/orders/order0.org.com/msp/tlscacerts/tlsca.org.com-cert.pem -n accessControl--peeradresspeer0.org main.com:7051--tlsRootCertFiles/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org-main.com/peers/peer0.org-main.com/tls/ca.crt --peeradresspeer0.org1.com:10051--tlsRootCertFiles/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.com/peers/peer0.org1.com/tls/ca.crt -c'{“Args”:[]}

一切正常。成功提交了一个新块,也可以在couchdb上看到。但当我发送事务删除其中一个证书时,如下所示:

对等链码调用-o order0.org.com:7050--tls--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderorganizations/org.com/orders/order0.org.com/msp/tlscacerts/tlsca.org.com-cert.pem -n accessControl--peeradresspeer0.org main.com:7051--tlsRootCertFiles/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org-main.com/peers/peer0.org-main.com/tls/ca.crt -c'{“Args”:[]}'

通过事务提交新块,但提交者将其标记为无效,日志上显示以下错误消息

peer0.org main.com| 2020-03-20 07:59:30.868 UTC[vscc]验证-> ERRO 094 VSCC错误:stateBasedValidator。验证失败,错误 验证tx 7:0中链码访问控制的背书策略 失败:签名集不满足策略

peer0.org main.com| 2020-03-20 07:59:30.868 UTC[valimpl] 预处理程序块->警告097通道[myc]:块[7]事务 索引[0]TxId [01246b27c11f94124aee3c4ac84a011be51a26aaa50fc28f1d6f5f5a8860c079] 提交人将其标记为无效。原因码 [背书\政策\失败]

peer0.org main.com| 2020-03-20 07:59:31.156 UTC[kvledger] CommitWithPvtData->INFO 098[myc]已提交块[7]与1 287ms内的事务(状态验证=0ms 块_和_pvtdata_commit=220ms状态_commit=17ms) 委员会=[9D52225DDBC8F6F98EDD378CBCF369FEA22666B9EC1CFF1A91DEBDEBC2D2A1]

当我再次提交通过这两个证书的事务时,它抛出一个错误

错误:无法汇编事务:ProposalResponsePayloads不存在 匹配-提案响应:版本:1响应状态:200有效负载:。。。 >

这里的问题是,如果我错误地调用调用函数,只传递组织的一个证书(背书策略失败),那么我将无法进一步处理事务

  • 根据背书政策签署的交易
  • 没关系。块已提交,状态已更新

  • 交易签名与背书策略不匹配
  • 没关系。您的客户机不会尝试提交该事务,但如果提交了,则会提交一个新的块,其中包含一个无效事务,并且状态不会更新

  • 建议响应路径不匹配

  • 现在问题不同了。我认为这与以前的交易没有关系。签名是预期的签名,但您正在使用两个不匹配的事务建议组成一个事务。他们的回复或写集不一样。确保您没有在链码中使用外部调用、随机数、时间戳(交易或块的时间戳除外)或类似值,这些值可能在两种背书中都不匹配。当然,事务将无效,但会提交一个新的块。

    谢谢@kekomal。它解决了这个问题。我使用随机数从链码生成唯一ID。所以这里面有个问题。关于时间戳,我们不能使用shim包提供的getTextTimeStamp()函数吗?或者它会有与上面相同的问题吗?您可以使用特定的时间戳。考虑到它是事务时间戳(不是当前时间戳)。该时间戳是从事务中提取的,因此它在所有对等方上都是相同的。对于状态中的唯一ID,当无法从其他一些唯一字段派生时,我通常使用类似“MYMODELNAME”+
    getxid()
    (除非在同一事务中为同一模型/类型创建多个文档)。