【问题标题】:Different results when making a Corda query via API and inside a flow通过 API 和流内部进行 Corda 查询时的不同结果
【发布时间】:2020-04-24 01:29:21
【问题描述】:

我遇到了一些奇怪的行为。当我使用合作伙伴 ID 列表(其他节点)更新状态并随后读取状态时,似乎通过 rpcOps.vaultQueryBy 我可以看到更新的或未使用的状态以及更新的合作伙伴列表,但如果我这样做通过serviceHub.vaultService.queryBy查询,该州的合作伙伴列表似乎根本没有改变。

如果我获得了流程中的所有状态 - 也包括消费状态 - 看起来没有任何变化,但通过 API,所有对合作伙伴列表的更新都是可见的。这是我遇到的某种错误还是我只是不理解某些东西?

我们正在使用 Corda 4.0。

通过 API

var servicestates = rpcOps.vaultQueryBy<ServiceState>().states.map { it.state.data }
var services = getServices().filter {
            it.linearId == UniqueIdentifier.fromString(serviceId)
        }.single()

内流

val serviceStateAndRef = serviceHub.vaultService.queryBy<ServiceState>(
                    QueryCriteria.LinearStateQueryCriteria(linearId = listOf(serviceLinearId))
                ).states.single()

【问题讨论】:

  • 您能检查一下您的serviceLinearId 是否正确传递了吗?您是从节点外壳调用流程吗?还是通过 API?
  • 是的,linearId 是正确的。这是最令人担忧的事情。除了缺少的合作伙伴列表之外,其他一切看起来都完全正确。通过 API 调用流。
  • 似乎在流程中我只得到消耗状态。如果我将条件设置为未消费,我会得到最后消费的 - 而不是未消费的状态。
  • 我检查了 H2 数据库,状态被消费和创建,就像想象的那样。但由于某种原因,linearQuery 将无法获取未使用的。
  • 您能否尝试打印创建的条件并查看推断的 stateStatus 是什么。我认为默认情况下它应该只被未使用。我很惊讶如何被消耗。

标签: blockchain corda


【解决方案1】:

@Ashutosh Meher 你已经够接近了。问题出在前面的流程中,当创建新的合作伙伴状态命令调用合同时,只列出了调用者。

所以

Command(ServiceContract.Commands.AddPartner(),listOf(ourIdentity.owningKey))

必须进行编辑以包括必要的其他方。

Command(ServiceContract.Commands.AddPartner(),updatedServiceState.participants.map { it.owningKey })

这导致其他节点看不到更改。它一直就在我的眼皮底下……;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 2020-10-11
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多