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

# Almacenamiento y pruebas

> Cómo se persiste el estado confirmado en tres almacenes RocksDB, cómo lo autentican un árbol de Merkle versionado y los acumuladores, y cómo se poda con el tiempo.

El estado confirmado tiene que satisfacer dos exigencias que tiran en direcciones opuestas. La ejecución quiere el valor actual de una clave, rápido, millones de veces. La verificación quiere una prueba de que un valor era lo que la red dice que era en una versión concreta. Servir ambas desde una sola estructura significa hacer las dos cosas mal.

Por eso el almacenamiento reparte el problema entre almacenes separados, cada uno con la forma de su propio patrón de acceso.

<h2 id="three-stores">
  Tres almacenes
</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">Bloque confirmado</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">Almacén del libro mayor</span><span className="dg-s">transacciones · salidas · eventos · escrituras · acumuladores · metadatos</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">Reejecución y auditoría</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">Almacén KV de estado</span><span className="dg-s">valores actuales e históricos, dieciséis fragmentos, estado caliente en su nivel</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">Consultas y ejecución</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">Almacén Merkle de estado</span><span className="dg-s">un árbol Merkle disperso versionado y los índices de nodos reemplazados</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">Verificación — pruebas</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.1566%",width:"100.0000%"}}><div className="dg-n">Una lectura que solo necesita un valor no paga recorrer el árbol, y una prueba no se reconstruye desde un almacén optimizado para consultas puntuales.</div></div>
  </div>
</div>

**El almacén del libro mayor** guarda el historial de la cadena: transacciones, sus salidas y datos auxiliares, eventos, conjuntos de escrituras, metadatos de bloque y los acumuladores. Esto es lo que se reejecuta.

**El almacén KV de estado** guarda los valores de estado, direccionados por clave y versión. Esto es lo que leen la ejecución y las consultas. Está **fragmentado en dieciséis partes**, de modo que las escrituras de un bloque se reparten entre dieciséis instancias independientes de RocksDB en vez de competir por una sola. El estado de acceso frecuente se mantiene además en su propio nivel, para que el conjunto de trabajo de un mercado activo no haya que buscarlo entre todo lo que la cadena ha almacenado alguna vez.

**El almacén Merkle de estado** guarda la estructura autenticada: los nodos del árbol que permiten probar un valor, y los índices que registran qué nodos han quedado reemplazados.

Separarlos significa que una lectura que solo necesita un valor no paga el recorrido del árbol, y que una prueba no tiene que reconstruirse desde un almacén optimizado para consultas puntuales.

<h2 id="authentication">
  Autenticación
</h2>

Dos estructuras de Merkle hacen trabajos distintos.

<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">Árbol Merkle disperso versionado</span></div>
    <div className="dg-band" style={{left:"51.8056%",top:"6.5000%",width:"48.1944%",height:"72.5000%"}}><span className="dg-cap">Acumuladores</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">Tu clave y su valor</span></div>
    <div className="dg-b" style={{left:"2.2222%",top:"30.1250%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">hash hermano</span></div>
    <div className="dg-b" style={{left:"2.2222%",top:"47.7500%",width:"43.7500%",height:"11.1250%"}}><span className="dg-t">hash hermano</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">Raíz de estado, confirmada por consenso</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">Tu transacción, o un evento</span></div>
    <div className="dg-b" style={{left:"54.0278%",top:"36.0000%",width:"43.7500%",height:"17.0000%"}}><span className="dg-t">Acumulador de transacciones · de eventos</span><span className="dg-s">cada uno fija todo lo incluido hasta ahí, y su orden</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">Raíz del libro mayor, confirmada por consenso</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">El árbol prueba cuál era un valor; los acumuladores prueban qué ocurrió y en qué orden. Juntos hacen demostrable “esta transacción está en la cadena en esta posición” sin guardar la cadena.</span></div>
  </div>
</div>

**Un árbol de Merkle disperso y versionado** autentica el estado. Cada clave tiene una posición determinada por su hash, y cada versión del árbol comparte los nodos que no cambiaron, así que escribir una clave en un bloque añade un camino, no un árbol. La prueba de una clave en una versión es el camino desde la hoja de esa clave hasta la raíz que la red confirmó.

**Los acumuladores** autentican el orden. Uno acumula transacciones y otro acumula eventos, y cada uno produce una raíz que fija todo lo incluido hasta ese punto y su orden. Esto es lo que hace demostrable “esta transacción está en la cadena en esta posición” sin tener que guardar la cadena.

Entre los dos: el árbol de estado prueba *cuál era un valor*, los acumuladores prueban *qué ocurrió y en qué orden*.

<h3 id="speculative-state">
  Estado especulativo
</h3>

Los resultados de un bloque existen antes de confirmarse. En lugar de escribirlos en el árbol duradero y deshacerlo si el bloque no se confirma, el estado sin confirmar se mantiene en una **capa Merkle dispersa en memoria** sobre la última versión confirmada.

La ejecución lee a través de esa capa y ve una vista consistente. Si el bloque se confirma, la capa se materializa. Si no, la capa se descarta y nunca se tocó nada duradero. Esto es lo que impide que la ejecución especulativa deje restos en el almacenamiento.

<h3 id="caching">
  Cachés
</h3>

Los nodos del árbol se cachean en dos niveles: una caché consciente de las versiones, que mantiene direccionables las versiones recientes, y una caché LRU por debajo. El patrón de acceso de una cadena de trading (un conjunto pequeño de claves calientes que se tocan en cada bloque, frente a una larga cola que se toca rara vez) es exactamente la forma para la que sirven.

<h2 id="pruning">
  Poda
</h2>

Conservar todas las versiones para siempre es una elección, no un requisito. Tres podadores independientes se ejecutan sobre los tres almacenes, cada uno con su propia política de retención: uno sobre el libro mayor, uno sobre los valores de estado y otro sobre los nodos Merkle.

Los podadores de Merkle y de valores de estado se guían por **índices de obsolescencia** que se escriben al mismo tiempo que los datos. Cuando una versión reemplaza un nodo o un valor, la entrada reemplazada se registra como obsoleta en esa versión. La poda es entonces un recorrido por rangos sobre un índice y no una búsqueda de basura: quien escribió ya dijo qué iba a ser recolectable y cuándo.

<Note>
  La retención es una decisión del operador con consecuencias reales. Un nodo podado de forma agresiva sirve el estado actual con eficiencia y no puede responder consultas históricas ni servir sincronización de estado a un nodo que arranque desde más atrás. Un nodo de archivo lo guarda todo y lo paga. Consulta [Ejecutar un nodo](/es/developers/run-a-node).
</Note>

<h2 id="backup-and-restore">
  Copias de seguridad y restauración
</h2>

Los almacenes se pueden respaldar y restaurar de forma independiente del nodo en ejecución, que es lo que hace posible levantar un nodo desde una instantánea en lugar de reejecutar desde el génesis, y verificar el estado de un nodo restaurado contra las raíces confirmadas en lugar de confiar en la copia.

<h2 id="where-to-go-next">
  Qué leer a continuación
</h2>

<CardGroup cols={2}>
  <Card title="Sincronización de estado" href="/es/protocol/architecture/state/sync">
    Cómo se pone al día un nodo con la cadena sin reejecutarla entera.
  </Card>

  <Card title="Modelo de estado" href="/es/protocol/architecture/state/model">
    Qué se está almacenando y qué representación tiene la autoridad.
  </Card>

  <Card title="Indexador" href="/es/protocol/architecture/indexer">
    Reconstruir el historial a partir de registros confirmados.
  </Card>

  <Card title="Ejecutar un nodo" href="/es/developers/run-a-node">
    Los roles de nodo y cómo solicitar información para operar uno.
  </Card>
</CardGroup>
