在 Corda 中,持久的 ContractStates 可以编码命令吗?

In Corda, can persisted ContractStates encode commands?

我有一些 ContractState,有两个命令可以 'delete' 状态(将其标记为历史状态,没有新状态来替换它)- 比方说 'Delete' 和 'Revoke',它们在现实世界中会产生不同的后果。

我仍然可以在金库中看到历史状态,对吧?我如何确定哪个命令删除了状态?我想我可以向状态添加一些枚举:'Active|Deleted|Revoked',然后将状态从 S(Active) -> S(Deleted|Revoked) -> Historic 移动。但这看起来很笨重。

理论上可以通过查看消费状态的事务来判断是哪个命令消费了状态。

但是,目前还没有non-deprecated API可以作为节点所有者查看节点交易存储的内容。这是因为在 Corda 的未来版本中,我们希望交易解决方案发生在安全保护扩展(SGX)中。这将影响哪些交易是可见的,因此 Corda 无法提交稳定的 API 来查看节点交易存储的内容。

如果您愿意使用已弃用的 internalVerifiedTransactionsSnapshot/internalVerifiedTransactionsFeed API,您可以这样做:

val (_, vaultUpdates) = proxy.vaultTrackBy<ContractState>()

vaultUpdates.toBlocking().subscribe { update ->

    update.produced.forEach { stateAndRef -> 
        val newStateTxId = stateAndRef.ref.txhash
        val transactions = proxy.internalVerifiedTransactionsSnapshot()
        val transaction = transactions.find { transaction -> transaction.id == newStateTxId }!!
        val commands = transaction.tx.commands
    }
}

另一种方法是向状态添加状态字段,并在 "deleting" 时更新状态字段而不是将其标记为已消耗。例如:

class MyState(val expired: Boolean): ContractState {
    override val participants = TODO()
}