Wiki de ZooBC
Seguridad y arquitectura

Instantáneas y sincronización rápida

Un nodo que se incorpora a una cadena que tiene años no tiene que reproducir todos los bloques desde el bloque 0. Sigue la cadena spine, descarga la última instantánea que nombra la spine, la comprueba fragmento a fragmento y frente a sus pares, y después solo aplica los bloques producidos desde entonces. Esto es la sincronización rápida. En ningún momento el nodo se fía de la palabra de un sitio web o de un solo par sobre el estado de la cadena.

Instantáneas

Una instantánea es todo el estado de la cadena, cada saldo, cada plaza y cada registro, en una altura. Cada main_snapshot_interval bloques, 172 800 bloques o unos 30 días en mainnet, cada nodo escribe una instantánea del estado tal como estaba 760 bloques por debajo de esa altura de disparo. (En devnet: cada 240 bloques, a 80 bloques de profundidad.) Los nodos escalonan el trabajo hasta 60 bloques, pero la instantánea de cada nodo es idéntica byte a byte.

La instantánea es un único documento CBOR que contiene las tablas de estado de la cadena (57), las cabeceras de los bloques recientes, las transacciones recientes, las transacciones cuya conservación sigue pagada (véase pagar por conservar datos (longevidad)) y los recibos publicados recientemente. Se corta en trozos de 102 400 bytes, cada uno nombrado por su hash SHA3-256. La lista de esos hashes, con el hash del archivo completo, la altura de referencia, una caducidad y el hash del génesis de la cadena, forma el manifiesto, que publica un bloque de la spine.

Nada dentro de una instantánea va firmado. Su autoridad es el bloque de la spine que la nombra: un bloque cofirmado por dos tercios de las plazas, cada una de las cuales comparó antes el manifiesto con su propia instantánea, hash por hash.

Cada nodo solo conserva sus tres generaciones de instantáneas más recientes. Todas las instantáneas desde el bloque 0 las conserva el almacenamiento descentralizado, y no cada nodo: los trozos de cada instantánea los guardan cinco nodos registrados elegidos por sorteo (véase archivo histórico y la lectura del pasado).

La sincronización rápida, paso a paso

Un nodo intenta la sincronización rápida cuando va al menos 100 bloques por detrás y tiene un manifiesto utilizable por encima de su propia altura. Debe tener el bloque de la spine que lleva el manifiesto, con sus firmas. El manifiesto más reciente sigue siendo utilizable incluso pasada su caducidad.

  1. Sincronizar la spine. Un nodo que va muy por detrás guarda un bloque de la spine cuya referencia queda por encima de su propia punta cuando ese bloque lleva su propio umbral de firmas (dos tercios, o más de la mitad en un bloque de respaldo). Comprueba el contenido del bloque más tarde, cuando su cadena principal alcanza la referencia, y se detiene con una alarma si no coincide.
  2. Descargar los trozos de pares registrados conectados, en hasta 16 partes, comprobando cada trozo con el hash que lo nombra.
  3. Comprobar el archivo completo con el hash del archivo completo del manifiesto.
  4. Cargar el estado en una sola transacción de base de datos.
  5. Comprobar una muestra con los pares (véase más abajo).
  6. Aplicar los bloques restantes uno a uno, con validación completa, hasta la punta.
Seis pasos numerados: la cadena spine (firmada por 2/3), el manifiesto (lista de hashes), los trozos de varios pares, cargar el estado, la muestra comprobada con los pares y los bloques restantes hasta la punta. Una instantánea cada 172 800 bloques (unos 30 días).
Seis pasos numerados: la cadena spine (firmada por 2/3), el manifiesto (lista de hashes), los trozos de varios pares, cargar el estado, la muestra comprobada con los pares y los bloques restantes hasta la punta. Una instantánea cada 172 800 bloques (unos 30 días).

La atestación: comprobar el estado con los pares

Que los hashes coincidan demuestra que los bytes son los que nombra el manifiesto. No demuestra que esos bytes sean el estado real. Los cofirmantes de la spine ya comparan cada manifiesto con su propia instantánea; a partir de la versión 0.5.8, un nodo que se incorpora añade una comprobación propia, por si le hubieran entregado un manifiesto falso.

Tras la carga, el nodo elige hasta 8 cuentas y 8 nodos del registro de su nuevo estado. La elección la determina el propio hash de la instantánea, de modo que todos los nodos que se incorporan eligen las mismas filas y un falsificador no puede saber de antemano cuáles hacer coherentes. El nodo pregunta a 3 pares registrados al azar el saldo de cada cuenta y la clave y el estado de cada nodo en la altura de la instantánea. Las respuestas honestas sobre una misma cadena a una misma altura son idénticas.

  • Coinciden al menos 2 pares y ninguno contradice: el nodo sigue adelante.
  • Las contradicciones no quedan en minoría: amplía la consulta a 7 pares y entonces necesita al menos 2 respuestas coincidentes y al menos dos tercios de quienes responden.
  • En caso contrario, rechaza la instantánea y vuelve a sincronizar bloque a bloque.

Si responden muy pocos pares, el nodo continúa basándose solo en los hashes.

A partir del hash de la instantánea, el nodo elige 8 cuentas y 8 nodos y pregunta a 3 pares. Al menos 2 coinciden y ninguno contradice: sigue. Las contradicciones no quedan en minoría: pregunta a 7 pares; al menos dos tercios coinciden: sigue; si no, rechaza y sincroniza bloque a bloque.
A partir del hash de la instantánea, el nodo elige 8 cuentas y 8 nodos y pregunta a 3 pares. Al menos 2 coinciden y ninguno contradice: sigue. Las contradicciones no quedan en minoría: pregunta a 7 pares; al menos dos tercios coinciden: sigue; si no, rechaza y sincroniza bloque a bloque.

Por qué puede confiarse en el resultado

  • El bloque de la spine que nombra la instantánea lo cofirmaron dos tercios de las plazas después de que cada una comparara el manifiesto con su propia instantánea.
  • Cada trozo, y el archivo completo, deben coincidir con los hashes del manifiesto.
  • Una muestra del estado cargado se comprueba con pares registrados independientes, elegidos al azar, siempre que respondan suficientes.
  • Cada bloque posterior a la instantánea se valida por completo.
  • La propia spine puede anclarse mediante el pin de versión que acompaña a la versión del nodo.

Nadie firma las instantáneas a mano, no se confía en ningún sitio web y no se reproduce nada desde el bloque 0.

Véase también