如果ContractState不在交易中发展,是否可以避免重复存储ContractState?

时间:2017-07-12 12:04:30

标签: corda

我有两个不同的net.corda.core.contracts.ContractState实现,比如说StateA和StateB,来模拟两种不同类型的on-ledger事实。在某些时候,我想改进StateA的一个实例。对StateA的更新只对StateB的实例有意义,因此StateA引用的Contract必须能够同时评估StateA和StateB。然而,为了更新StateA而需要的StateB在这一点上并没有发展。 StateA和StateB被建模为不相交的实体,因为StateB也可能在其他某个时间点发生变化,与StateA无关。

目前我正在创建一个StateA和StateB作为输入的事务,以及演进的StateA'和与输出相同的StateB,这使我能够访问StateA的Contract的verify() - 函数中的StateA和StateB。在验证事务之后,我可以看到具有相同版本的StateB的两行作为序列化对象持久存储到VAULT_STATES表(列CONTRACT_STATE)中。虽然由于StateB被交易消费和重新创建,但在某种程度上可以预期这一点,但是为了在合同中访问/评估它而存储相同值的多个副本似乎是浪费的。有没有办法避免这种行为?我在通过Transaction-Command提供StateB时犹豫不决,因为在验证交易时也应保证其有效性。

1 个答案:

答案 0 :(得分:0)

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

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

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