在 Corda 保管库中跟踪状态

时间:2021-07-23 11:40:21

标签: corda

我对跟踪各州的保管库更新感兴趣。每当特定合约状态类型的状态(例如 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
            )
        )
    )
)

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

我知道 _trackBy 对查询条件的限制,但是,根据 Corda 的 vault api 文档,据我所知,上面的代码应该同时收听生成的 ({{1} }) 和消费 (UNCONSUMED) 状态更新。这是一个已知的错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

VaultQueryCriteria() 默认设置 Vault.StateStatus.UNCONSUMED,如果你没有指定它。因此,在您的情况下,您正在执行符合逻辑的查询

(ALL).and(UNCONSUMED) = UNCONSUMED

结果是您看不到 CONSUMED

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

我同意文档中没有明确说明这一点。