原文
Cohort Order Book: an O(1) fully on-chain limit order book via generational fungible liquidity — Mathepreneur (2026-07-15)
コホートオーダーブック: 世代別ファンジブル流動性によるO(1)完全オンチェーン指値注文板
Ethereum Magicians向けのドラフト。特に§4の片側追加の正当化と§6のFIFOに関する懸念について批判を求む。
TL;DR
価格ポイントごとの注文が時間順の「コホート」にファンジブル化される完全オンチェーンの指値注文板です。フィルは価格ポイントごとに2つ以下のコホートに触れるため、O(1)(注文ごとのループなし)であり、部分フィルは正確で、キャンセルは「自分のポジションを引き出す」だけです。この設計の真の正当化はガス代ではなく、部分的にフィルされた価格レベルへの片側流動性追加をクリーンに受け入れる方法であるという点です。プロラタ型AMMでは、両側追加か微妙なリベース計算なしにはこれができません。その代償は、粗く調整可能なバッチFIFOです。この代償が許容できるものなのか、そしてそもそもこれを構築する価値があるのかを徹底的に検証したいと考えています。
1. 動機
オンチェーンのオーダーブックはガスに優しくありません。未約定注文をループするため、注文数に対してO(n)のコストがかかります。そのため、オンチェーン取引はAMMに収束しました。AMMは価格レベルごとに流動性をファンジブル化し(O(1)フィル)、その代わりクリーンな指値注文のセマンティクスを放棄します。
特に破綻するセマンティクスは、部分的にフィルされたレベルへの片側追加(§4)です。この投稿では、O(1)フィルとクリーンな片側追加を両立させる構造を提案し、その代償が粗いFIFOであることを正直に認めます。
2. コアアイデア — コホート
各価格ポイント(ティック)において、未約定流動性はコホート — ファンジブルなバッチ(コホートごとに1つのファンジブルトークン) — に存在します。常に最大2つのコホートが稼働中です。
- ステージング (Staging) — 新しい注文が着地する場所。まだフィルされていない。
- オープン (Open) — 現在フィルされているバッチ。凍結済み(新しい注文は参加できない)。
3. メカニズム
- 注文 (Place) → 現在のステージングコホートのシェアをミントする。
- 昇格 (Promote) → この価格での最初のフィル時に、ステージングは凍結 → オープンとなり、新しいステージングがオープンする。
- フィル (Fill) → オープンコホートを消費する。これは単一のフィル割合(
filled / frozen total)で追跡される。 - 決済 (Settle) → オープンコホートが完全に消費されると決済され(償還可能)、次のステージングが昇格する。
常に1つのオープンコホートと1つのステージングコホートしか稼働していないため、フィルは価格ポイントごとに**2つ以下のコホートに触れるため、O(1)**となります(決済されたコホートは償還を待つだけで、LPあたりO(1))。複数のティックをまたぐトレードは、他のティックベースのAMMと同様にO(ティックをまたいだ数)です。
フィル時凍結 (Freeze-on-fill) は、正確な部分フィル会計を可能にします。各コホートは単一のクリーンなフィル割合を持ち、新しい注文が他の誰かの部分フィルを引き継ぐことはありません。
例(1ティック): アリス100 + ボブ50 → ステージングC1=150。90フィル → C1凍結(60%フィル済み)、新しいステージングC2。キャロル30 → C2=30。60フィル → C1完全に決済。20フィル → C2昇格、67%消費。
4. なぜそもそも世代が必要なのか? — 片側追加の問題
これが実際の正当化であり、見落とされがちです。
指値注文は片側(単一のトークンをある価格で提示する)です。プロラタ型AMM(Uniswap V3のレンジ注文)では、ティックが部分的にクロスされた(価格がレンジ内に入った)後、流動性を追加できるのは現在の2トークン比率のみであり、片側流動性をクリーンに補充することはできません。実際には、V3のレンジ注文ユーザーは、部分フィル中に追加するたびに新しいポジションを開いています。つまり、彼らは手動で世代を作成しているのです。
LPごとのアキュムレータを使って片側追加をプールすることは可能ですが、フィルを消費すると、カウンターアセットを蓄積しながら残りの片側残高をリベースすることになります。これはリベーストークンと報酬の会計であり、実行可能ではあるものの、微妙でエラーが発生しやすいものです。
コホートは、「追加ごとに新しいポジション」という回避策を自動化します。部分的にフィルされたバッチを凍結し、新しい片側流動性を、クリーンな0%フィル済みバッチにルーティングするのです。これが真の価値です。
これを可能にする構造 — 次のバッチを昇格させる前にオープンバッチを使い切る — は、コホート間でバッチFIFOの順序付けを課すものでもあります。これが主要なトレードオフであり、§6で議論します。
5. 先行研究(これは単独では新規性がない)
- Ambient (CrocSwap) の「ノックアウト流動性」は本質的にこれです。クロスされたときに完全に変換される集中流動性としてのオンチェーン指値注文であり、片側追加と部分フィルを正確に処理するためにピボット/エポック — 別の名前のコホート — を使用しています。この投稿は、そのパターンをスタンドアロンのオーダーブックとして一般化/形式化したものです。
- Trader Joe Liquidity Book — ビンごとのファンジブル流動性(繰り返し発生する両側エンドポイント)。
- Uniswap V3/V4のレンジ注文 +
feeGrowth— プロダクションにおけるプロラタ型アキュムレータの代替案。
片側追加をよりクリーンに処理する先行研究があれば、ぜひ教えていただきたいです。
6. 既知の懸念事項 / 反発が予想される点
これらは現実的な懸念であるため、正直に述べます。
- オンチェーンでのFIFOは、厳密には真のFIFOではない可能性がある。 ブロック内の順序付けはビルダー(MEV)によって決定されるため、「時間優先」は部分的にオークションで決定され、獲得されるものではありません。昇格境界(「最初のフィルでコホートが凍結される」)自体が、グリーフィング/MEVの対象となる可能性があります(ライバルコホートを凍結させるためのダストフィル、既知の大量フィル前にステージングにスナイプする)。緩和策: コホートを粗くする(最初のフィルごとではなく、ボリューム/時間閾値で昇格させる)ことで、大規模バッチ内ではプロラタとなり、稀な境界でのみFIFOとなるようにする — しかし、これで完全に解決するのでしょうか?
- キューの先頭での逆選択。 最も古いコホートが最初にフィルされる、つまり有害なフローによって最初に選ばれます。「優先順位」は毒杯かもしれません。
- 新規流動性の阻害。 後のコホートは最後にフィルされるので、動きの直前に深度を追加する意味があるのでしょうか?プロラタはいつでも流動性を歓迎します。
- 資本 + 逆選択。 一回限りの未約定注文は待っている間何も得られず、テイカーにとってフリーオプションとなります(オンチェーンオーダーブックがAMMに敗れた古典的な理由)。これはコホート構造とは独立した問題です。
- オフチェーンインテント(CoW/1inch/UniswapX: ガスレス、ロックアップなし、無料キャンセル)やAMMレンジ注文がすでにほとんどの指値注文需要を満たしていることを考えると、片側指値UXは構築する価値があるのか。
事前に徹底的に議論してくれることに感謝します。
1投稿 - 1参加者