Corda帐户-帐户与主机节点之间的交易

时间:2020-03-31 07:49:37

标签: java corda

请考虑以下情况:他们是PartyA,并且在PartyA中创建了account1。现在,我们必须在account1和PartyA之间发起交易。是否可以通过帐户启动交易流程,并且接收方是主机节点?如果是,那么任何人都可以建议明智的编码步骤。如果有示例示例,请告诉我。

1 个答案:

答案 0 :(得分:0)

  1. 流总是由节点(即Party)而不是帐户开始。
  2. 但是,节点可以使用帐户的PublicKey代表帐户签署交易;这就是您要寻找的。
  3. 您的示例简化了此任务,因为该帐户托管在启动流程的同一节点上;因此您不需要响应者流程。

所以事情看起来像这样:

  1. PartyA启动您的流程。
  2. 我假设您处于一种状态,其中一个字段是帐户;让我们假设它是:
MyState(myAccount: PublicKey)  
  1. 您的流将以UUID中的myAccount作为输入参数:
class MyFlow(val myAccountId: UUID, ...
  1. 您将首先查询保管库以使用其UUID提取帐户:
val myAccountInfo = accountService.accountInfo(myAccountId)
                ?: throw IllegalStateException("Can't find account with Id $myAccountId")
  1. 请求该帐户的新密钥:
val myAccountKey = subFlow(RequestKeyForAccount(myAccountInfo.state.data)).owningKey
  1. 创建您的状态:
val myState = MyState(myAccountKey)
  1. 现在最重要的部分是,创建状态的命令将需要2个签名:PartyA(这是启动流程的节点,即ourIdentity)和{ {1}}:
myAccountInfo
  1. 我正在跳过一些步骤,但是当需要签署交易时;您将使用密钥val command = Command(MyState.Commands.Create(), listOf(ourIdentity.owningKey, myAccountKey)) (即流程的发起者PartyA)和密钥ourIdentity进行签名:
myAccountInfo

您可以查看使用帐户库实现的IOU示例;同样,在您的情况下,您不需要响应者流程;他们创建了一个响应者流程,以防val fullySignedTx = serviceHub.signInitialTransaction(txBuilder, listOf(ourIdentity.owningKey, myAccountKey)) 帐户托管在与发起节点不同的节点上。
参见示例here