如何将外部Transaction id保存为linearState的externalId,并使用订阅返回相同的内容

时间:2018-03-06 09:59:14

标签: corda

我想使用linearStates实现以下场景。

CoreBanking系统----- Corda(甲方)--- CordaNode(乙方)---- ERP系统

Corebanking系统生成一个事务ID,并且需要为将来的合同端到端保留此事务ID。我想将此事务id用于linearstateID。

查询1:如何从外部标识符确定性地构建lineraId。这样我以后可以用它来查询valut

查询2:如何在下面给出的方案中从客户端提取此内容

    updates.toBlocking().subscribe { update ->
        update.produced.forEach {
            logState(it)
        }

查询3:一旦创建状态,应用程序如何知道并检索状态的linearid。

请您指出一个使用externalId作为线性stateID的示例,并使用此externalId在流中执行操作。

1 个答案:

答案 0 :(得分:1)

<强>查询1: linearId的类型为UniqueIdentifier。如果你看一下UniqueIdentifier类,你会看到它可以通过将外部Id传递给构造函数来绑定到任何现有的外部Id。

平等和比较仅基于唯一的Id,但您可以在查询文件库时简单地引用linearId中的externalId,即linearState.linearId.externalId

<强> QUERY2 看看Vault API文档,它们非常全面。

<强> QUERY3 linearState通常被定义为&#34;一种通过取代自身而发展的状态,所有这些都共享公共的linearId。&#34; 鉴于此,它不是关于Corda如何知道并检索状态的linearId,而是更像是 - 给定一个特定的状态,我可以使用linearId来查找状态的先前版本。

根据您的具体情况,由于您提供外部ID,您的其他应用程序将能够确定哪个ID以及哪个状态映射到特定的ID。帐户/贸易。

我们还没有使用外部ID的示例CorDapp,但我们会考虑创建一个。

欢迎您在我们周三的live streams

期间进一步讨论这个问题

其他

创建启动器流时,可以为其提供属性,例如:

  

对象InvoiceFlow {

@InitiatingFlow
@StartableByRPC
class Initiator(val externalId: String) : FlowLogic<SignedTransaction>() {

鉴于您的流程现已通过externalId,您可以查询保险库以检索相关状态,如下所示:

  

val invoiceState =   serviceHub.vaultService.unconsumedStates()。singleOrNull {   it.state.data.linearId.externalId == externalId}

  

val invoiceState =   serviceHub.vaultService.queryBy()。states.singleOrNull {it。   state.data.linearId.externalId == externalId}

然后您可以像这样调用此流程:

  

services.startFlow(InvoiceFlow.Initiator(外部编号   ))