Корда: Создать и использовать одно и то же состояние в одном потоке? - PullRequest
0 голосов
/ 05 октября 2018

возможно ли создать и использовать одно и то же состояние корды в одном потоке или создать и использовать его в разных подпотоках?Я получаю следующую ошибку: Caused by: net.corda.core.flows.NotaryException: Unable to notarise transactionBEDE8C3F8F2D7A646A9F7D1948DAF77CDAFC37F3B086E09FC766F0D412F02690: One or more input states have been used in another transaction

1 Ответ

0 голосов
/ 08 октября 2018

Да, вы можете создавать и использовать одно и то же состояние Corda в одном потоке.

Необходимо выполнить два шага:

  1. Создать первую транзакцию, выдающую новое состояние
  2. Создание второй транзакции, использующей новое состояние

Обратите внимание, что если вы создадите вторую транзакцию и заставите контрагента вызвать ResolveTransactionFlow перед завершением первой транзакции, это будетвызвать TransactionResolutionException, потому что у вас еще нет первой транзакции в вашем хранилище для распространения.Это может произойти, например, при запуске CollectSignaturesFlow.

Вот пример построения двух транзакций в одном потоке:

@InitiatingFlow
@StartableByRPC
class TwoTransactionsFlow(val otherParty: Party) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        val otherPartySessions = listOf(initiateFlow(otherParty))

        val transactionBuilderOne = TransactionBuilder()
        // TODO: Add notary and transaction components.
        val partSignedTransactionOne = serviceHub.signInitialTransaction(transactionBuilderOne)
        val fullySignedTransactionOne = subFlow(CollectSignaturesFlow(partSignedTransactionOne, otherPartySessions))
        val notarisedTransactionOne = subFlow(FinalityFlow(fullySignedTransactionOne))

        val transactionOneFirstOutputRef = StateRef(notarisedTransactionOne.id, 0)
        val transactionOneFirstOutput = serviceHub.toStateAndRef<ContractState>(transactionOneFirstOutputRef)

        val transactionBuilderTwo = TransactionBuilder()
                .addInputState(transactionOneFirstOutput)
        // TODO: Add notary and other transaction components.
        val partSignedTransactionTwo = serviceHub.signInitialTransaction(transactionBuilderTwo)
        val fullySignedTransactionTwo = subFlow(CollectSignaturesFlow(partSignedTransactionTwo, otherPartySessions))
        subFlow(FinalityFlow(fullySignedTransactionTwo))
    }
}
...