Я запускаю частную сеть HL Fabric и отправляю транзакции в бухгалтерскую книгу из приложения Java, используя Fabric-Java-Sdk.
Иногда, например, в 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) ~[классы/:нет] в com.apidemoblockchain.RepositoryDao.Implementations.PairTrustDataAccessRepository.run(PairTrustDataAccessRepository.java:79) ~[классы/:нет] в java.base/java.lang.Thread.run(Thread. ява:834) ~[на:на]
В то время как мой метод отправки выглядит следующим образом:
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 канала, по одному для каждого типа данных цепного кода, чтобы поддерживать чистоту.
Я думаю, что ошибка, исходящая от Канала, не имеет смысла, потому что я использую Контракт для ее отправки...
Как будто я открываю шлюз, а затем держу его открытым для непрерывной отправки 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 и проанализировать журналы. Тем не менее, я не совсем понимаю, где может быть ошибка и, следовательно, как ее исправить.
Я добавлю 3 отпечатка, которые я сделал, в ответ на предложение, полученный в исключении, и комментарий после него.
Итак, на первом рисунке я вижу, что 3 ответа на предложение были получены при исключении, а в сообщении о причине исключения говорится: Ответы на предложение имеют 2 несогласованные группы с 0, которые недействительны. Ожидается, что все будет согласовано и ни одно из них не будет недействительным.
На картинках 2/3 представлено содержимое этих ответов, и я заметил, что есть 2 поля, сохраняющие нулевое значение, а именно ProposalRespondePayload и timestamp_, однако я не знаю, являются ли эти две группы упомянутыми в сообщении причиной сообщения исключение.
Заранее спасибо...