Hyperledger Fabric — Java-SDK — Future завершен исключительно: sendTransaction

Я запускаю частную сеть 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 отпечатка, которые я сделал, в ответ на предложение, полученный в исключении, и комментарий после него.

Ответы предложений-1

Ответы предложений-2

Ответы на предложения-3

Итак, на первом рисунке я вижу, что 3 ответа на предложение были получены при исключении, а в сообщении о причине исключения говорится: Ответы на предложение имеют 2 несогласованные группы с 0, которые недействительны. Ожидается, что все будет согласовано и ни одно из них не будет недействительным.

На картинках 2/3 представлено содержимое этих ответов, и я заметил, что есть 2 поля, сохраняющие нулевое значение, а именно ProposalRespondePayload и timestamp_, однако я не знаю, являются ли эти две группы упомянутыми в сообщении причиной сообщения исключение.

Заранее спасибо...


person devops2.0    schedule 24.02.2021    source источник


Ответы (1)


Кажется, что, хотя все поддерживающие партнеры успешно одобрили ваше предложение по транзакции, ответы этих партнеров не были идентичными байт в байт.

Есть несколько вещей, которые могут отличаться, включая наборы для чтения/записи или значение, возвращаемое при вызове функции транзакции. Существует несколько причин, по которым могут возникать различия, включая недетерминированную реализацию функций транзакций, различное поведение функций транзакций между одноранговыми узлами или разное состояние реестра на разных одноранговых узлах.

Чтобы выяснить, что вызвало этот конкретный сбой, вам, вероятно, нужно посмотреть на ответы коллег, чтобы определить, чем они отличаются. Вы должны получить ContractException, возвращаемый вызовом отправки транзакции, и это должно позволить вам получить доступ к ответам предложения, вызвав e.getProposalResponses():

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

person bestbeforetoday    schedule 25.02.2021