我正在尝试在Corda中实现以下用例:已通过 startFlowDynamic
在PartyA上调用FlowA . FlowA创建一个部分签名的事务,并通过 sendAndReceive
在PartyB上调用FlowB . 人类用户现在应审核并手动批准此交易 . 理想情况下,FlowB应在收到交易后暂停 . 我希望能够通过RPC查询FlowB的挂起实例,并在我的UI中向用户显示这些(或者更确切地说是其中的一些事务) . 然后,在用户操作他的批准之后,我想通过RPC恢复FlowB,然后RPC将签署该事务并将其返回给PartyA上的FlowA .
我注意到我可以通过CordaRPCOps.stateMachineAndUpdates在某种程度上检查暂停的流程,并且我阅读了关于进度跟踪的教程,但这对我的情况来说还不够 . 我还读到与流量中的人进行交互被列为未来特征,我只是想知道是否还没有一些方法可以实现这一目标?
2 回答
请参阅Negotiation Cordapp示例,了解这将如何在实践中发挥作用here .
Corda目前不支持暂停用户交互的流程 .
但是,您可以按如下方式支持此类工作流程 . 假设您正在为贷款申请编写CorDapp . 您可以拥有一个初始流程,该流程同意在两方之间创建一个
loanApplication
状态 . 从那里,批准者可以检查贷款申请,并启动创建事务的approve
流以将loanApplication
转换为approvedLoan
状态,或启动reject
流以消耗loanApplication
状态而不发出approvedLoan
状态 .同样,您可以将状态字段添加到
loan
状态,指定是否批准loan
. 最初,loan
状态将字段设置为unapproved
. 然后,批准者可以启动两个流程中的一个以更新loan
状态,或者具有approved
或rejected
状态 .我不确定这是不是"recommended approach"但我在我的流程中实现了与Quasar兼容的AsynchListenableFuture,就像其他人描述的那样here .
我需要挂起流并等待从另一个流生成状态(响应用户交互) . 它似乎有效,但怀疑它可能被视为相当偏离滑雪道(?!) .
将活动拆分为由UI交互直接调用的原子流很好,但我需要一种“监控”流来等待外部(例如用户)事件,然后确定下一个启动哪个子流,这需要自动发生,从在用户交互之前已经调用的流内 - 流逻辑然后以可能由用户交互或来自另一节点的传入事务引起的状态改变为条件 . 在我的例子中,这个高级监控流程检测节点上已知状态的消耗,然后调用子流作为响应 . 高级流程等待AsynchListenableFuture,如上面引用的答案中所述 . 我在感兴趣的 Contract 状态类型的状态属性(例如自定义字段X = Y)上创建了一个复合VaultQuery,并将返回的observable(从trackBy.future返回)转换为Quasar兼容的AsynchListenableFuture . 当状态被由外部动作触发的流创建的事务消耗时,将来返回并且执行自动事件(在我的情况下,与另一方创建另一个事务) .
我只是在试验/评估Corda,不确定这种方法在 生产环境 现实中有多强大,但似乎工作正常,希望这在某种程度上有所帮助 .
Corda中某种形式的高级工作流流程可以等待外部事件并根据外部操作有条件地调用其他流程,这对我的上下文非常重要 .