Blockchain 通过API和流内部进行Corda查询时的不同结果

Blockchain 通过API和流内部进行Corda查询时的不同结果,blockchain,corda,Blockchain,Corda,我有一些奇怪的行为。当我使用合作伙伴ID列表(其他节点)更新状态并在之后读取状态时,似乎通过rpcOps.vaultQueryBy我可以看到更新的或未使用的状态以及更新的合作伙伴列表,但是,如果我通过serviceHub.vaultService.queryBy执行相同的查询,看起来该州的参数列表一点也没有改变 如果我得到了流程中的所有状态(也包括已消耗的状态),看起来好像没有任何变化,但通过API,所有进入合作伙伴列表的更新都是可见的。这是我遇到的某种bug,还是我只是不理解某些东西 我们正在

我有一些奇怪的行为。当我使用合作伙伴ID列表(其他节点)更新状态并在之后读取状态时,似乎通过
rpcOps.vaultQueryBy
我可以看到更新的或未使用的状态以及更新的合作伙伴列表,但是,如果我通过
serviceHub.vaultService.queryBy
执行相同的查询,看起来该州的参数列表一点也没有改变

如果我得到了流程中的所有状态(也包括已消耗的状态),看起来好像没有任何变化,但通过API,所有进入合作伙伴列表的更新都是可见的。这是我遇到的某种bug,还是我只是不理解某些东西

我们正在使用Corda 4.0

通过API

var servicestates = rpcOps.vaultQueryBy<ServiceState>().states.map { it.state.data }
var services = getServices().filter {
            it.linearId == UniqueIdentifier.fromString(serviceId)
        }.single()
var servicestates=rpcOps.vaultQueryBy().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()
val serviceStateAndRef=serviceHub.vaultService.queryBy(
LinearStateQueryCriteria(linearId=listOf(serviceLinearId))
).states.single()

@Ashutosh Meher你离得够近了。问题出现在前一个流中,在创建新的合作伙伴状态时,合同的命令调用只列出了调用方

所以

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

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

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


这导致另一个节点看不到更改。它一直就在我眼前……;)

@Ashutosh Meher你离得够近了。问题出现在前一个流中,在创建新的合作伙伴状态时,合同的命令调用只列出了调用方

所以

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

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

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


这导致另一个节点看不到更改。它一直就在我眼前……;)

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