我使用的是Corda的版本-v1。
我的应用程序有三个节点- 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.我正在为工作流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都接收状态为“NEW”的nodeA的IOU请求。
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。
发布于 2018-12-06 14:08:46
谢谢。
在审批流程中,将“发送和接收”功能替换为“收件信号流”功能。现在,启动程序流和批准流都在工作。
发布于 2018-12-05 09:49:54
当您得到表单的例外情况时:
net.corda.core.flows.UnexpectedFlowEndException:
Counterparty flow on C=GB,L=London,O=NodeA had an internal error and has terminated这意味着对手节点(本例中为NodeA)遇到了异常。您应该检查对手节点的日志。每个节点在/logs文件夹中都有日志。
https://stackoverflow.com/questions/53561251
复制相似问题