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

# Indexer

> Wie festgeschriebene Blöcke zu abfragbaren Daten werden – der Streaming-Pfad von einer Full Node zu den REST- und WebSocket-Schnittstellen.

Die Chain schreibt Blöcke fest. Anwendungen stellen Fragen wie *welche Ausführungen hatte dieses Konto letzte Woche* und *wie sieht das Buch gerade aus* – Fragen, die ein blockförmiger Datensatz schlecht beantwortet. Der Indexer ist das, was das eine in das andere überführt.

Auf den meisten Chains ist der Indexer infrastrukturkritisch: Die Chain gibt undurchsichtige Events aus, Dritte rekonstruieren daraus die Bedeutung, und was Ihre Anwendung für wahr hält, hängt davon ab, welchem Indexer sie vertraut. Hier entfällt der Rekonstruktionsschritt. Der [Kernel](/de/protocol/architecture/kernel) gibt typisierte, zugerechnete Ausgabedaten aus – jede Zustandsänderung ist bereits an die Transaktion gebunden, die sie verursacht hat –, sodass der Indexer Daten umformt, statt sie zu erschließen.

Das ändert, wozu der Indexer da ist. Er ist eine **Auslieferungsschicht**, keine Quelle der Wahrheit. Alles, was er meldet, lässt sich gegen die Chain prüfen, und eine Abweichung ist ein Fehler im Indexer und keine offene Frage.

<h2 id="the-path">
  Der Pfad
</h2>

<div className="dg" data-dg="indexer-path">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-wire dg--blue dg-soft" d="M 123.00 102.00 L 155.98 75.97" />

      <path className="dg-head dg--blue" d="M 161.00 72.00 L 158.70 79.42 L 153.25 72.51 Z" />

      <path className="dg-wire dg--blue dg-soft" d="M 123.00 102.00 L 156.23 131.73" />

      <path className="dg-head dg--blue" d="M 161.00 136.00 L 153.30 135.01 L 159.16 128.45 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 349.00 72.00 L 381.98 98.03" />

      <path className="dg-head dg--sky" d="M 387.00 102.00 L 379.25 101.49 L 384.70 94.58 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 349.00 136.00 L 382.23 106.27" />

      <path className="dg-head dg--sky" d="M 387.00 102.00 L 385.16 109.55 L 379.30 102.99 Z" />

      <path className="dg-wire dg--green" d="M 536.00 102.00 L 551.60 102.00" />

      <path className="dg-head dg--green" d="M 558.00 102.00 L 551.60 106.40 L 551.60 97.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"20.8333%",top:"8.1761%",width:"29.1667%",height:"47.7987%"}}><span className="dg-cap">nach Alter geteilt</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"19.4969%",width:"16.3889%",height:"25.1572%"}}><span className="dg-t">Full Node</span><span className="dg-s">festgeschriebene Blöcke, typisiert gestreamt</span></div>
    <div className="dg-b dg--sky" style={{left:"23.0556%",top:"14.4654%",width:"24.7222%",height:"16.3522%"}}><span className="dg-t">Cache</span><span className="dg-s">aktuell – aus dem Speicher</span></div>
    <div className="dg-b dg--sky" style={{left:"23.0556%",top:"34.5912%",width:"24.7222%",height:"16.3522%"}}><span className="dg-t">Dateispeicher</span><span className="dg-s">historisch – dauerhaft</span></div>
    <div className="dg-b dg--sky" style={{left:"54.4444%",top:"19.4969%",width:"19.4444%",height:"25.1572%"}}><span className="dg-t">Datendienst</span><span className="dg-s">zeigt beides als einen Stream</span></div>
    <div className="dg-b dg--green" style={{left:"78.0556%",top:"19.4969%",width:"21.9444%",height:"25.1572%"}}><span className="dg-t">Gateway → REST · WebSocket</span><span className="dg-s">Zugriff, Quoten, Routing</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"67.2956%",width:"48.8889%",height:"27.6730%"}}><span className="dg-t">Warum es die Trennung gibt</span><span className="dg-s">Dem Chain-Kopf zu folgen ist latenzempfindlich und klein; historische Abfragen sind durchsatzempfindlich und groß. Ein Backfill auf demselben Pfad würde den Live-Pfad blockieren.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"51.1111%",top:"67.2956%",width:"48.8889%",height:"27.6730%"}}><span className="dg-t">Eine Auslieferungsschicht, keine Quelle der Wahrheit</span><span className="dg-s">Der Kernel gibt typisierte, zugerechnete Daten aus, also formt der Indexer um, statt zu erschließen. Eine Abweichung von der Chain ist ein Fehler im Indexer.</span></div>
  </div>
</div>

**Eine Full Node** ist der Ursprung. Handelsdatensätze werden aus ihr als typisierte Daten gestreamt, nicht als rohe Transaktionen, die erst interpretiert werden müssen.

**Cache und Dateispeicher** teilen den Stream nach Alter auf. Aktuelle Daten werden aus dem Arbeitsspeicher bedient, weil die meisten Konsumenten genau das wollen und weil es auf die Latenz ankommt. Historische Daten werden in dauerhaften Dateispeicher geschrieben, denn alles im Arbeitsspeicher vorzuhalten ist keine Strategie. Ein Konsument, der etwas Altes abfragt, und einer, der dem Chain-Kopf folgt, werden aus verschiedenen Quellen bedient, ohne dass einer von beiden es merkt.

**Der Datendienst** präsentiert beides als einen Stream. Ein Client fordert einen Bereich an, der irgendwo beginnt; ob dieser Bereich aus dem Cache, aus Dateien oder aus beidem bedient wird, ist nicht sein Problem.

**Das Gateway** übernimmt, was zwischen einen Dienst und das öffentliche Internet gehört: Zugriff, Kontingente und Routing.

**Die REST- und WebSocket-Schnittstellen** sind das, was Anwendungen tatsächlich nutzen – Marktdaten, Order- und Ausführungshistorie, Positionen, Kontozustand, Funding-Zahlungen und Live-Abonnements. Die Details auf Endpunktebene stehen in der [API-Referenz](https://testnet-openapi.intention.xyz/).

<h2 id="why-the-split-exists">
  Warum es die Trennung gibt
</h2>

Ein einzelner Dienst, der zugleich dem Chain-Kopf folgt und historische Abfragen beantwortet, könnte beides nicht gut. Das Verfolgen des Chain-Kopfs ist latenzempfindlich und klein; historische Abfragen sind durchsatzempfindlich und groß, und ein einziges großes Backfill würde den Live-Pfad blockieren.

Die Trennung bedeutet: Ein Monate zurückreichendes Backfill für einen neuen Konsumenten verschlechtert den Feed eines Market Makers am Chain-Kopf nicht, und beide lassen sich unabhängig skalieren – was auch nötig ist, weil ihre Lastprofile nichts gemeinsam haben.

<h2 id="what-it-is-safe-to-rely-on">
  Worauf man sich verlassen kann
</h2>

**Verlässlich.** Alles, was der Indexer ausliefert und aus festgeschriebenen Blöcken abgeleitet ist: Ausführungen, Orders, Positionen, Funding-Zahlungen, Transfers, Marktdaten. Das sind umgeformte Ausgabedaten der Chain.

**Etwas anderes.** Alles, was noch nicht festgeschrieben ist. Eine Order, die in den [Mempool](/de/protocol/architecture/mempool) aufgenommen wurde, hat noch keinen Platz in der Reihenfolge, und der Indexer hat dazu nichts zu sagen. Fehlt etwas im Indexer, ist es noch nicht festgeschrieben – nicht abgelehnt.

**Überprüfbar.** Wenn eine Antwort wichtig genug ist – ein Abrechnungsstreit, ein Audit, ein buchhalterischer Abgleich –, lässt sie sich direkt gegen die Chain prüfen, statt sie dem Indexer zu entnehmen. Eine eigene Full Node ist die stärkste Form davon – wer sich keinen Irrtum leisten kann, sollte eine betreiben. Siehe [Node betreiben](/de/developers/run-a-node).

<Note>
  Zwei Konsumenten, die denselben festgeschriebenen Bereich lesen, sollten dieselbe Antwort erhalten. Wenn nicht, liegt die Abweichung im Auslieferungspfad und ist ein Fehler, den man melden sollte – keine inhärente Eigenschaft davon, eine Chain über einen Indexer zu lesen.
</Note>

<h2 id="where-to-go-next">
  Wie es weitergeht
</h2>

<CardGroup cols={2}>
  <Card title="Zustandsmodell" href="/de/protocol/architecture/state/model">
    Was der Indexer liest und welche Darstellung maßgeblich ist.
  </Card>

  <Card title="Entwickler" href="/de/developers/overview">
    REST- und WebSocket-Schnittstellen, SDKs und Werkzeuge.
  </Card>

  <Card title="Node betreiben" href="/de/developers/run-a-node">
    Selbst gegen die Chain prüfen, und warum das Set geschlossen ist.
  </Card>

  <Card title="Programmdienste" href="/de/protocol/architecture/programs">
    Was diesen Stream konsumiert, um abgeleiteten Kontozustand zu berechnen.
  </Card>
</CardGroup>
