> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# メモリプール

> コンセンサスがブロックにコミットするまでに、トランザクションが受け入れられ、保持され、順序づけられ、伝播していく道筋です。

メモリプールは、署名済みトランザクションとコミット済みブロックの間に立つものです。何を保持する価値があるか、ある送信者のトランザクションがどの順序で処理対象になるか、どのピアがそのトランザクションを知るか、需要が容量を超えたとき何を捨てるかを決めます。

取引ネットワークにとって、これは付随的な部品ではなく荷重を受ける構造材です。発注と取り消しのトラフィックはバースト的で、送信者が偏り、遅延への敏感さが非対称です。遅れて届く取り消しは、遅れて届く注文より悪い結果になります。以下の構造が存在するのは、単一のFIFOキューではそのどれもうまく扱えないからです。

<h2 id="the-path-in">
  受け入れの経路
</h2>

<div className="dg" data-dg="mempool-admission">
  <div className="dg-c" style={{aspectRatio:"720 / 252"}}>
    <svg className="dg-w" viewBox="0 0 720 252" aria-hidden="true">
      <path className="dg-wire dg--blue" d="M 124.00 145.00 L 145.60 145.00" />

      <path className="dg-head dg--blue" d="M 152.00 145.00 L 145.60 149.40 L 145.60 140.60 Z" />

      <path className="dg-wire dg--orange" d="M 340.00 145.00 L 356.00 145.00 L 356.00 46.00 L 365.60 46.00" />

      <path className="dg-head dg--orange" d="M 372.00 46.00 L 365.60 50.40 L 365.60 41.60 Z" />

      <path className="dg-wire dg--sky" d="M 340.00 145.00 L 365.60 145.00" />

      <path className="dg-head dg--sky" d="M 372.00 145.00 L 365.60 149.40 L 365.60 140.60 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 541.00 145.00 L 566.40 120.45" />

      <path className="dg-head dg--sky" d="M 571.00 116.00 L 569.46 123.61 L 563.34 117.28 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 541.00 145.00 L 566.55 171.40" />

      <path className="dg-head dg--sky" d="M 571.00 176.00 L 563.39 174.46 L 569.71 168.34 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"46.8254%",width:"16.6667%",height:"21.4286%"}}><span className="dg-t">署名済みトランザクション</span></div>
    <div className="dg-b dg--yellow" style={{left:"21.6667%",top:"42.8571%",width:"25.0000%",height:"29.3651%"}}><span className="dg-t">検証</span><span className="dg-s">署名 · 形式 · アカウント状態 · 送信者が支払えるか</span></div>
    <div className="dg-b dg--orange dg-left" style={{left:"52.2222%",top:"7.9365%",width:"47.7778%",height:"20.6349%"}}><span className="dg-t">理由を返して破棄</span><span className="dg-s">黙って消えず、送信者に理由を返す</span></div>
    <div className="dg-b dg--sky" style={{left:"52.2222%",top:"46.8254%",width:"22.2222%",height:"21.4286%"}}><span className="dg-t">トランザクションストア</span></div>
    <div className="dg-b dg--sky" style={{left:"80.0000%",top:"36.5079%",width:"20.0000%",height:"19.0476%"}}><span className="dg-t">ピアへブロードキャスト</span></div>
    <div className="dg-b dg--sky" style={{left:"80.0000%",top:"60.3175%",width:"20.0000%",height:"19.0476%"}}><span className="dg-t">バッチ生成、そしてコンセンサス</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"85.7143%",width:"100.0000%"}}><div className="dg-n">検証は安価でローカルに完結するため、下流の高価なリソースは、実際に実行されうるトランザクションにだけ使われます。</div></div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"36.5079%"}}>拒否</div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"51.9841%"}}>受理</div>
  </div>
</div>

トランザクションは、保存される前に検証されます。検証は安価でローカルに完結します。署名、形式、アカウント状態、送信者が要求している内容の分を支払えるかどうかです。これがあるおかげで、下流の高価なリソースは、実際に実行されうるトランザクションにだけ使われます。ここでの拒否は、黙って消えるのではなく送信者に理由を返します。

<h2 id="how-transactions-are-held">
  トランザクションの保持方法
</h2>

受理されたトランザクションは、ひとつの平坦なキューには置かれません。ストアは同じ集合に対して複数のビューを維持し、それぞれが別の問いに答えます。

<div className="dg" data-dg="mempool-views">
  <div className="dg-c" style={{aspectRatio:"720 / 332"}}>
    <svg className="dg-w" viewBox="0 0 720 332" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 36.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 92.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 148.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 204.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 260.00" />
    </svg>

    <div className="dg-b dg--blue dg-round" style={{left:"0.0000%",top:"31.0241%",width:"26.3889%",height:"27.1084%"}}><span className="dg-t">受理済みトランザクションの集合</span><span className="dg-s">五つのキューではなく、五つのビュー</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"3.0120%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">アカウント別の順序</span><span className="dg-s">この送信者の次のトランザクションはどれか</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"19.8795%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">優先度インデックス</span><span className="dg-s">全送信者の中で、コンセンサスに先に渡すべきものはどれか</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"36.7470%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">有効期限インデックス</span><span className="dg-s">期限を過ぎたものはどれか</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"53.6145%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">タイムラインインデックス</span><span className="dg-s">このピアがまだ知らないものはどれか</span></div>
    <div className="dg-b dg--yellow" style={{left:"34.7222%",top:"70.4819%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">パーキングロット</span><span className="dg-s">妥当だがまだ処理対象でないものはどれか</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.1566%",width:"100.0000%"}}><div className="dg-n">パーキングロットは、連携バグが表面化する場所です。妥当でありながら送信者にとって次の順番ではないトランザクションは、拒否されずにここへ置かれ、前方の欠番が埋まった瞬間に処理対象になります。</div></div>
  </div>
</div>

| ビュー              | 答える問い                          |
| ---------------- | ------------------------------ |
| **アカウント別順序**     | この送信者にとって、次のトランザクションはどれか       |
| **優先度インデックス**    | 全送信者を通じて、まずコンセンサスに差し出すべきものはどれか |
| **有効期限インデックス**   | 期限を過ぎて削除すべきものはどれか              |
| **タイムラインインデックス** | このピアがまだ知らないものはどれか              |
| **パーキングロット**     | 形式は正しいが、まだ処理対象にならないものはどれか      |

**パーキングロット**が最も注意に値します。ある種の連携バグが表面化する場所だからです。トランザクションは、完全に妥当でありながら、その送信者にとって次の順番ではないことがあります。多くの場合、同じアカウントの先行トランザクションが到着していないか、まだコミットされていないためです。そうしたトランザクションは拒否されず、パーキングロットに置かれます。利用可能なまま保たれ、前方の欠番が埋まった瞬間に処理対象になります。したがって順序を外して送信したクライアントが経験するのは、失敗ではなく遅延です。ただし欠番を最後まで埋めないクライアントは、期限切れになるまで作業を置き去りにすることになります。

**タイムラインインデックス**は、ピアへの伝播を差分的にするものです。各ピアがタイムライン上のどこまで配信済みかを追跡するため、ブロードキャストはプール全体を再送するのではなく、そのピアに欠けているものだけを送ります。タイムラインは一本の列ではなくバケットに分かれており、これによって、重量級の送信者ひとりがブロードキャストの枠を独占することを防ぎます。

<h2 id="dissemination-and-fairness">
  伝播と公平性
</h2>

各ノードがそれぞれ独立にトランザクションを知るわけではありません。トランザクションを受理したノードはそれをピアへブロードキャストしますが、ピアは一律には扱われません。上流のピアが優先されるため、トランザクションはネットワーク全体へ均等に拡散するのではなく、それを処理できるバリデータのほうへ進みます。

公平性は、メッセージ単位で強制するのではなく直近の履歴に対して追跡されます。メモリプールは、どの送信者とどの種類のトラフィックが最近容量を消費したかをローリングで記録し、それをもとに次に何を処理するかを調整します。これが、あるアカウントの発注と取り消しの嵐がネットワークの残りを締め出さないようにする仕組みです。正当なマーケットメイクを不利にする、アカウント単位の厳格なレート制限を必要としません。

<h2 id="handoff-to-consensus">
  コンセンサスへの引き渡し
</h2>

コンセンサスは、メモリプールからトランザクションを一件ずつ取り出すわけではありません。トランザクションは**バッチ**にまとめられ、バッチはバックグラウンドでバリデータへ伝播され、各バッチは、ネットワークの十分な部分がそれを保持していると発信元が証明できるまで、受領確認を集め続けます。そこではじめて、ブロック提案がそれを参照できます。

その結果、ブロック提案はトランザクション本体ではなくバッチのダイジェストを運びます。スループットが上がっても、コンセンサスのメッセージサイズは一定のままです。コミット済みブロックも常にリプレイ可能です。その背後にあるデータは、参照される前に可用性が証明されているからです。その証明がどう作られ、どう使われるのかは[IntentionBFT](/ja/protocol/architecture/intention-bft)を参照してください。

<Note>
  これは、メモリプールに受け入れられることとブロックに含まれることが同じではない理由でもあります。受理され、保存され、ブロードキャストされたトランザクションは、列に入っただけです。順序づけられてはいません。トランザクションの行方は、それを含むブロックをコンセンサスがコミットするまで何も確定しません。
</Note>

<h2 id="what-this-means-for-a-client">
  クライアント側で押さえること
</h2>

* **送信時の拒否は情報になります**。それはトランザクションが保存される前に起きており、返される理由は、クライアント側で直せる何かを指しています。
* **無音は拒否ではありません**。トランザクションは、クライアント自身が作った欠番の後ろでパーキングロットに置かれているかもしれません。受領確認がないことを破棄と決めつけず、何を送信し、何がコミットされたかを追跡してください。
* **アカウント内の順序は意味を持ち、アカウント間の順序は意味を持ちません**。同じ送信者の二つのトランザクションには、定められた順序があります。異なる送信者の二つのトランザクションは、どちらが先に送信したかではなくコンセンサスによって順序づけられます。
* **メモリプールの中で取り消しが優遇されることはありません**。取り消しの優先は[カーネル実行](/ja/protocol/architecture/kernel)の性質であり、同じブロック内で取り消しがテイカー注文の発注より先に走るというものです。キューイングの性質ではありません。
