Как расширить ситуацию с IOU для изменения состояний обоих пользователей - PullRequest
0 голосов
/ 02 декабря 2018

Сначала извинитесь, что я все еще учусь на Корде.Прочитал пример Hello World о ситуации с IOU.Насколько я понимаю, текущая выборка охватывает только транзакцию векселя, но не включает изменение суммы как у кредитора, так и заемщика после векселя.Если я хочу сделать это, как я могу изменить контракт и детали потока?

До IOU

Состояние пользователя A: 100 единиц

Состояние пользователя B: 0 единиц

После IOU 10 единиц

Состояниепользователя A: 90 единиц

состояние пользователя B: 10 единиц

Насколько я знаю, должно быть два входных состояния и два выходных состояния для ограничений формы контракта.Но как я могу создать два новых состояния на части потока, так как большинство примеров имеют только одно выходное состояние?

Большое спасибо за вашу помощь и ценим больше, если вы можете дать мне несколько советов в java, но не в формате kotlin.

1 Ответ

0 голосов
/ 08 декабря 2018

Получение двух входных состояний

Предположим, что вы запускаете поток на 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);
...