【问题标题】:Block Committed Even After Endorsement Policy Failure In Hyperledger Fabric v1.4即使在 Hyperledger Fabric v1.4 中的背书策略失败后也提交了块
【发布时间】:2020-07-01 09:25:03
【问题描述】:

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

交易执行如下:

对等链代码调用 -o orderer0.org.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/org.com/orderers/orderer0.org.com/msp/tlscacerts/tlsca.org.com-cert.pem -n accessControl --peerAddresses peer0.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 --peerAddresses peer0.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 orderer0.org.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/org.com/orderers/orderer0.org.com/msp/tlscacerts/tlsca.org.com-cert.pem -n accessControl --peerAddresses peer0.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.Validate 失败,错误 验证 tx 7:0 中链码访问控制的背书策略 失败:签名集不满足策略

peer0.org-main.com | 2020-03-20 07:59:30.868 UTC [valimpl] preprocessProtoBlock -> WARN 097 Channel [myc]: Block [7] Transaction 索引 [0] TxId [01246b27c11f94124aee3c4ac84a011be51a26aaa50fc28f1d6f5f5a8860c079] 提交者标记为无效。原因码 [ENDORSEMENT_POLICY_FAILURE]

peer0.org-main.com | 2020-03-20 07:59:31.156 UTC [kvledger] CommitWithPvtData -> INFO 098 [myc] 已提交块 [7] 与 1 287 毫秒内的事务(state_validation=0 毫秒) block_and_pvtdata_commit=220ms state_commit=17ms) commitHash=[9d52225ddbc8f6f98edd37388cbcf369fea22666b9ec1cff1a91debdebc2d2a1]

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

错误:无法组装交易:ProposalResponsePayloads 没有 匹配 - 提案响应:版本:1 响应状态:200 有效负载:... >

这里的问题是,如果我错误地调用了仅传递一个组织证书的调用函数(背书策略失败),那么我将无法进行进一步的交易。

【问题讨论】:

    标签: hyperledger-fabric hyperledger


    【解决方案1】:
    1. 根据背书政策签署交易。

    没关系。块提交和状态更新。

    1. 交易签名与背书政策不匹配。

    没关系。您的客户端最好不要尝试提交该事务,但如果这样做了,则会使用无效事务提交一个新块,并且不会更新状态。

    1. ProposalResponsePayloads do not match

    现在问题不同了。我认为这与之前的交易无关。签名是预期的,但您正在编写一个包含 2 个不匹配的交易提案的交易。他们的响应或写集是不一样的。确保您没有在链码中使用外部调用、随机数、时间戳(交易或区块的时间戳除外)或类似值,这些值可能在两个背书中都不匹配。当然,交易是无效的,但是会提交一个新的区块。

    【讨论】:

    • 谢谢@kekomal。它解决了这个问题。我使用随机数从链码生成唯一 ID。所以这里面有问题。关于时间戳,我们不能使用 shim 包提供的 GetTxTimestamp() 函数吗?还是会出现和上面一样的问题?
    • 您可以使用该特定时间戳。考虑到它是事务时间戳(不是当前时间戳)。该时间戳是从事务中提取的,因此在所有对等点上都是相同的。对于该州的唯一 ID,当无法从其他一些唯一字段派生时,我通常使用类似“MYMODELNAME_”+GetTxID()(除非您在同一事务中为同一模型/类型创建多个文档)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多