Аккаунты Corda - транзакция между аккаунтом и хост-узлом - PullRequest
0 голосов
/ 31 марта 2020

Рассмотрим сценарий, в котором их является PartyA, а account1 создается в PartyA. Теперь мы должны инициировать транзакцию между account1 и PartyA. Возможно ли, чтобы поток транзакций был инициирован учетной записью, а принимающая сторона является хост-узлом? Если да, может кто-нибудь, пожалуйста, предложите, какие будут предприняты необходимые шаги по кодированию. Если есть пример, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 31 марта 2020
  1. Поток всегда запускается узлом (т.е. стороной), а не учетной записью.
  2. Но узел может подписать транзакцию от имени учетной записи, используя PublicKey учетной записи; и это то, что вы ищете.
  3. Ваш пример упрощает эту задачу, поскольку учетная запись размещается на том же узле, который запускает поток; так что вам не нужен поток ответчика.

Итак, все будет выглядеть так:

  1. PartyA инициирует ваш поток.
  2. Я предполагаю, что у вас есть состояние, в котором одно из полей является учетной записью; давайте предположим, что это:
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 была размещена на другом узле, чем инициирующий узел.
См. пример здесь .

...