Corda 是否可以挂起流,以便通过RPC调用恢复流?

Corda 是否可以挂起流,以便通过RPC调用恢复流?,corda,Corda,我试图在Corda中实现以下用例: FlowA已通过startFlowDynamic在PartyA上调用。FlowA创建一个部分签名的事务,并通过sendAndReceive在PartyB上调用FlowB。人工用户现在应审查并手动批准此交易。理想情况下,FlowB应该在收到事务后挂起。我希望能够通过RPC查询暂停的FlowB实例,并在我的UI中向用户展示这些实例(或者更确切地说是其中事务的一些表示)。然后,在用户操作他的批准之后,我希望通过RPC恢复FlowB,然后RPC将签署事务并将其返回给P

我试图在Corda中实现以下用例: FlowA已通过
startFlowDynamic
在PartyA上调用。FlowA创建一个部分签名的事务,并通过
sendAndReceive
在PartyB上调用FlowB。人工用户现在应审查并手动批准此交易。理想情况下,FlowB应该在收到事务后挂起。我希望能够通过RPC查询暂停的FlowB实例,并在我的UI中向用户展示这些实例(或者更确切地说是其中事务的一些表示)。然后,在用户操作他的批准之后,我希望通过RPC恢复FlowB,然后RPC将签署事务并将其返回给PartyA上的FlowA


我注意到我可以通过CordaRPCOps.stateMachineAndUpdates在某种程度上检查暂停的流,我阅读了关于进度跟踪的教程,但这还不足以满足我的情况。我还读到,与来自flows的人进行交互被列为未来的一项功能,我只是想知道是否已经有一些方法可以实现这一点?

请参阅Negotiation Cordapp示例,了解这在实践中是如何工作的

Corda目前不支持暂停用于用户交互的流

但是,您可以按如下方式支持此类工作流。假设您正在为贷款申请编写CorDapp。您可以有一个初始流,它同意在双方之间创建
loanApplication
状态。从那里,审批人可以检查贷款申请,并启动
approve
流程,该流程创建一个事务,将
loanApplication
转换为
approvedLoan
状态,或者启动
拒绝
流,以使用
贷款应用程序
状态,而不发出
已批准贷款
状态

同样,您可以在
贷款
状态中添加一个状态字段,指定贷款是否已批准。最初,
贷款
状态将字段设置为
未批准
。然后,审批人可以启动两个流中的一个来更新
贷款
状态,要么是
已批准
,要么是
已拒绝
状态。

我不确定这是否是一种“推荐的方法”,但我在我的流中实现了与Quasar兼容的AsynchListenableFuture,正如其他人所描述的那样

我需要挂起一个流,等待另一个流产生状态(响应用户交互)。这似乎是可行的,但我怀疑这可能会被认为是相当离谱的(?)

将活动拆分为UI交互直接调用的原子流是可以的,但我需要一种“监视”流来等待外部(例如用户)事件,然后再决定下一步启动哪个子流,这需要自动发生,并且在用户交互之前已经调用的流中发生——然后流逻辑取决于可能由用户交互或来自另一个节点的传入事务引起的状态更改。在我的例子中,这个高级监控流检测节点上已知状态的消耗,然后调用子流作为响应。高级流等待AsynchListenableFuture,如上面引用的答案中所述。我在感兴趣的契约状态类型(例如自定义字段X=Y)的状态属性上创建了一个复合Vault查询,并将返回的observable(从trackBy.future返回)转换为与Quasar兼容的AsynchListenableFuture。当状态被外部操作触发的流创建的事务消耗时,未来返回并执行自动事件(在我的情况下是与另一方创建其他事务)

我只是在试验/评估Corda,不确定这种方法在实际生产中会有多强大,但它似乎工作正常,希望在某种程度上有所帮助


Corda中的某种形式的更高级别工作流,可以等待外部事件,并根据外部操作有条件地调用其他流,这在我的上下文中非常有意义。

谢谢。虽然我可以看到这是按照您的建议进行的,但我有以下顾虑:在PartyA(或各方)可能创建的许多LoanApplication中,PartyB(用户)可能只批准一个。这将使许多交易/状态永远存储在PartyA/PartyB/公证人的db中。而在LoanApplication的情况下,这实际上可能是可取的,例如出于审计目的,但在我的用例中并非如此,因此只存储实际批准的LoanApplication的事务/状态是可取的。关于是否/何时将其添加到corda中,是否有任何猜测?我们也需要类似的用例。这方面有什么更新吗?如果一个应用程序被接受,那么再增加一个流来使用所有其他的
LoanApplication
s怎么样?这将从保险库中删除
LoanApplication
状态,但将它们保留在事务存储中。