Skip to main content
取引エンジンでは、3つの異なるものが「状態」と呼ばれます。それらを混同すると、誰に聞くかで答えが変わるシステムができあがります。このページでは3つを切り分け、どれが権威を持つのかを示します。

3つの表現

エンジン状態マーケット · アカウント · ポジション · 板 · クリアリングハウスブロックをまたいで存続 · 再構成
ブロックワーキングセットマーク · 触れたアカウント · 約定 · 準備中の出力1ブロックだけ存在 · ジャーナル
チェーン状態バージョン付きキーバリュー、Merkleで認証正本
これが防ぐ失敗メモリ上のビューがコミット済みの内容からずれたエンジンは、そのまま答えを返し続けます。その答えはすべて誤っており、ずれが表に出るのは決済の段階です。
エンジン状態はコミット済みの記録から導出できなければならず、その逆であってはならない
エンジン状態とは、カーネルがブロックとブロックの間で保持しているものです。マーケットのメタデータ、アカウント、ポジション、板、銘柄の状態、クリアリングハウスの状態です。これは作業用の表現であり、ストレージ向けではなく、マッチングとクリアリングが実際に行うアクセスパターンに合わせて配置されています。 ブロックワーキングセットは、ブロックの実行中にだけ存在します。開始時に固定されたマーク価格、どのアカウントと注文に触れたか、生成された約定、組み立て途中の出力です。このブロックの中で何が起きたかを記録したジャーナルです。 チェーン状態はコミットされた結果です。バージョン付きのキーバリューエントリで、Merkle構造によって認証され、永続的でリプレイ可能です。ノードが同期する対象であり、証明が向けられる対象であり、インデクサーが読む対象です。 権威を持つのはチェーン状態です。ブロックワーキングセットは決定的な出力を組み立てるためのジャーナルであって、真実の拠り所ではありません。エンジン状態は、実行向けに最適化されたチェーン状態の再構成です。コミット済みの記録から導出できなければならず、その逆であってはなりません。 ここを逆にすると、特有の、見分けのつく形で壊れます。メモリ上のビューがコミット済みの内容からずれたエンジンは、そのまま答えを返し続けます。その答えはすべて誤っており、しかもずれが表に出るのは決済の段階になってからです。

キー

チェーン状態はキーでアドレス指定されます。取引に関する状態は、名前が付き、バージョンが明示された名前空間にまとめられます。たとえば手数料設定、無期限先物のインデックス、レバレッジティア表、管理ロールの一覧です。 バージョンの接尾辞は飾りではありません。設定の形が変わると、そのキーは新しいバージョンへ移り、旧スキーマで書かれた状態を移行中も読めるように以前のキーが残されます。特定のバージョンをハードコードして再確認しない読み手は、移行後も古い設定を黙って読み続けます。現在のキーを解決する読み手はそうなりません。
設定をクライアントのコードに固定するのではなく、チェーンから読むべき理由がこれです。手数料ティアのサービスがサイクルごとにライブの手数料設定を読み直しているのも、まさにこの理由によります。クライアントに焼き込まれたティア表は、いずれネットワークが適用している表と食い違います。

バージョン

コミットされたブロックごとに、バージョンが1つ進みます。状態の値は書き込まれた時点のバージョンに紐づけて保存されるため、ストアが持つのは「現在の状態」だけではなく「任意のバージョン時点の状態」です。 この性質が、いくつものことを同時に可能にしています。
  • 証明を、現在に対してだけでなく特定のバージョンに対して生成できます。
  • リプレイを、ジェネシスからだけでなく任意のバージョンから開始できます。
  • 読み取りは過去に向けられます。ポジションの履歴を再構成するインデクサーは、ログを走査しているのではなく古いバージョンを問い合わせています。
  • プルーニングは、構造上の制約ではなく、どこまで遡って保持するかというポリシーの判断になります。

最終的にコミットされるもの

カーネルの実行は、ブロックごとに2種類のものを生み出します。各トランザクションは、それ自身に紐づいた書き込みとイベントを持ちます。単一のユーザートランザクションに属さない効果(資金調達フロー、保険基金の移動、ブロック単位のカウンタ)は、専用のシステムチャネルへ送られます。 この2つの間で失われるものはありません。カーネル内部の実行効果で、トランザクションの出力にもシステムチャネルにも現れないものは存在しません。この完全性があるからこそ、コミット済みの記録は要約ではなく全体像として扱えます。マッチングがバッチで走った場合でもイベントを原因のトランザクションまで辿れるのは、このためです。

次に読む

ストレージと証明

コミット済みの状態が物理的にどう保存され、認証され、プルーニングされるのかです。

ステートシンク

チェーンを一度も見たことのないノードが、どうやって追いつくのかです。

IntentionKernel

エンジン状態とブロックワーキングセットが存在する場所です。

インデクサー

コミット済みの状態を、照会可能なものに変えます。