2017-07-12 3 views
1

私は、2つの異なるタイプの元帳の事実をモデル化するために、state.cとstate.cの2つの異なる実装をnet.corda.core.contracts.ContractState、StateAとStateBと言います。ある時点で、私はStateAのインスタンスを進化させたいと思う。 StateAへの更新は、StateBのインスタンスに関連してのみ有効であるため、StateAによって参照される契約は、StateAとStateBの両方を一緒に評価できる必要があります。 StateAを更新するために必要なStateBは、現時点では進化しません。 StateAおよびStateBは、StateBがStateAとは独立した別の時点でも変更される可能性があるため、分離したエンティティとしてモデル化されています。ContractStateがトランザクションで進化しない場合、その重複した格納を避けることはできますか?

私はStateAとStateBの両方を入力としてトランザクションを作成しており、進化したStateA 'と同じStateBを出力として使用しており、StateAのContractのverify()関数でStateAとStateBの両方にアクセスできます。トランザクションが検証された後、シリアル化されたオブジェクトとしてVAULT_STATESテーブル(CONTRACT_STATE列)に永続化された同じバージョンのStateBを持つ2つの行が表示されます。 StateBが消費され、トランザクションによって再作成されたことを考えると、これは多少期待されていますが、契約でアクセス/評価するために同じ値の複数のコピーを格納するのは無駄です。この動作を回避する方法はありますか?私は、Transaction-Commandを介してStateBを提供するのを躊躇しています。なぜなら、トランザクションの検証時にその有効性も保証されるべきだからです。

答えて

0

大きな質問です。あなたが目にしていることは確かに期待されています。ほとんどの場合、トランザクションに入出力状態を追加すると、何らかの形で出力が入力と異なることが予想されます。

あなたのユースケースでは、変更は必要ありません。表示されるオプションは2つあります。

  1. 何もしません。私は、データの複製が最適ではないことに同意します。しかし、状態オブジェクトは決してメモリという意味で決して大きいものではないので、重複は決して問題にならないはずです。
  2. 状態Bのデータを一度だけ作成して更新する必要がない場合は、添付ファイルを使用してこのデータを保存できます。この方法を使用する利点は、添付ファイルが消費されることはなく、verify()機能には引き続きアクセスできることです。データが進化する必要がある場合は、添付ファイルを更新してからトランザクションに再度添付して、以前のトランザクションに取って代わることができます。
+0

ありがとうございます!私は添付ファイルオプションを考慮していませんでした。私の特定のユースケースでは、トランザクションを見る人は必ずしも実際のStateBを見ることはできないかもしれないし、必ずしもそれ以上の主張を見ることができないことに気づいた。したがって、実際のStateBをトランザクション入力にする代わりに、アサーションをモデル化する方法、トランザクション入力(おそらくコマンドとして)、oracle-service(StateBを参照)を使用してそれ。 –

関連する問題