微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hyperledger Fabric - Java-SDK - Future 异常完成:sendTransaction

如何解决Hyperledger Fabric - Java-SDK - Future 异常完成:sendTransaction

我正在运行一个 HL Fabric 专用网络,并使用 Fabric-Java-Sdk 将交易从 Java 应用程序提交到分类帐。

有时,例如有 1/10000 次,Java 应用程序在我向分类帐提交交易时抛出异常,如下面的消息:

错误 196664 --- [ Thread-4] org.hyperledger.fabric.sdk.Channel : Future 异常完成:sendTransaction

java.lang.IllegalArgumentException:提案响应有 2 无效的 0 不一致组。预计一切都会 一致且无无效。在 org.hyperledger.fabric.sdk.Channel.doSendTransaction(Channel.java:5574) ~[fabric-sdk-java-2.1.1.jar:na] 在 org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:5533) ~[fabric-sdk-java-2.1.1.jar:na] 在 org.hyperledger.fabric.gateway.impl.TransactionImpl.commitTransaction(TransactionImpl.java:138) ~[fabric-gateway-java-2.1.1.jar:na] 在 org.hyperledger.fabric.gateway.impl.TransactionImpl.submit(TransactionImpl.java:96) ~[fabric-gateway-java-2.1.1.jar:na] 在 org.hyperledger.fabric.gateway.impl.ContractImpl.submitTransaction(ContractImpl.java:50) ~[fabric-gateway-java-2.1.1.jar:na] 在 com.apidemoblockchain.RepositoryDao.BaseFunctions.Implementations.PairTrustBaseFunction.sendTrustTransactionMessage(PairTrustBaseFunction.java:165) ~[classes/:na] 在 com.apidemoblockchain.RepositoryDao.Implementations.PairTrustDataAccessRepository.run(PairTrustDataAccessRepository.java:79) ~[classes/:na] 在 java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

虽然我的提交方法是这样的:

 public void sendTrustTransactionMessage(Gateway gateway,Contract trustContract,String payload) throws TimeoutException,InterruptedException,invalidargumentexception,TransactionException,ContractException {
        // Prepare
        checkIfChannelIsReady(gateway);

        // Execute
        trustContract.submitTransaction(getCreateTrustMethod(),payload);
 }

我正在使用一个 4 组织网络,每个网络有 2 个对等节点,我使用 3 个通道,每个链码 DataType 一个通道,以保持干净。

我认为来自 Channel 的错误没有意义,因为我正在使用 Contract 提交它...

就像我打开网关,然后我保持打开状态以不断提交 txs。

      try (Gateway gateway = getBuilder(getTrustPeer()).connect()) {
            Contract trustContract = gateway.getNetwork(getTrustChaincodeChannelName()).getContract(getTrustChaincodeId(),getTrustChaincodeName());
            while (!terminateLoop) {
                 if (message) {
                    String payload = preparePayload();
                    sendTrustTransactionMessage(gateway,trustContract,payload);
                 }
                 ...
                 wait();
            } 
       ...
       }

编辑:

阅读@bestbeforetoday 建议后,我设法捕获了 ContractException 并分析了日志。尽管如此,我仍然不完全了解错误可能在哪里,因此,如何修复它。

我将在异常中收到的 ProposalResponses 中添加 3 个打印件,并在其后添加评论

ProposalResponses-1

ProposalResponses-2

ProposalResponses-3

因此,在第一张图片中,我可以看到在异常处收到了 3 个提案响应,并且异常原因消息说: “提案回复有 2 个不一致的组,其中 0 个无效。预计所有组都一致,没有一个无效。”

图片中,2/3 表示这些响应的内容,我注意到有 2 个字段保存空值,即“ProposalRespondePayload”和“timestamp_”,但是,我不知道它们是不是“两个组”在异常的消息原因中引用。

提前致谢...

解决方法

看起来,虽然背书节点都成功背书了您的交易提案,但这些节点的响应并非完全相同。

有几件事情可能会有所不同,包括读/写集或从事务函数调用返回的值。可能出现差异的原因有多种,包括不确定的交易功能实现、节点之间的交易功能行为不同或不同节点的账本状态不同。

要找出导致此特定失败的原因,您可能需要查看对等响应以确定它们有何不同。您应该从您的交易提交调用中得到一个 ContractException,并且这应该允许您通过调用 e.getProposalResponses() 来访问提案响应:

https://hyperledger.github.io/fabric-gateway-java/release-2.2/org/hyperledger/fabric/gateway/ContractException.html#getProposalResponses()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。