【问题标题】:In Corda, TransactionResolutionException when verifying a transaction在 Corda 中,验证事务时出现 Transaction ResolutionException
【发布时间】:2020-04-01 04:39:51
【问题描述】:

在 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 的原因是什么,我该如何解决?

【问题讨论】:

    标签: corda


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      在您验证的节点中,您没有传递的输入也引用的TransactionState

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

      如果您无法按照上述流程要求发送SignedTransaction(例如,您正在发送FilteredTransaction),您可以使用FlowSession.send() 方法发送它,但输入的所有者会使用@987654329 进行响应@flow,请求者可以收到 ReceiveStateAndRefFlow 来添加原始交易的输入。

      这将允许在所有节点中拥有输入的引用状态,从而允许您验证交易。

      【讨论】:

        猜你喜欢
        • 2019-11-11
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        相关资源
        最近更新 更多