【问题标题】:Hyperledger Fabric - Java-SDK - Future completed exceptionally: sendTransactionHyperledger Fabric - Java-SDK - 未来异常完成:sendTransaction
【发布时间】:2021-02-24 12:12:40
【问题描述】:

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

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

错误 196664 --- [线程 4] org.hyperledger.fabric.sdk.Channel : 未来异常完成: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) 〜[类/: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_”,但是我不知道这是否是“两个组”在异常的消息原因中引用。

提前谢谢...

【问题讨论】:

    标签: java exception hyperledger-fabric chaincode


    【解决方案1】:

    看起来,虽然背书节点都成功地背书了你的交易提案,但这些节点的响应并不是每个字节都相同。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      相关资源
      最近更新 更多