- Поток всегда запускается узлом (т.е. стороной), а не учетной записью.
- Но узел может подписать транзакцию от имени учетной записи, используя
PublicKey
учетной записи; и это то, что вы ищете. - Ваш пример упрощает эту задачу, поскольку учетная запись размещается на том же узле, который запускает поток; так что вам не нужен поток ответчика.
Итак, все будет выглядеть так:
PartyA
инициирует ваш поток. - Я предполагаю, что у вас есть состояние, в котором одно из полей является учетной записью; давайте предположим, что это:
MyState(myAccount: PublicKey)
Ваш поток будет иметь в качестве входного параметра
UUID
из
myAccount
:
class MyFlow(val myAccountId: UUID, ...
Сначала вы запросите хранилище, чтобы получить учетную запись, используя ее UUID:
val myAccountInfo = accountService.accountInfo(myAccountId)
?: throw IllegalStateException("Can't find account with Id $myAccountId")
Запрос нового ключа для учетной записи:
val myAccountKey = subFlow(RequestKeyForAccount(myAccountInfo.state.data)).owningKey
Создайте свой штат:
val myState = MyState(myAccountKey)
Теперь самая важная часть, команда, которая создает ваше состояние, потребует 2 подписи:
PartyA
(это узел, который инициировал поток, т.е.
ourIdentity
), и подпись
myAccountInfo
:
val command = Command(MyState.Commands.Create(),
listOf(ourIdentity.owningKey, myAccountKey))
Я пропускаю некоторые шаги, но когда придет время подписывать транзакцию; вы подпишите его ключом
PartyA
(то есть инициатором потока, который является
ourIdentity
) и ключом
myAccountInfo
:
val fullySignedTx = serviceHub.signInitialTransaction(txBuilder,
listOf(ourIdentity.owningKey, myAccountKey))
. Вы можете посмотреть на пример IOU, который реализован с использованием Accounts Library ; опять же, в вашем случае вам не нужен поток респондента; они создали поток респондента в случае, если учетная запись borrower
была размещена на другом узле, чем инициирующий узел.
См. пример здесь .