Получение двух входных состояний
Предположим, что вы запускаете поток на UserA
.Вы можете получить состояние ввода для UserA
, запросив хранилище.Например:
val queryCriteria = QueryCriteria.LinearStateQueryCriteria(
null, listOf(linearId), UNCONSUMED, null)
val inputStateAndRef = serviceHub.vaultService.queryBy<IOUState>(queryCriteria).states.singleOrNull()
?: throw FlowException("IOU with ID $linearId not found.")
Получение состояния ввода для UserB
является более сложным, поскольку оно хранится в хранилище UserB
, которое UserA
не может запрашивать напрямую.Вам нужно написать поток ответчика, в котором UserB
получает состояние из своего хранилища, а затем отправляет его инициатору, который строит транзакцию.Например:
@InitiatingFlow
class Initiator(val counterparty: Party, val linearId: UniqueIdentifier) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
val flowSession = initiateFlow(counterparty)
flowSession.send(linearId)
val inputStateAndRef = flowSession.receive<StateAndRef<IOUState>>().unwrap { it }
}
}
@InitiatedBy(Initiator::class)
class Acceptor(val flowSession: FlowSession) : FlowLogic<Unit>() {
@Suspendable
override fun call() {
val linearId = flowSession.receive<UniqueIdentifier>().unwrap { it }
val queryCriteria = QueryCriteria.LinearStateQueryCriteria(
null, listOf(linearId), Vault.StateStatus.UNCONSUMED, null)
val inputStateAndRef = serviceHub.vaultService.queryBy<IOUState>(queryCriteria).states.singleOrNull()
?: throw FlowException("IOU with ID $linearId not found.")
flowSession.send(inputStateAndRef)
}
}
Добавление двух состояний вывода
Вы можете добавить два состояния вывода в транзакцию, просто дважды вызвав TransactionBuilder.addOutputState
:
transactionBuilder.addOutputState(new TemplateState(), TemplateContract.ID);
transactionBuilder.addOutputState(new TemplateState(), TemplateContract.ID);