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