在浏览Corda文档时,我在link处看到了以下代码段。
默认的保险库实施基于以下规则做出决定:
如果状态为 OwnableState ,如果节点是州的所有者,则保管库将存储状态 否则,如果保险库是其中一个参与者,则保管库将存储该状态
在我的流程中,
我能够在Node B中看到新状态但在节点A 中没有。
我尝试通过添加标准status = vault.StateStatus.ALL
来查询终端上的状态(它只显示未使用的状态)以及使用保险库查询API。
这是否意味着,我永远无法
代码示例如下: 州级:
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"
答案 0 :(得分:2)
您的流量直接向接收者发出状态,其中没有inputs
和一个output
- 这是唯一未记录在接收者身上的状态(所有者)保险库。
该州是从稀薄的空气中创造出来并插入接收器的保险库中。首先创建此状态没有消耗任何东西。因此,尽管在发送方侧运行了消耗/未消耗的查询,但它没有返回任何内容。
如果您想要跟踪其发布地点,请通过将发行人作为初始所有者来执行州的self-issue
。然后通过使输入上消耗的状态将其发送到接收器,并且重新分配具有新所有者的未消耗状态的输出。
答案 1 :(得分:2)
根据Adrian的回答,原始问题询问是否OwnableState
:
我永远无法
跟踪节点B中现金的来源?
跟踪节点A中的现金去了哪里?
此外,在评论中,系统会询问participants
字段的OwnableState
字段的重要性。
participants
字段的重要性在于,所有participants
都将接收并记录创建新状态的事务副本,作为FinalityFlow
的一部分。正是这种交易,而不是国家本身,允许随着时间的推移建立一系列现金流动。
Corda必须区分谁记录交易(所有participants
)和谁记录状态(owner
为OwnableState
,以及所有{{} 1}})。