Как проверить функцию работает в Cordapp - PullRequest
0 голосов
/ 27 апреля 2020

Я разработал один пример Cordapp, в котором я создаю экземпляр объекта состояния внутри InitiatorFlow.

BookingState outputState = new BookingState(customerName, customerAge,checkInDate,checkOutDate,roomType,roomRate,bookingAmount,getOurIdentity(),lemonTree);
  1. Будет ли этот оператор автоматически вызывать метод verify, представленный внутри класса Contract? или мне нужно вызывать метод verify внутри класса Flow?
  2. Нужен ли TransactionBuilder метод проверки?
  3. Будет ли приведенный ниже код получать подпись от контрагента? Я спрашиваю, потому что в большинстве случаев я видел этот код для сбора подписи контрагента. (SignedTransaction stx = subFlow(new CollectSignaturesFlow(ptx, session));)

    private final ProgressTracker.Step GATHERING_SIGNATURE = new ProgressTracker.Step("Gathering the counterparty's signature"){
        @Override
        public ProgressTracker childProgressTracker() {
            return CollectSignaturesFlow.Companion.tracker();
        }
    }
    

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Отвечая на ваш вопрос в том же порядке:

  1. Нет, инициатор потока должен явно вызвать функцию verify(), прежде чем подписать ее локально.
  2. То же, что и выше.
  3. Код, которым вы поделились, не собирает подписи; он только определяет этот шаг в трекере прогресса, поэтому выводит его на оболочку вашего узла при запуске потока. Однако вызов CollectSignaturesFlow будет send транзакцией для всех предоставленных контрагентов FlowSession, и receive отправит обратно свои подписи, когда они вызовут SignTransactionFlow в потоке ответчика. Смотрите пример вызова CollecSignaturesFlow здесь .

Просмотр вашего кода:

  1. Если вы звоните CollectSignaturesFlow в инициаторе, вы должны позвоните SignTransactionFlow в ответчик; в противном случае ваш поток инициатора будет зависать, потому что он имеет receive (который вызывается внутри CollectSignaturesFlow), и что receive будет ждать, пока поток респондента что-то send будет, и в этом случае респондент должен вызвать SignTransactionFlow, который внутри имеет send для отправки подписанной транзакции контрагентом. См. Пример IOU здесь .
  2. Причина, по которой ваш поток все еще проверяет транзакцию и выдает ошибку, когда вы предоставляете ошибочную, заключается в том, что вы вызываете FinalityFlow внутри вашего инициатора, который неявно проверяет транзакцию перед ее нотариальным заверением (см. здесь ).

Вы можете спросить, зачем мне звонить transactionBuilder.verify(), если это уже делает нотариус? Ну, зачем подписывать транзакцию и отправлять ее другим сторонам, не проверив сначала? Вы потребляете ресурсы и отправляете сообщения между узлами (для отправки и получения подписанных транзакций); вместо этого сначала проверьте, является ли транзакция действительной или нет, затем подпишите ее локально и отправьте другим партнерам. Кстати, контрагенты в потоке респондентов также неявно запускают метод verify(), когда получают транзакцию через вызов SignTransactionFlow (см. здесь ).

0 голосов
/ 27 апреля 2020
Below is a sample code snippet to answer your questions.


// 1. This will only create BookingState instance
BookingState outputState = new BookingState(customerName, customerAge,checkInDate,checkOutDate,roomType,roomRate,bookingAmount,getOurIdentity(),lemonTree);

TransactionBuilder transactionBuilder = new TransactionBuilder(notary);
transactionBuilder.addOutputState(outputState);
transactionBuilder.addCommand(new BookingContract.Commands.Issue() ,
ImmutableList.of(issuer.getOwningKey(),owner.getOwningKey()));

//2. You should call the verify method from transactionbuilder class which will //run the verify method of contract class.
transactionBuilder.verify(getServiceHub());

//3. Below code is used to collect signatures from the counterparty
FlowSession session = initiateFlow(owner);

SignedTransaction fullySignedTransaction = subFlow(new CollectSignaturesFlow(signedTransaction, singletonList(session)));
...