Я использую release-v1 Corda.
Мое приложение имеет три узла - A, B и C. Ниже приведены потоки, определенные в приложении -
Поток 1: A отправляет запрос на торговлю B и C
Поток 2: B одобряет запрос на торговлю, сам подписывает его, получает подпись от A и закрывает сделку.
Поток 1 работает нормально.При выполнении рабочего процесса 2 я получаю ошибку net.corda.core.flows.UnexpectedFlowEndException.
Журналы узла A показывают следующие строки:
net.corda.core.flows.UnexpectedFlowEndException: Counterparty flow on C=GB,L=London,O=NodeA had an internal error and has terminated
at net.corda.node.services.statemachine.FlowStateMachineImpl.erroredEnd(FlowStateMachineImpl.kt:446)
at net.corda.node.services.statemachine.FlowStateMachineImpl.confirmReceiveType(FlowStateMachineImpl.kt:429)
Я ссылался на WorkflowTransactionBuildTutorial.kt для потоков - (https://github.com/corda/corda/blob/release-V1/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt)
1. IЯ выполняю следующий код для рабочего процесса 1
val tradeProposal = IOUContract.State(OU( IouId, IouCurrency, IouAmount), serviceHub.myInfo.legalIdentities.first(), nodeB, nodeC).contract.IOUContract"
val IOU_CONTRACT_ID = "net.corda.bgc.contract.IOUContract"
val tx = TransactionBuilder(notary).withItems(
StateAndContract(tradeProposal, IOU_CONTRACT_ID),
Command(IOUContract.Commands.Issue(),listOf(tradeProposal.sender.owningKey)))
.addAttachment(secHash)
tx.setTimeWindow(serviceHub.clock.instant(), 180.seconds)
val signedTx = serviceHub.signInitialTransaction(tx)
subFlow(FinalityFlow(signedTx, setOf(serviceHub.myInfo.legalIdentities.first(), nodeB, nodeC)))
return signedTx.tx.outRef<IOUContract.State>(0)
Этот код работает нормально. Оба узла B и C получают запрос ввода-вывода от узла A со статусом «NEW».
2. Я выполняю следующий код для рабочего процесса 2
Код для отправки подписанной транзакции отправителю и ожидаю
их подписи для подтверждения
val tx = TransactionBuilder(notary).
withItems(
latestRecord,
StateAndContract(newState, IOU_CONTRACT_ID),
Command(IOUContract.Commands.Completed(), listOf(serviceHub.myInfo.legalIdentities.first().owningKey, latestRecord.state.data.nodeA.owningKey)))
tx.setTimeWindow(serviceHub.clock.instant(), 600.seconds)
val selfSignedTx = serviceHub.signInitialTransaction(tx)
val session = initiateFlow(newState.nodeA)
val allPartySignedTx = session.sendAndReceive<TransactionSignature>(selfSignedTx).unwrap {
val agreedTx = selfSignedTx + it
agreedTx.verifySignaturesExcept(notary.owningKey)
agreedTx.tx.toLedgerTransaction(serviceHub).verify()
agreedTx
}
subFlow(FinalityFlow(allPartySignedTx, setOf(newState.nodeA, newState.nodeB, newState.nodeC)))
return allPartySignedTx.tx.outRef(0)
Поток для получения окончательного решения по предложению
val completeTx = receive<SignedTransaction>(source).unwrap {
it.verifySignaturesExcept(ourIdentity.owningKey, it.tx.notary!!.owningKey)
val ltx = it.toLedgerTransaction(serviceHub, false)
ltx.verify()
val state = ltx.outRef<IOUContract.State>(0)
}
it
val ourSignature = serviceHub.createSignature(completeTx)
send(ourSignature)
Однако приведенный выше код завершается ошибкой и выдается ошибка net.corda.core.flows.UnexpectedFlowEndException.
Пожалуйста, кто-нибудь может мне помочь исправить приведенный выше код ИЛИ перенаправить меня к примеру, который соответствует требуемым рабочим процессам?