You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Corda流中如何获取已提交交易输出状态对应的StateRef

如何检索已提交交易输出状态对应的输入StateRef?

首先得明确一点:一个交易的输出状态,只有当它被后续交易当作输入消费时,才会产生对应的输入StateRef——这个StateRef其实就是后续交易用来引用这个输出的标识。如果这个输出还没被消费,那自然不存在对应的输入StateRef哦。

下面给你两种实操的方法:

方法一:通过Vault查询直接获取

这是最常用的方式,步骤很清晰:

  • 先拿到你要追踪的目标输出状态的StateAndRef(如果手头没有,可以先通过Vault查询定位到这个状态,比如根据状态的业务字段过滤)。
  • 构建ConsumedStateQueryCriteria查询条件,指定要查找的是消费了该状态的交易记录。
  • 执行查询后,从结果里提取对应的StateRef即可。

给你一段Kotlin代码示例(在Corda流里执行的话,直接用serviceHub调用就行):

// 假设你已经获取到目标输出状态的StateAndRef
val targetOutputState: StateAndRef<YourCustomState> = ...

// 构建查询条件:筛选出消费了该状态的交易
val consumedCriteria = ConsumedStateQueryCriteria(stateRefs = listOf(targetOutputState.ref))

// 执行Vault查询
val consumedResults = serviceHub.vaultService.queryBy<YourCustomState>(consumedCriteria)

// 提取对应的输入StateRef(这些就是该输出被当作输入时的引用)
val inputStateRefs = consumedResults.states.map { it.ref }

方法二:通过TransactionStorage反向查询

如果你知道消费该输出的交易ID,也可以直接从交易存储里取出完整交易,然后遍历它的inputs找到对应的StateRef:

// 假设你已知消费该输出的交易ID
val consumingTxId: SecureHash = ...

// 从TransactionStorage获取完整交易
val consumingTx = serviceHub.validatedTransactions.getTransaction(consumingTxId)

// 遍历交易的inputs,找到匹配你目标输出的StateRef
val targetStateRef = targetOutputState.ref
val matchedInputStateRef = consumingTx?.tx?.inputs?.find { it == targetStateRef }

需要注意的是,如果你的目标输出状态还没有被任何交易消费,上面两种方法都会返回空结果,这是正常的——毕竟还没有交易把它当作输入嘛。

内容的提问来源于stack exchange,提问作者Joel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:02:10