我可以在一个节点上拥有一个帐户并使用该帐户进行交易,而不会将状态保留在帐户节点上吗?

时间:2020-04-15 13:44:42

标签: corda

我正在使用Corda帐户。 在我的场景中,该帐户在节点M上创建并与节点D共享。 节点D运行状态创建流程,其中帐户是参与者。 通过对解决方案建模,事务必须在节点D上注册,但不能在节点M上注册。 问题在于,当使用属于节点M的帐户时,需要节点M的会话。当我不对响应程序流执行ReceiveFinalityFlow时,会生成UnexpectedFlowEndException异常。

我需要能够通过accountId进行电子仓库查询。

问题是,我可以在一个节点上拥有一个帐户并使用该帐户进行交易,而不会将状态保留在帐户节点上吗?

1 个答案:

答案 0 :(得分:1)

    如果您没有为每个参与者提供FinalityFlow(请参见here),并且您的帐户是参与者,则
  1. FlowSession会引发错误。因此您需要为节点FlowSession提供一个M
  2. 由于您为节点FlowSession传递了M,因此应该有一个响应者流,其中节点M调用ReceiveFinalityFlow;否则您的启动器流程将挂起,因为FinalityFlow将执行send()来将事务发送到M,而M没有receive()调用( ReceiveFinalityFlow执行)。
  3. 您可以通过调用ReceiveFinalityFlow并将输入参数statesToRecord设置为NONE来满足要求。默认情况下,该参数设置为ONLY_RELEVANT(请参阅流定义here)。 here说明了StatesToRecord的各种类型。
  4. 您的响应者流必须具有if语句,如果getOurIdentity()是节点M,则用ReceiveFinalityFlow调用statesToRecord == NONE(因为您不想M记录状态),如果它是节点D,则用ReceiveFinalityFlow调用statesToRecord == RELEVANT(因为您希望D记录状态)。
  5. 请注意,仅因为您以某种方式编写了响应者,并不保证节点M将执行您的版本;编写响应者流程通常是另一个节点的责任;他们的开发人员可以编写自己的响应者版本,在其中使用ReceiveFinalityFlow调用statesToRecord == RELEVANT(这意味着节点M将注册结果状态)。阅读this article中的第一个不正确
  6. 实施上述步骤后,请编写一个流测试以检查该节点M
    • 未在其交易存储中注册产生的交易
    • 未将结果状态注册到其保管库中
  7. 我之所以要求您这样做是因为我在Corda的代码中注意到以下内容:
    • ReceiveFinalityFlow呼叫ReceiveTransactionFlow here
    • ReceiveTransactionFlow呼叫ResolveTransactionFlow here
    • ResolveTransactionFlowstatesToRecordNONE覆盖到RELEVANT here,这让我很担心;我只想确保当您在节点statesToRecord的{​​{1}}中将NONE设置为ReceiveFinalityFlow时,它不会记录交易或状态

让我知道事情的进展。

也可以按帐户查询,请在my article中阅读以下2部分:

  1. 搜索最后,如何通过帐户查询保险库?
  2. 也请阅读这非常重要!