在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
相关产品推荐
相关产品推荐

