在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
的起因是什么,如何解决?
答案 0 :(得分:1)
当节点验证交易时,它不仅验证交易本身。它还会验证整个交易链。 TransactionResolutionException
表示交易链中的一项或多项交易丢失,无法验证。
为避免这种情况,您应该使用SendTransactionFlow
发送交易,并使用ReceiveTransactionFlow
接收交易。该流对有两件事:
答案 1 :(得分:0)
在该节点中,您正在验证是否没有TransactionState
所传递的输入也引用。
使用Send
或SendAndReceive
传递用于签名的交易是不正确的。
最好使用流SendTransactionFlow
和ReceiveTransactionFlow
,它们将下载这些输入引用的状态。
如果您无法按照上述流程的要求发送SignedTransaction
(例如,由于您正在发送FilteredTransaction
),则可以使用FlowSession.send()
方法发送,但是该所有者是输入将以SendStateAndRefFlow
流进行响应,请求者可以收到ReceiveStateAndRefFlow
并将其添加到原始事务中。
这将允许在所有节点中具有输入的引用状态,从而使您可以验证事务。