クローズドワールド実行
命令セットを閉じることは、カーネルが四度くり返す同じ動作の一例にすぎません。いずれの場合も、起こりうることの空間があらかじめ列挙され、その外にあるものは処理されるのではなく拒まれます。操作
列挙された集合に属さないペイロード。実行時ではなく検証時に拒否されます
何が要求されたのか
真
ブロック単位の作業セットを権威とみなすこと。あれはジャーナルであり、情報源はエンジン状態です
いま何が真か
入力
二台の機械で異なりうるもの一切:ウォールクロック、エントロピー、浮動小数点、ハッシュ順
別のノードでも同じバイト列になるか
因果
持ち主のない状態変化。どのユーザー取引にも属さない効果は、免除ではなくシステムチャネルを通ります
なぜこの変化が起きたのか
閉じるもの
拒むもの
だから台帳が答えられること
四つの閉包、動作はひとつ。起こりうることを前もって列挙し、外にあるものを拒む。
命令セット
参加者やバリデータにできることは、型付けされた固定の操作集合のいずれかです。
ペイロードがこの集合に属さないトランザクションは、検証の段階で拒否されます。この集合が変わるのはプロトコルのアップグレードによってのみであり、何かを新しくデプロイして変わることはありません。
ブロックの実行
実行は固定された段階の連なりです。この順序は実装上の詳細ではありません。強制決済がそれを引き起こした価格を見るかどうか、取り消しが到来するテイカー注文に勝つかどうかを決めるのが、この順序です。価格ブロックのマークを固定
ロードブロックのアカウントと注文を取り込み
資金調達ステージ資金調達フローを決済
リスクヴォールトのデレバレッジ → 強制決済 → ADL
マッチング事前処理 → マッチング → 事後処理
ファイナライズ出力を収集、不要な状態を破棄
下流のすべてのステージが、動く価格ではなく銘柄ごとにひとつの価格で判断する
決済の対象はロード時点のポジション、最終状態ではない
新しい裁量的なフローを受け入れる前に、強制的なフローを解消
リスクの後に走るからこそ、同じブロックの注文で強制決済をフロントランできない
ゼロになったポジションと空のアカウントは残らない
1ブロック、六つのステージ
この位置が決めること
条件付き注文はこの連なりの中で走査され、進められます。このブロックのマークで発火したトリガーは、次のブロックではなくこのブロックで効力を持ちます。
強制決済がマッチングより先に走ることが、同じブロック内の注文で強制決済をフロントランできない理由です。裁量的な注文がマッチングされる時点で、強制決済のフローはすでに解消されています。
二種類の状態
カーネルは、永続するものと一時的なものを厳密に分けています。ブロック実行中
エンジン状態マーケット · アカウント · 板 · ポジション · クリアリングハウスブロックをまたいで存続
ブロックワーキングセットマーク · 触れたアカウント · 約定 · 準備中の出力1ブロックだけ存在
コミット済みチェーン状態バージョン付き · 認証済み正本
変更追跡は正本と取り違えやすいものです。ブロック中の変更は決定的な出力を組み立てるためのもので、状態が置かれている場所ではありません。
エンジンを再構成する元になる正本
読み取り
適用
具体化
結果が再現できる理由
ここでの決定性は、期待ではなく強制です。同じ事前状態に対して同じブロックを実行する正直なノードは、どれもバイト単位で同じ結果を出します。実行経路上のどこからも、ノードごとに異なるものを読めないからです。- 全面的に固定小数点演算。決済の計算は、丸めの意味を明示した整数固定小数点で走ります。証拠金では負の指数で切り上げ、手数料では切り捨てと切り上げを使います。決済経路上に浮動小数点はありません。二台のマシンの間で丸めが食い違えば、それはフォークだからです。
- 実時間を使わない。ブロック内の順序づけには、コンセンサスがコミットした正規の位置とブロックのタイムスタンプを使い、ローカル時刻は決して使いません。
- 実行時の乱数を使わない。乱数が必要なものは、チェーン状態から決定的に導出します。
- 決定的な反復。反復順序が出力に現れるコレクションは、ハッシュでランダム化せず順序づけます。
リスク計算式は純粋関数
必要証拠金、強制決済価格、デレバレッジ対象の選定、手数料、建玉上限を決める計算式は、純粋なステートレス関数として実装されています。値を受け取って値を返すだけで、台帳の状態を読むことも書き換えることもありません。 状態の変更を駆動するのはクリアリングハウスだけです。クリアリングハウスがこれらの関数を呼び、結果を適用します。状態を保持するモジュール(アカウント、ポジション、板)は、データを保存し変更操作を公開しますが、業務フローそのものを駆動することはありません。 これは意図的に引いた境界です。証拠金の計算を、入力と出力の表に対して単独で検証できるということであり、誰かの残高が変わりうるコード経路がちょうどひとつしかない、ということでもあります。出力
実行は状態の書き込みとイベントを生み、そのそれぞれが原因となったトランザクションに結び付きます。加えて、どの単一ユーザートランザクションにも属さないシステムレベルの効果(資金調達フロー、保険基金の移動、ブロックカウンタ)のためのチャネルがあります。これらが、ステートレイヤーがコミットしインデクサーが提供するトランザクション出力になります。 カーネルの内部で起きたことで、下流から見えないものはありません。状態を変えたのであれば、それは誰かの出力かシステムチャネルのどちらかにあります。次に読む
マッチング
板、価格時間優先、有効期間とセルフトレード防止がどう解決されるのかです。
クリアリングハウス
残高、ポジション、証拠金が変わる唯一の経路です。
ステートモデル
カーネルの出力がコミットされたあと何になるのかです。
IntentionBFT
順序と価格がどこから来たのかです。