如何解决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 个打印件,并在其后添加评论。
因此,在第一张图片中,我可以看到在异常处收到了 3 个提案响应,并且异常原因消息说: “提案回复有 2 个不一致的组,其中 0 个无效。预计所有组都一致,没有一个无效。”
在图片中,2/3 表示这些响应的内容,我注意到有 2 个字段保存空值,即“ProposalRespondePayload”和“timestamp_”,但是,我不知道它们是不是“两个组”在异常的消息原因中引用。
提前致谢...
解决方法
看起来,虽然背书节点都成功背书了您的交易提案,但这些节点的响应并非完全相同。
有几件事情可能会有所不同,包括读/写集或从事务函数调用返回的值。可能出现差异的原因有多种,包括不确定的交易功能实现、节点之间的交易功能行为不同或不同节点的账本状态不同。
要找出导致此特定失败的原因,您可能需要查看对等响应以确定它们有何不同。您应该从您的交易提交调用中得到一个 ContractException
,并且这应该允许您通过调用 e.getProposalResponses()
来访问提案响应:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。