> ## 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.

# Mempool

> Wie Transaktionen aufgenommen, gehalten, geordnet und verbreitet werden, bevor der Konsens sie in einem Block festschreibt.

Der Mempool steht zwischen einer signierten Transaktion und einem festgeschriebenen Block. Er entscheidet, was es wert ist, gehalten zu werden, in welcher Reihenfolge die Transaktionen eines Absenders infrage kommen, welche Peers von einer Transaktion erfahren und was verworfen wird, wenn die Nachfrage die Kapazität übersteigt.

Für ein Handelsnetzwerk ist das tragend und nicht nebensächlich. Order- und Stornoverkehr kommt schubweise, konzentriert sich auf wenige Absender und ist auf asymmetrische Weise latenzempfindlich: Eine Stornierung, die zu spät kommt, ist schlimmer als eine Order, die zu spät kommt. Die folgenden Strukturen existieren, weil eine einzelne FIFO-Warteschlange nichts davon gut bewältigt.

<h2 id="the-path-in">
  Der Weg hinein
</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">Signierte Transaktion</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">Validierung</span><span className="dg-s">Signatur · Format · Kontozustand · kann der Absender zahlen</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">Verworfen, mit Begründung</span><span className="dg-s">nicht still – der Einreicher erfährt, warum</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">Transaktionsspeicher</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">Verteilung an Peers</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">Batch-Bildung, dann Konsens</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"85.7143%",width:"100.0000%"}}><div className="dg-n">Die Validierung ist billig und lokal – die teuren Ressourcen weiter hinten gehen nur an Transaktionen, die wirklich ausführbar sind.</div></div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"36.5079%"}}>abgelehnt</div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"51.9841%"}}>angenommen</div>
  </div>
</div>

Eine Transaktion wird validiert, bevor sie überhaupt gespeichert wird. Die Validierung ist billig und lokal – Signatur, Format, Kontozustand und ob der Absender bezahlen kann, was er verlangt – und sie existiert, damit die teuren Ressourcen weiter hinten nur für Transaktionen aufgewendet werden, die tatsächlich ausführbar wären. Eine Ablehnung an dieser Stelle gibt dem Einreicher eine Begründung zurück, statt still zu verschwinden.

<h2 id="how-transactions-are-held">
  Wie Transaktionen gehalten werden
</h2>

Angenommene Transaktionen liegen nicht in einer flachen Warteschlange. Der Speicher führt mehrere Sichten über dieselbe Menge, von denen jede eine andere Frage beantwortet.

<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">Eine Menge angenommener Transaktionen</span><span className="dg-s">fünf Sichten, keine fünf Queues</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">Reihenfolge je Konto</span><span className="dg-s">Was ist für diesen Absender die nächste?</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">Prioritätsindex</span><span className="dg-s">Was wird dem Konsens über alle Absender zuerst angeboten?</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">Ablaufindex</span><span className="dg-s">Was hat seine Frist überschritten?</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">Timeline-Index</span><span className="dg-s">Wovon hat dieser Peer noch nichts gehört?</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">Parkplatz</span><span className="dg-s">Was ist wohlgeformt, aber noch nicht dran?</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.1566%",width:"100.0000%"}}><div className="dg-n">Auf dem Parkplatz wird ein Integrationsfehler sichtbar: Eine Transaktion, die gültig, aber für ihren Absender noch nicht die nächste ist, wird geparkt statt abgelehnt – sie kommt infrage, sobald sich die Lücke davor schließt.</div></div>
  </div>
</div>

| Sicht                    | Frage, die sie beantwortet                                                |
| ------------------------ | ------------------------------------------------------------------------- |
| **Reihenfolge je Konto** | Welche Transaktion ist für diesen Absender die nächste?                   |
| **Prioritätsindex**      | Was sollte über alle Absender hinweg dem Konsens zuerst angeboten werden? |
| **Ablaufindex**          | Was hat seine Frist überschritten und sollte entfernt werden?             |
| **Timeline-Index**       | Wovon hat dieser Peer noch nichts gehört?                                 |
| **Parkplatz**            | Was ist wohlgeformt, kommt aber noch nicht infrage?                       |

Der **Parkplatz** verdient die meiste Aufmerksamkeit, weil dort eine ganze Klasse von Integrationsfehlern sichtbar wird. Eine Transaktion kann vollkommen gültig sein und trotzdem nicht als Nächste für ihren Absender an der Reihe sein – meist, weil eine frühere Transaktion desselben Kontos nicht angekommen oder nicht festgeschrieben ist. Eine solche Transaktion wird geparkt statt abgelehnt: Sie bleibt verfügbar und kommt in dem Moment infrage, in dem sich die Lücke vor ihr schließt. Ein Client, der außer der Reihe einreicht, erlebt also eine Verzögerung und keinen Fehlschlag – aber ein Client, der die Lücke nie füllt, lässt Arbeit geparkt liegen, bis sie verfällt.

Der **Timeline-Index** macht die Verbreitung an Peers inkrementell. Für jeden Peer wird festgehalten, bis wohin auf der Timeline er bereits bedient wurde, sodass eine Verteilung genau das sendet, was diesem Peer fehlt, statt den ganzen Pool erneut zu schicken. Die Timeline ist in Buckets aufgeteilt statt einspurig, was verhindert, dass ein einzelner besonders aktiver Absender jeden Sendeslot belegt.

<h2 id="dissemination-and-fairness">
  Verbreitung und Fairness
</h2>

Nicht jede Node erfährt unabhängig von den anderen von einer Transaktion. Eine Node, die eine Transaktion annimmt, verteilt sie an ihre Peers, und die Peers werden nicht gleich behandelt – vorgelagerte Peers werden bevorzugt, damit eine Transaktion sich auf die Validatoren zubewegt, die auf sie reagieren können, statt gleichmäßig ins Netzwerk zu diffundieren.

Fairness wird über die jüngste Historie verfolgt und nicht pro Nachricht erzwungen. Der Mempool führt eine gleitende Aufzeichnung darüber, welche Absender und welche Verkehrsarten zuletzt Kapazität verbraucht haben, und formt damit, was als Nächstes bedient wird. Das ist der Mechanismus, der verhindert, dass der Order-und-Storno-Sturm eines einzelnen Kontos den Rest des Netzwerks verdrängt – ohne ein hartes Rate-Limit je Konto, das legitimes Market Making bestrafen würde.

<h2 id="handoff-to-consensus">
  Übergabe an den Konsens
</h2>

Der Konsens holt sich Transaktionen nicht einzeln aus dem Mempool. Transaktionen werden zu **Batches** gebündelt, Batches werden im Hintergrund an die Validatoren verbreitet, und jeder Batch wird quittiert, bis sein Urheber nachweisen kann, dass ein ausreichender Teil des Netzwerks ihn vorhält. Erst dann kann ein Blockvorschlag ihn referenzieren.

Die Folge: Ein Blockvorschlag führt Batch-Digests statt Transaktionsrümpfen mit, sodass die Größe der Konsensnachrichten bei steigendem Durchsatz konstant bleibt – und ein festgeschriebener Block ist immer erneut ausführbar, weil die Daten dahinter als verfügbar nachgewiesen wurden, bevor sie referenziert wurden. Wie dieser Nachweis gebildet und genutzt wird, steht unter [IntentionBFT](/de/protocol/architecture/intention-bft).

<Note>
  Auch deshalb ist die Aufnahme in den Mempool nicht dasselbe wie die Aufnahme in einen Block. Eine Transaktion, die angenommen, gespeichert und verteilt wurde, ist in die Warteschlange eingetreten; einen Platz in der Reihenfolge hat sie damit nicht. Über das Schicksal einer Transaktion ist nichts entschieden, bis der Konsens den Block festschreibt, der sie enthält.
</Note>

<h2 id="what-this-means-for-a-client">
  Was das für einen Client bedeutet
</h2>

* **Eine Ablehnung beim Einreichen ist informativ.** Sie erfolgte, bevor die Transaktion gespeichert wurde, und die Begründung beschreibt etwas, das der Client beheben kann.
* **Schweigen ist keine Ablehnung.** Eine Transaktion kann hinter einer Lücke geparkt sein, die der Client selbst erzeugt hat. Verfolgen Sie, was eingereicht und was festgeschrieben wurde, statt eine fehlende Quittung als Verlust zu deuten.
* **Die Reihenfolge innerhalb eines Kontos zählt, die Reihenfolge über Konten hinweg nicht.** Zwei Transaktionen desselben Absenders haben eine definierte Abfolge. Zwei Transaktionen verschiedener Absender ordnet der Konsens, nicht wer zuerst eingereicht hat.
* **Stornierungen sind im Mempool nicht privilegiert.** Der Vorrang von Stornierungen ist eine Eigenschaft der [Kernel-Ausführung](/de/protocol/architecture/kernel), wo Stornierungen im selben Block vor aggressiven Platzierungen laufen – und keine Eigenschaft der Warteschlange.
