首页 > 解决方案 > 在 Corda 中,不是参与者的节点如何将状态存储在其保险库中?

问题描述

在 Corda 中,节点仅存储它们是其中之一的participants状态(除非状态是OwnableState,在这种情况下,它们仅在它们是 时才存储它owner)。

如何覆盖此行为并让节点存储他们不是参与者的状态?

标签: corda

解决方案


participants节点可以选择记录它们收到的交易中的每个状态,而不是选择只记录它们是其中之一的状态。我在下面写了一个例子。您还可以在此处查看实现此模式的 Observable States CorDapp 。

发送交易

首先,拥有包含相关状态的交易的节点需要将交易发送给想要记录它但不是的交易对手participants。下面是我们如何定义 aBrodcastTransactionFlow来做到这一点:

@InitiatingFlow
class BroadcastTransaction(
    val stx: SignedTransaction, 
    val counterparty: Party) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val session = initiateFlow(counterparty)
        subFlow(SendTransactionFlow(session, stx))
    }
}

接收交易并存储所有状态

交易对手必须注册一个记录交易中所有状态的响应流。下面是我们如何定义 aRecordTransactionAsObserver来做到这一点:

@InitiatedBy(BroadcastTransaction::class)
class RecordTransactionAsObserver(val otherSession: FlowSession) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val flow = ReceiveTransactionFlow(
                otherSideSession = otherSession,
                checkSufficientSignatures = true,
                // We are recording all the states, 
                // and not just the ones where we are participants.
                statesToRecord = StatesToRecord.ALL_VISIBLE
        )

        subFlow(flow)
    }
}

推荐阅读