在Corda中追溯OwnableState

时间:2018-03-23 13:16:12

标签: corda

在浏览Corda文档时,我在link处看到了以下代码段。

  

默认的保险库实施基于以下规则做出决定:

     

如果状态为 OwnableState ,如果节点是州的所有者,则保管库将存储状态   否则,如果保险库是其中一个参与者,则保管库将存储该状态

在我的流程中,

  1. 我使用实现OwnableState的状态类从节点A向节点B发送/发送现金。
  2. 我将Node B作为所有者。
  3. 我使用节点A和节点B 填充参与者字段。
  4. 我能够在Node B中看到新状态但在节点A 中没有。 我尝试通过添加标准status = vault.StateStatus.ALL来查询终端上的状态(它只显示未使用的状态)以及使用保险库查询API。

    这是否意味着,我永远无法

    • 跟踪节点B中现金的来源?
    • 跟踪节点A中的现金去哪里?

    代码示例如下: 州级:

    package com.shailesh
    
    import net.corda.core.contracts.CommandAndState
    import net.corda.core.contracts.OwnableState
    import net.corda.core.identity.AbstractParty
    import net.corda.core.schemas.MappedSchema
    import net.corda.core.schemas.PersistentState
    import net.corda.core.serialization.CordaSerializable
    import net.corda.finance.contracts.asset.Cash
    
    @CordaSerializable
    data class MyPersistentState(val amount: Int, val sender : AbstractParty, val receiver : AbstractParty) : OwnableState {
    
        override val owner: AbstractParty
            get() = receiver
    
        override val participants: List<AbstractParty> = listOf(sender, receiver)
    }
    

    流程类:

    package com.shailesh
    
    import co.paralleluniverse.fibers.Suspendable
    import com.shailesh.PersistenceDemoContract.Companion.id
    import net.corda.core.contracts.Contract
    import net.corda.core.flows.FinalityFlow
    import net.corda.core.flows.FlowLogic
    import net.corda.core.flows.InitiatingFlow
    import net.corda.core.flows.StartableByRPC
    import net.corda.core.identity.Party
    import net.corda.core.node.services.Vault
    import net.corda.core.node.services.vault.QueryCriteria
    import net.corda.core.serialization.CordaSerializable
    import net.corda.core.transactions.LedgerTransaction
    import net.corda.core.transactions.TransactionBuilder
    import net.corda.core.utilities.ProgressTracker
    import net.corda.finance.DOLLARS
    import net.corda.finance.contracts.asset.CASH
    import net.corda.finance.contracts.asset.Cash
    
    @InitiatingFlow
    @StartableByRPC
    class PersistenceDemoFlow(val amount: Int, val receiver : Party) : FlowLogic<Unit>() {
    
        override val progressTracker: ProgressTracker = ProgressTracker()
    
        @Suspendable
        override fun call() {
            val notary = serviceHub.networkMapCache.notaryIdentities.first()
    
            val qc = QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)
    
            // I expect that result should show me the states in Node A when A issues state to B
            val result: Vault.Page<MyPersistentState> = serviceHub.vaultService.queryBy(contractStateType = MyPersistentState::class.java, criteria = qc)
    
            val outputState = MyPersistentState(amount, ourIdentity, receiver)
            val tx = TransactionBuilder(notary).addOutputState(outputState, id).addCommand(Cash.Commands.Issue(), listOf(ourIdentity.owningKey))
            tx.verify(serviceHub)
            val signedTx = serviceHub.signInitialTransaction(tx)
            subFlow(FinalityFlow(signedTx))
        }
    }
    
    @CordaSerializable
    class PersistenceDemoContract: Contract {
        companion object {
            val id = "com.shailesh.PersistenceDemoContract"
        }
        override fun verify(tx: LedgerTransaction) {
    
        }
    }
    

    查询和发布状态的命令:

    // Check states
    run vaultQuery contractStateType: com.shailesh.MyPersistentState
    // Start the issue flow on Node A
    flow start com.shailesh.PersistenceDemoFlow amount: 100, receiver: "O=PartyB,L=New York,C=US"
    

2 个答案:

答案 0 :(得分:2)

您的流量直接向接收者发出状态,其中没有inputs和一个output - 这是唯一未记录在接收者身上的状态(所有者)保险库。

该州是从稀薄的空气中创造出来并插入接收器的保险库中。首先创建此状态没有消耗任何东西。因此,尽管在发送方侧运行了消耗/未消耗的查询,但它没有返回任何内容。

如果您想要跟踪其发布地点,请通过将发行人作为初始所有者来执行州的self-issue。然后通过使输入上消耗的状态将其发送到接收器,并且重新分配具有新所有者的未消耗状态的输出。

答案 1 :(得分:2)

根据Adrian的回答,原始问题询问是否OwnableState

  

我永远无法

     

跟踪节点B中现金的来源?

     

跟踪节点A中的现金去了哪里?

此外,在评论中,系统会询问participants字段的OwnableState字段的重要性。

participants字段的重要性在于,所有participants都将接收并记录创建新状态的事务副本,作为FinalityFlow的一部分。正是这种交易,而不是国家本身,允许随着时间的推移建立一系列现金流动。

Corda必须区分谁记录交易(所有participants)和谁记录状态(ownerOwnableState,以及所有{{} 1}})。