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

# Speicherung und Beweise

> Wie festgeschriebener Zustand über drei RocksDB-Stores persistiert, durch einen versionierten Merkle-Baum und Akkumulatoren authentifiziert und mit der Zeit beschnitten wird.

Festgeschriebener Zustand muss zwei Anforderungen genügen, die gegeneinander ziehen. Die Ausführung will den aktuellen Wert eines Schlüssels, schnell, millionenfach. Die Verifikation will einen Beweis dafür, dass ein Wert bei einer bestimmten Version das war, was das Netzwerk sagt. Beides aus einer Struktur zu bedienen heißt, beides schlecht zu tun.

Die Speicherung teilt das Problem deshalb auf getrennte Stores auf, jeder auf sein eigenes Zugriffsmuster zugeschnitten.

<h2 id="three-stores">
  Drei Stores
</h2>

<div className="dg" data-dg="storage-stores">
  <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--green dg-dash" d="M 434.00 48.00 L 459.60 48.00" />

      <path className="dg-head dg--green" d="M 466.00 48.00 L 459.60 52.40 L 459.60 43.60 Z" />

      <path className="dg-wire dg--green dg-dash" d="M 434.00 144.00 L 459.60 144.00" />

      <path className="dg-head dg--green" d="M 466.00 144.00 L 459.60 148.40 L 459.60 139.60 Z" />

      <path className="dg-wire dg--green dg-dash" d="M 434.00 240.00 L 459.60 240.00" />

      <path className="dg-head dg--green" d="M 466.00 240.00 L 459.60 244.40 L 459.60 235.60 Z" />

      <path className="dg-wire dg--blue dg-soft" d="M 135.00 144.00 L 172.54 53.91" />

      <path className="dg-head dg--blue" d="M 175.00 48.00 L 176.60 55.60 L 168.48 52.22 Z" />

      <path className="dg-wire dg--blue dg-soft" d="M 135.00 144.00 L 168.60 144.00" />

      <path className="dg-head dg--blue" d="M 175.00 144.00 L 168.60 148.40 L 168.60 139.60 Z" />

      <path className="dg-wire dg--blue dg-soft" d="M 135.00 144.00 L 172.54 234.09" />

      <path className="dg-head dg--blue" d="M 175.00 240.00 L 168.48 235.78 L 176.60 232.40 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"31.3253%",width:"18.0556%",height:"24.0964%"}}><span className="dg-t">Festgeschriebener Block</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"25.0000%",top:"2.4096%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">Ledger-Store</span><span className="dg-s">Transaktionen · Ausgaben · Ereignisse · Write Sets · Akkumulatoren · Blockmetadaten</span></div>
    <div className="dg-b dg--green" style={{left:"65.2778%",top:"2.4096%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">Replay und Audit</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"25.0000%",top:"31.3253%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">State-KV-Store</span><span className="dg-s">aktuelle und historische Werte, 16 Shards, heißer Zustand in eigener Stufe</span></div>
    <div className="dg-b dg--green" style={{left:"65.2778%",top:"31.3253%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">Abfragen und Ausführung</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"25.0000%",top:"60.2410%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">State-Merkle-Store</span><span className="dg-s">ein versionierter Sparse Merkle Tree, dazu die Indizes über überholte Knoten</span></div>
    <div className="dg-b dg--green" style={{left:"65.2778%",top:"60.2410%",width:"34.7222%",height:"24.0964%"}}><span className="dg-t">Verifikation – Beweise</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.1566%",width:"100.0000%"}}><div className="dg-n">Ein Lesezugriff, der nur einen Wert braucht, zahlt nicht für die Baumtraversierung, und ein Beweis wird nicht aus einem Store rekonstruiert, der für Punktabfragen optimiert ist.</div></div>
  </div>
</div>

**Der Ledger-Store** hält die Historie der Chain: Transaktionen, ihre Ausgaben und Zusatzdaten, Ereignisse, Write Sets, Blockmetadaten und die Akkumulatoren. Das ist der Teil, den ein Replay durchläuft.

**Der State-KV-Store** hält Zustandswerte, adressiert über Schlüssel und Version. Aus ihm lesen Ausführung und Abfragen. Er ist **sechzehnfach geshardet**, sodass sich die Schreibvorgänge eines Blocks auf sechzehn unabhängige RocksDB-Instanzen verteilen, statt sich in einer einzigen zu stauen. Häufig genutzter Zustand liegt zusätzlich in einer eigenen Stufe, damit das Working Set eines aktiven Marktes nicht unter allem gesucht werden muss, was die Chain je gespeichert hat.

**Der State-Merkle-Store** hält die authentifizierte Struktur – die Baumknoten, mit denen sich ein Wert beweisen lässt, und die Indizes, die festhalten, welche Knoten überholt sind.

Die Trennung bewirkt, dass ein Lesezugriff, der nur einen Wert braucht, nicht für die Baumtraversierung zahlt, und dass ein Beweis nicht aus einem Store rekonstruiert werden muss, der für Punktabfragen optimiert ist.

<h2 id="authentication">
  Authentifizierung
</h2>

Zwei Merkle-Strukturen erledigen verschiedene Aufgaben.

<div className="dg" data-dg="storage-proofs">
  <div className="dg-c" style={{aspectRatio:"720 / 400"}}>
    <svg className="dg-w" viewBox="0 0 720 400" aria-hidden="true">
      <path className="dg-wire" d="M 173.50 98.50 L 173.50 110.10" />

      <path className="dg-head" d="M 173.50 116.50 L 169.10 110.10 L 177.90 110.10 Z" />

      <path className="dg-wire" d="M 173.50 169.00 L 173.50 180.60" />

      <path className="dg-head" d="M 173.50 187.00 L 169.10 180.60 L 177.90 180.60 Z" />

      <path className="dg-wire" d="M 173.50 239.50 L 173.50 251.10" />

      <path className="dg-head" d="M 173.50 257.50 L 169.10 251.10 L 177.90 251.10 Z" />

      <path className="dg-wire" d="M 546.50 122.00 L 546.50 133.60" />

      <path className="dg-head" d="M 546.50 140.00 L 542.10 133.60 L 550.90 133.60 Z" />

      <path className="dg-wire" d="M 546.50 216.00 L 546.50 227.60" />

      <path className="dg-head" d="M 546.50 234.00 L 542.10 227.60 L 550.90 227.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"0.0000%",top:"6.5000%",width:"48.1944%",height:"72.5000%"}}><span className="dg-cap">Versionierter Sparse Merkle Tree</span></div>
    <div className="dg-band" style={{left:"51.8056%",top:"6.5000%",width:"48.1944%",height:"72.5000%"}}><span className="dg-cap">Akkumulatoren</span></div>
    <div className="dg-b dg--blue" style={{left:"2.2222%",top:"12.5000%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">Ihr Schlüssel und sein Wert</span></div>
    <div className="dg-b" style={{left:"2.2222%",top:"30.1250%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">Geschwister-Hash</span></div>
    <div className="dg-b" style={{left:"2.2222%",top:"47.7500%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">Geschwister-Hash</span></div>
    <div className="dg-b dg--green" style={{left:"2.2222%",top:"65.3750%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">State-Root, konsensbestätigt</span></div>
    <div className="dg-b dg--blue" style={{left:"54.0278%",top:"12.5000%",width:"43.7500%",height:"17.0000%"}}><span className="dg-t">Ihre Transaktion oder ein Ereignis</span></div>
    <div className="dg-b" style={{left:"54.0278%",top:"36.0000%",width:"43.7500%",height:"17.0000%"}}><span className="dg-t">Transaktionsakkumulator · Ereignisakkumulator</span><span className="dg-s">legt sich auf alles bisher Aufgenommene fest, geordnet</span></div>
    <div className="dg-b dg--green" style={{left:"54.0278%",top:"59.5000%",width:"43.7500%",height:"17.0000%"}}><span className="dg-t">Ledger-Root, konsensbestätigt</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"83.0000%",width:"100.0000%",height:"14.5000%"}}><span className="dg-s">Der Baum beweist, was ein Wert war; die Akkumulatoren beweisen, was passiert ist und in welcher Reihenfolge. Zusammen machen sie „diese Transaktion steht an dieser Stelle in der Chain“ beweisbar, ohne die Chain zu halten.</span></div>
  </div>
</div>

**Ein versionierter Sparse Merkle Tree** authentifiziert den Zustand. Jeder Schlüssel hat eine Position, die sein Hash bestimmt, und jede Version des Baums teilt sich die Knoten, die sich nicht geändert haben – das Schreiben eines Schlüssels in einem Block fügt also einen Pfad hinzu, keinen Baum. Ein Beweis für einen Schlüssel bei einer Version ist der Pfad von dessen Blatt bis zu der Wurzel, die das Netzwerk festgeschrieben hat.

**Akkumulatoren** authentifizieren die Reihenfolge. Einer akkumuliert Transaktionen, einer Ereignisse; jeder erzeugt eine Wurzel, die sich auf alles bisher Aufgenommene in genau dieser Reihenfolge festlegt. Das macht „diese Transaktion steht an dieser Stelle in der Chain“ beweisbar, ohne die Chain zu halten.

Zusammen: Der Zustandsbaum beweist, *was ein Wert war*, die Akkumulatoren beweisen, *was passiert ist und in welcher Reihenfolge*.

<h3 id="speculative-state">
  Spekulativer Zustand
</h3>

Die Ergebnisse eines Blocks existieren, bevor sie festgeschrieben werden. Statt sie in den dauerhaften Baum zu schreiben und das rückgängig zu machen, falls der Block nicht festgeschrieben wird, liegt nicht festgeschriebener Zustand in einem **Sparse-Merkle-Overlay im Arbeitsspeicher** über der zuletzt festgeschriebenen Version.

Die Ausführung liest durch das Overlay hindurch und sieht eine konsistente Sicht. Wird der Block festgeschrieben, wird das Overlay materialisiert. Wird er es nicht, wird das Overlay verworfen, und nichts Dauerhaftes wurde je angefasst. Genau das verhindert, dass spekulative Ausführung Müll in der Speicherung hinterlässt.

### Caching

Baumknoten werden auf zwei Ebenen zwischengespeichert: ein versionsbewusster Cache, der jüngere Versionen adressierbar hält, und darunter ein Least-Recently-Used-Cache. Das Zugriffsmuster einer Trading-Chain – eine kleine Menge heißer Schlüssel, die jeder Block berührt, gegen einen langen Schwanz, der selten berührt wird – ist genau die Form, für die sie gemacht sind.

## Pruning

Dass jede Version für immer erhalten bleibt, ist eine Entscheidung, keine Vorgabe. Drei unabhängige Pruner laufen gegen die drei Stores, jeder mit eigener Aufbewahrungsrichtlinie: einer über das Ledger, einer über die Zustandswerte, einer über die Merkle-Knoten.

Der Merkle-Pruner und der Zustandswert-Pruner werden von **Stale-Indizes** gesteuert, die gleichzeitig mit den Daten geschrieben werden. Überholt eine Version einen Knoten oder einen Wert, wird der überholte Eintrag bei dieser Version als stale vermerkt. Pruning ist damit ein Bereichsscan über einen Index statt einer Suche nach Müll – der Schreiber hat bereits gesagt, was wann gelöscht werden kann.

<Note>
  Die Aufbewahrung ist eine Betreiberentscheidung mit realen Folgen. Eine Node mit aggressivem Pruning bedient den aktuellen Zustand effizient und kann weder historische Abfragen beantworten noch einer Node, die weiter hinten startet, die Zustandssynchronisation liefern. Eine Archiv-Node behält alles und zahlt dafür. Siehe [Node betreiben](/de/developers/run-a-node).
</Note>

<h2 id="backup-and-restore">
  Backup und Wiederherstellung
</h2>

Die Stores lassen sich unabhängig von der laufenden Node sichern und wiederherstellen. Das macht es möglich, eine Node aus einem Snapshot aufzusetzen, statt sie von Genesis an neu auszuführen, und den Zustand einer wiederhergestellten Node anhand der festgeschriebenen Wurzeln zu prüfen, statt dem Backup zu vertrauen.

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

<CardGroup cols={2}>
  <Card title="Zustandssynchronisation" href="/de/protocol/architecture/state/sync">
    Wie eine Node zur Chain aufschließt, ohne sie ganz erneut auszuführen.
  </Card>

  <Card title="Zustandsmodell" href="/de/protocol/architecture/state/model">
    Was gespeichert wird und welche Darstellung maßgeblich ist.
  </Card>

  <Card title="Indexer" href="/de/protocol/architecture/indexer">
    Historie aus festgeschriebenen Datensätzen rekonstruieren.
  </Card>

  <Card title="Node betreiben" href="/de/developers/run-a-node">
    Node-Rollen und wie man sich für den Betrieb einer Node meldet.
  </Card>
</CardGroup>
