【问题标题】:Track states in Corda vault在 Corda 保险库中跟踪状态
【发布时间】:2021-09-30 13:04:39
【问题描述】:

我有兴趣跟踪各州的保险库更新。每当在交易中产生或使用特定合约状态类型的状态时,比如Token,我都想接收更新。我使用以下查询条件

val queryCriteria = QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL)
    .and(
         QueryCriteria.VaultQueryCriteria(
             timeCondition = QueryCriteria.TimeCondition(
                 QueryCriteria.TimeInstantType.RECORDED,
                 ColumnPredicate.BinaryComparison(
                      BinaryComparisonOperator.GREATER_THAN_OR_EQUAL,
                      offset
                 )
             )
         )
    )

一起

ops.vaultTrackByWithSorting(
    TokenState::class.java,
    queryCriteria,
    Sort(
        setOf(
            Sort.SortColumn(
                SortAttribute.Standard(Sort.VaultStateAttribute.RECORDED_TIME),
                Sort.Direction.ASC
            ),
            Sort.SortColumn(
                SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF_INDEX),
                Sort.Direction.ASC
            )
        )
    )
)

有趣的是,我确实看到了产生Tokens 的更新,但是当Tokens 被消耗时我看不到任何更新。我正在使用 Corda 4.6。

我知道_trackBy 在查询条件方面的限制,但是,根据我的理解,根据 Corda 的 vault api 文档,上述代码应该同时监听产生 (UNCONSUMED) 和消费(CONSUMED) 状态更新。这是一个已知的错误,还是我做错了什么?

【问题讨论】:

    标签: corda


    【解决方案1】:

    VaultQueryCriteria() 默认设置Vault.StateStatus.UNCONSUMED,如果你不指定的话。所以,在你的情况下,你正在做一个逻辑上的查询

    (ALL).and(UNCONSUMED) = UNCONSUMED
    

    结果是看不到CONSUMED

    您还需要在and() 的第二个查询中指定StateStatus.ALL

    我同意这在文档中并不清楚。

    【讨论】:

    • 这是一个非常出乎意料的行为。感谢您指出了这一点!不过,我觉得这仍然是一个问题。我对未来的TokenState 更新(已使用和未使用)的可观察值感兴趣。鉴于Observable<Vault.Update<TokenState>> 我正在映射所有producedconsumed StateAndRefs,但是,似乎没有StateAndRefs 对应于consumed 更新。那是因为将来的更新不遵守查询条件吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多