在Corda中,不是参与者的节点如何将状态存储在其保管库中?

时间:2018-07-05 11:42:08

标签: corda

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

如何覆盖此行为并获得一个节点来存储他们不是参与者的状态?

1 个答案:

答案 0 :(得分:3)

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

发送交易

首先,拥有包含所讨论状态的交易的节点需要将交易发送给要记录交易但不是participants的交易对手。这是我们定义BrodcastTransactionFlow的方式:

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

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

接收交易并存储所有状态

交易对手将必须注册一个记录交易中所有状态的响应者流程。这是我们定义RecordTransactionAsObserver的方式:

@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)
    }
}