在Corda中,节点仅存储它们是participants
之一的状态(除非状态是OwnableState
,在这种情况下,它们仅在它们是owner
时存储它)。
如何覆盖此行为并获得一个节点来存储他们不是参与者的状态?
答案 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)
}
}