【发布时间】:2018-09-02 04:23:07
【问题描述】:
在浏览 Corda 文档时,我在link 遇到了以下 sn-p。
默认的保险库实现根据以下规则做出决定:
如果状态是 OwnableState,如果节点是 状态的所有者,保险库将存储状态 否则,如果它是参与者之一,保险库将存储状态
在我的流程中,
- 我正在使用实现 OwnableState 的状态类从节点 A 向节点 B 发放/发送现金。
- 我将节点 B 设为所有者。
- 我用节点 A 和节点 B 都填充了参与者字段。
我能够在节点 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"
【问题讨论】:
标签: corda