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

如何在Corda中检查状态的消耗或未消耗状态?

确认Cordapp-example中IOU状态的消耗情况

我帮你梳理下在Cordapp-example里怎么判断IOU状态是已消耗还是未消耗,刚接触Corda的时候确实容易在Vault状态查询这块踩坑~

先搞清楚核心概念

在Corda里,线性状态(LinearState)(比如IOUState)的生命周期是:创建时生成一个未消耗(UNCONSUMED)的状态,当发起交易修改它时(比如还款操作),旧状态会被标记为已消耗(CONSUMED),同时生成新的未消耗状态(如果是部分还款)或者直接终结状态(全额还款)。

具体的排查/查看方法

1. 使用Corda Shell直接查询(最快捷)

不用改代码,直接打开Corda Shell,执行以下命令查询所有IOU状态的详细信息:

run vaultQuery contractStateType: com.example.state.IOUState

返回结果里每个状态条目都会包含stateStatus字段,明确显示是UNCONSUMED还是CONSUMED,同时还能看到对应的stateRef和linearId,方便你关联到之前创建的IOU。

2. 修改现有iousAPI,返回状态消耗标记

默认的iousAPI只返回IOU的业务数据(金额、借贷方等),没有包含状态的消耗状态。你可以修改API的实现逻辑,让它返回更完整的信息:

  • 找到API的处理类(比如IOUApi.kt),修改查询Vault的代码,获取状态元数据(Vault.StateMetadata)里的状态状态:
@GetMapping(value = ["/ious"], produces = ["application/json"])
fun getIOUs(): ResponseEntity<List<Map<String, Any>>> {
    // 查询所有状态(包括已消耗和未消耗)
    val vaultQuery = VaultQueryCriteria(Vault.StateStatus.ALL)
    val results = serviceHub.vaultService.queryBy<IOUState>(vaultQuery).states
    
    // 组装包含状态消耗信息的返回数据
    val iouDetails = results.map { stateAndRef ->
        val iouState = stateAndRef.state.data
        mapOf(
            "amount" to iouState.amount.toString(),
            "lender" to iouState.lender.name.toString(),
            "borrower" to iouState.borrower.name.toString(),
            "linearId" to iouState.linearId.id.toString(),
            "stateStatus" to stateAndRef.stateMetadata.stateStatus.name // 关键:添加状态消耗标记
        )
    }
    return ResponseEntity.ok(iouDetails)
}

重新部署节点后,调用iousAPI就能看到每个IOU的stateStatus字段了。

3. 结合业务逻辑判断

如果还没执行过Settle IOU(还款)操作,那你创建的所有IOU状态应该都是未消耗的;一旦执行了还款交易,原来的IOU状态会被标记为已消耗:

  • 全额还款:旧IOU状态被消耗,没有新状态生成
  • 部分还款:旧IOU状态被消耗,同时生成一个剩余金额的新IOU未消耗状态

内容的提问来源于stack exchange,提问作者s.Takahashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:32:53