CordApp API/Flow技术问询:如何通过唯一ID及交易哈希查询状态
嘿,针对你在CordApp里查询状态的两个需求,我给你整理了具体的实现方案,结合Corda的核心API来做:
1. 通过唯一ID查询状态(基于LinearState)
你提到的LinearState确实是Corda里用来跟踪有生命周期的状态的核心类型,它自带的linearId(类型为UniqueIdentifier)就是每个状态实例的唯一标识,完全符合“通过唯一ID查状态”的需求。
不管是在Flow内部还是RPC客户端,都可以通过这个linearId来精准查询:
在Flow中查询
利用ServiceHub的vaultService构建查询条件:
// 先把字符串形式的唯一ID转成UniqueIdentifier val targetLinearId = UniqueIdentifier.fromString("你的linearId字符串") // 构建查询条件,指定要找的linearId val queryCriteria = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(targetLinearId)) // 执行查询,指定你的状态类型 val queryResults = serviceHub.vaultService.queryBy<YourLinearStateSubclass>(queryCriteria) // 提取目标状态(如果存在的话) val targetState = queryResults.states.firstOrNull()?.state?.data
在RPC客户端查询
如果是外部客户端调用,可以用Corda RPC的queryBy方法:
val targetLinearId = UniqueIdentifier.fromString("你的linearId字符串") val criteria = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(targetLinearId)) val results = rpcOps.queryBy<YourLinearStateSubclass>(criteria) val targetState = results.states.firstOrNull()?.state?.data
2. 通过交易哈希(TxHash)查询状态
Corda没有直接提供findStateFromTXhash这种一键方法,但可以通过两步实现:先根据交易哈希找到对应的交易,再提取交易里的输出状态。
在Flow中查询
// 把字符串形式的交易哈希转成SecureHash val txHash = SecureHash.parse("你的交易哈希字符串") // 从已验证交易存储中获取交易详情 val transaction = serviceHub.validatedTransactions.getTransaction(txHash) ?: throw IllegalArgumentException("找不到对应哈希的交易") // 提取交易中所有指定类型的输出状态(如果不需要过滤类型,直接用tx.outputs即可) val targetStates = transaction.tx.outputsOfType<YourStateType>() // 取第一个匹配的状态(根据你的业务需求调整) val targetState = targetStates.firstOrNull()
在RPC客户端查询
val txHash = SecureHash.parse("你的交易哈希字符串") // 通过RPC获取交易与状态的映射 val stateMapping = rpcOps.stateTransactionMapping(txHash) // 提取状态数据(注意类型转换) val targetState = stateMapping?.state?.data as? YourStateType
关于你提到的hash属性
你注意到的状态hash属性,是状态本身的哈希值,用来验证状态的完整性,和交易哈希完全不是一回事,所以不能用它来查询某笔交易对应的状态。
内容的提问来源于stack exchange,提问作者MohamedLEGH
相关产品推荐
相关产品推荐

