代码之家  ›  专栏  ›  技术社区  ›  Joel

在Corda中,当验证一个事务时的一种事务解析异常

  •  1
  • Joel  · 技术社区  · 6 年前

    在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公司.合同.交易解决方案例外:事务 解析失败 3D90346DD7F7397479312EF4DD5A4741F4CA31C2070BC4F8A0588974B1CD1523

    原因是什么 TransactionResolutionException ,我如何修复它?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Joel    6 年前

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

    为了避免这种情况,您应该使用 SendTransactionFlow ,并使用接收事务 ReceiveTransactionFlow . 这个流对做两件事:

    • 它发送有问题的事务
    • 它允许接收节点从对方下载他们正在接收的交易链中丢失的所有交易
        2
  •  0
  •   Rodrigo    4 年前

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

    使用传递事务进行签名是不正确的 Send SendAndReceive . 最好使用流 SendTransactionFlow ReceiveTransactionFlow 它将下载这些输入引用的状态。

    如果你不能发送 SignedTransaction 如上所述,流需要(例如,因为您正在发送 FilteredTransaction ),你可以把它和 FlowSession.send() 方法,但输入的所有者以 SendStateAndRefFlow 流,请求者可以接收它 ReceiveStateAndRefFlow 在原始事务上添加输入。

    这将允许所有节点中输入的引用状态,允许您验证事务。