net.corda.core.flows.UnexpectedFlowEndException - Поток контрагента на C = ГБ, L = Лондон, O = NodeA имел внутреннюю ошибку и прервался - PullRequest
0 голосов
/ 30 ноября 2018

Я использую 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.

Пожалуйста, кто-нибудь может мне помочь исправить приведенный выше код ИЛИ перенаправить меня к примеру, который соответствует требуемым рабочим процессам?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Спасибо.

Заменена функция "sendandreceive" на функцию "collectsignaturesflow" в потоке утверждения.Теперь потоки инициатора и утверждения работают.

Ссылка на ссылку - https://github.com/corda/cordapp-example/blob/release-V3/kotlin-source/src/main/kotlin/com/example/flow/ExampleFlow.kt.

0 голосов
/ 05 декабря 2018

Когда вы получаете исключение в форме:

net.corda.core.flows.UnexpectedFlowEndException: 
    Counterparty flow on C=GB,L=London,O=NodeA had an internal error and has terminated

Это означает, что узел контрагента (в данном случае NodeA) обнаружил исключение.Вы должны проверить журналы узла контрагента.Каждый узел имеет журналы в папке /logs.

...