在Corda中,验证交易时出现TransactionResolutionException

时间:2018-08-17 16:19:13

标签: corda

在Corda流程中,我正在接收并验证交易,如下所示:

@InitiatedBy(Initiator::class)
class Responder(val counterpartySession: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        val stx = counterpartySession.receive<SignedTransaction>().unwrap { it }
        stx.verify(serviceHub, false)
    }
}

但是,这引发了以下异常:

  

net.corda.core.contracts.TransactionResolutionException:事务   的解析失败   3D90346DD7F7397479312EF4DD5A4741F4CA31C2070BC4F8A0588974B1CD1523

TransactionResolutionException的起因是什么,如何解决?

2 个答案:

答案 0 :(得分:1)

当节点验证交易时,它不仅验证交易本身。它还会验证整个交易链。 TransactionResolutionException表示交易链中的一项或多项交易丢失,无法验证。

为避免这种情况,您应该使用SendTransactionFlow发送交易,并使用ReceiveTransactionFlow接收交易。该流对有两件事:

  • 它发送有问题的交易
  • 它允许接收节点从对方那里下载他们正在接收的交易链中所有丢失的交易

答案 1 :(得分:0)

在该节点中,您正在验证是否没有TransactionState所传递的输入也引用。

使用SendSendAndReceive传递用于签名的交易是不正确的。 最好使用流SendTransactionFlowReceiveTransactionFlow,它们将下载这些输入引用的状态。

如果您无法按照上述流程的要求发送SignedTransaction(例如,由于您正在发送FilteredTransaction),则可以使用FlowSession.send()方法发送,但是该所有者是输入将以SendStateAndRefFlow流进行响应,请求者可以收到ReceiveStateAndRefFlow并将其添加到原始事务中。

这将允许在所有节点中具有输入的引用状态,从而使您可以验证事务。