В Corda, как узел, который не является участником, может хранить состояние в своем хранилище? - PullRequest
0 голосов
/ 05 июля 2018

В Corda узлы хранят только состояния, для которых они являются одним из participants (если только состояние не является OwnableState, и в этом случае они сохраняют его, только если они являются owner).

Как я могу переопределить это поведение и заставить узел хранить состояние, для которого они не являются участниками?

1 Ответ

0 голосов
/ 05 июля 2018

Вместо выбора записи только состояний, в которых они являются одним из participants, узлы могут выбрать запись каждого состояния в транзакции, которую они получают. Я написал пример ниже. Вы также можете взглянуть на CorDapp Observable States, реализующий этот шаблон здесь .

Отправка транзакции

Во-первых, узел, у которого есть транзакция, которая содержит рассматриваемые состояния, должен отправить транзакцию контрагенту (ам), который хочет записать ее, но не является 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)
    }
}
...