生成包含交易命令的分类帐更改事件的最佳方法是什么?

时间:2019-05-01 20:05:01

标签: corda

目标是在状态发生改变时在每个参与的节点上生成事件,其中包括导致该改变的业务操作。在我们的例子中,业务操作映射到“事务”命令并提供业务意图或用户在业务方面所做的事情。因此,在我们的案例中,当我们在建模贷款的生命周期时,可能采取的措施是“关闭”贷款。

我们在状态级别上对事件进行建模,如下所示:每个事件封装一个事务命令,并由(TxnHash,OutputIndex)和已创建/已使用状态唯一标识。

我们希望使用轮询机制来按需生成事件,但是可以采用异步方法来生成分类账事件。无论哪种方式,我们面临的挑战都是从事务中获取命令。 我们考虑过使用保管库查询API vaultQueryBy()来查询轮询解决方案(或使用vaultTrackBy()来用于异步Obvservalble Stream解决方案)来查询状态。我们能够创建一个获取状态的txn的流。这必须在流程中完成,因为Corda不赞成使用允许我们在Springboot客户端中执行此操作的功能。在客户端中,我们使用vaultQueryBy()获取状态列表。然后,我们调用一个遍历状态的流,从每个StateRef中获取txHash,然后调用serviceHub.validatedTransactions.getTransaction(txHash)来获取signedTransaction,最终可以从中检索Command。 这是最佳还是推荐的方法?

或者,我们还考虑过通过查询事务生成事务事件,然后为事务中的每个输入和输出状态构建事件。 如果我们采用这种方法,从保管库查询交易的最佳方法是什么?是否存在基于可观察流的选项?

我认为状态到命令的这种映射是分类帐观察者的常见要求,因为将合同逻辑从事务命令中删除是很标准的,并且很自然地将命令映射到用户意图。

为分类帐上创建或使用的每个状态生成封装事务命令的事件的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

如果我正确理解,则您尝试在发生某些类型的分类帐更新(未清,已批准,已关闭等)时收到通知。

首先:异步通知是Corda中的最佳实践,应避免轮询,因为轮询会给节点增加权重以实现恒定查询和延迟。 Corda提供了几种可用于观察的机制,您可以使用:https://docs.corda.net/api/kotlin/corda/net.corda.core.messaging/-corda-r-p-c-ops/vault-track-by.html

第二个:避免从数据库查询事务,因为这些事务打算在节点内部进行。有关为何避免事务查询的背景信息,请参见answer。通常,仅查询以“ VAULT_ *”开头的表。

解决用例的一种方法是“状态”字段,该字段反映用于生成当前状态的命令。例如:如果使用“关闭”命令生成状态,则其状态字段可以为“关闭”。这样,您可以使用上面的vaultTrackBy查看每个状态的状态字段并推断发生的操作。

答案 1 :(得分:0)

最后请完成我的评论:虽然该方法满足要求,但此解决方案的问题在于,我们必须跨所有相关状态添加并维护自己的代码,以捕获已由交易日志跟踪的交易级别信息。平台。我认为,更好的解决方案是为该平台提供消费者(如可能)有选择地访问交易级别信息的途径,就像它为各州提供的那样。毕竟,事务部分是在客户端应用程序级别有意义的业务/功能构造。例如,如果我“转移”贷款,那可能是涉及许多输入和输出状态的复杂业务交易,并且可能是客户端应用程序要管理的重要构造/概念。