Динамическое добавление участников к состоянию в Corda 4.0 - PullRequest
2 голосов
/ 18 июня 2019

Можно ли динамически добавлять участников в состояние внутри потока, чтобы состояние сохранялось в хранилище ThirdParty без использования StatesToRecord.ALL_VISIBLE в ReceiveFinalityFlow?

Мы сделали то же самое в Corda 2.0, она не работает в Corda 4.0.

Разве она не поддерживается в Corda 3.2 и далее?Я вижу, что @KeepForDJVM добавлено в ContractState.

Я пытался динамически добавлять участников в IOUState как [iouState.participants.add(thirdParty)] после того, как участники в IOUState обновляются как mutableList как [override val participants: MutableList<AbstractParty> = mutableListOf(lender, borrower)], так что IOUState также будет храниться в хранилище ThirdParty.,Я передаю сеансы потока как заемщика, так и третьей стороны в CollectSigntaureFlow и FinalityFlow.IOUFlowTests [flow records the correct IOU in both parties' vaults] не удалось с iouState не найден в хранилище thridParty.

IOUState:
@BelongsToContract(IOUContract::class)
data class IOUState(val value: Int,
                    val lender: Party,
                    val borrower: Party,
                    val thirdParty: Party,
                    override val linearId: UniqueIdentifier = UniqueIdentifier()):
        LinearState, QueryableState {
    /** The public keys of the involved parties. */
    //override val participants: MutableList<AbstractParty> get() = mutableListOf(lender, borrower)
    override val participants = mutableListOf(lender, borrower)


ExampleFlow:
var iouState = IOUState(iouValue, serviceHub.myInfo.legalIdentities.first(), otherParty, thirdParty)

iouState.participants.add(thirdParty)

val txCommand = Command(IOUContract.Commands.Create(), iouState.participants.map { it.owningKey })

val counterparties = iouState.participants.map { it as Party }.filter { it.owningKey != ourIdentity.owningKey }.toSet()

counterparties.forEach { p -> flowSessions.add(initiateFlow(p))}

val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, flowSessions, GATHERING_SIGS.childProgressTracker()))

            // Stage 5.
            progressTracker.currentStep = FINALISING_TRANSACTION
            // Notarise and record the transaction in both parties' vaults.
            return subFlow(FinalityFlow(fullySignedTx, flowSessions, FINALISING_TRANSACTION.childProgressTracker()))

Как Заемщик, так и ThirdParty получают поток и подписывают транзакцию, но не видят ThirdParty в списке участников и не сохраняются в хранилище ThirdParty.

Я ожидаю, что ThirdParty должна быть в списке участникови IOUState также должен храниться в ThirdParty Vault.

1 Ответ

0 голосов
/ 18 июня 2019

В Корде государства неизменны. Это означает, что вы не можете динамически добавлять участников в данное состояние в теле потока. Однако существуют и другие способы информирования новой третьей стороны о государстве!

Есть два способа достижения ваших целей:

  1. Создание нового вывода IOUState tx с обновленным списком участников.

В теле потока вы должны создать новое IOUState с обновленным списком участников. Вам придется обновить IOUState, чтобы participants было значением в первичной структуре. Тогда вы можете использовать вспомогательный метод, подобный этому, чтобы добавить участника:

fun addParticipant(partyToAdd: Party): IOUState = copy(participants + partyToAdd)

Вот важная часть: вы должны затем включить старый IOUState в качестве входных данных для этой транзакции и новый IOUState в качестве выходных данных. Corda основана на модели UTXO - единственный способ обновить состояние - пометить его как историю (использовать его в качестве входных данных), а затем сохранить обновленную версию в книгу.

Примечание: как участник, информированная сторона теперь сможет предлагать изменения к этому IOUState - они должны быть учтены в контракте Corda.

  1. Используйте SendStateAndRefFlow (вероятно, лучшее решение для вашей проблемы)

SendStateAndRefFlow (как указано в его имени) отправит состояние и связанный с ним stateRef принимающему узлу. Контрагент (принимающий узел) должен использовать ReceiveStateAndRefFlow в правильной точке разговора потока.

subFlow(new SendStateAndRefFlow(counterpartySession, dummyStates));

Оба эти метода заставят принимающий узел проверять зависимости состояния (все входы и транзакции, которые составляют его историю)

...