如果 ContractState 不在 Transaction 中演变,是否可以避免重复存储 ContractState?

Is it possible to avoid duplicate storage of a ContractState if it does not evolve in a Transaction?

我有两个不同的 net.corda.core.contracts.ContractState 实现,比如 StateA 和 StateB,来模拟两种不同类型的账本事实。在某些时候,我想发展一个 StateA 的实例。对 StateA 的更新仅在与 StateB 的实例相关时才有意义,因此 StateA 引用的合约必须能够同时评估 StateA 和 StateB。然而,更新 StateA 所需的 StateB 此时并未演化。 StateA 和 StateB 被建模为不相交的实体,因为 StateB 也可能在其他时间点独立于 StateA 发生变化。

目前我正在创建一个交易,其中 StateA 和 StateB 作为输入,进化的 StateA' 和相同的 StateB 作为输出,这使我能够在 StateA 的合约的验证中访问 StateA 和 StateB()-功能。验证交易后,我可以看到两行具有相同版本的 StateB 作为序列化对象保存到 VAULT_STATES table(列 CONTRACT_STATE)中。虽然考虑到 StateB 被交易消耗并重新创建,这在某种程度上是意料之中的,但为了在合约中 access/evaluate 存储相同值的多个副本似乎很浪费。有没有办法避免这种行为?我在犹豫要不要通过Transaction-Command来提供StateB,因为在验证Transaction的时候也要保证其有效性。

好问题。您所观察到的确实是预期的。在大多数情况下,如果将输入和输出状态添加到事务中,则期望输出将以某种方式与输入不同。

很明显,在您的用例中,不需要任何更改!我看到了两个选项:

  1. 什么都不做。我同意数据的重复是次优的。但是,状态对象在内存方面通常不会那么大,因此复制永远不会成为问题。
  2. 如果状态 B 中的数据只需要创建一次并且永远不会更新,那么您可以使用附件来存储此数据。使用这种方法的优点是附件永远不会被消耗,它们仍然可以被 verify() 函数访问。如果数据确实需要发展,那么您可能可以更新附件,然后将其重新附加到您的交易,从而取代之前的交易。