El archivo histórico y la lectura del pasado
Los nodos normales de ZooBC solo conservan el historial reciente: de 30 a 60 días de bloques y sus tres instantáneas más recientes. El archivo histórico responde a las preguntas sobre el pasado lejano, como el saldo de una cuenta hace tres años: todas las instantáneas desde el bloque 0, repartidas por el almacenamiento descentralizado en lugar de guardadas en una sola máquina, y comprobables byte a byte contra la cadena spine.
Lo que conserva cada nodo
Cada 172 800 bloques (unos 30 días) en mainnet, cada nodo escribe una instantánea: todo el estado de la cadena, cada saldo, cada plaza del registro y cada registro, tal como estaba 760 bloques por debajo de esa altura. Los nodos escalonan el trabajo, pero los bytes de todos los nodos son idénticos. Una instantánea es un único documento CBOR, cortado en trozos de 102 400 bytes que se nombran por sus hashes SHA3-256. Su manifiesto, con el hash del archivo completo, el hash de cada trozo y la altura de referencia, se publica en un bloque de la cadena spine, la cadena lenta de bloques diarios cofirmados por dos tercios de las plazas registradas.
Nada en una instantánea va firmado. Su autoridad es el bloque de la spine cofirmado que la nombra, así que una instantánea es auténtica la sirva quien la sirva, siempre que sus bytes coincidan con los hashes del manifiesto. Las instantáneas son además la forma en que un nodo nuevo se incorpora deprisa (instantáneas y sincronización rápida).
Cada nodo solo conserva en su propio disco sus tres generaciones de instantáneas más recientes. Es todo lo que necesita un nodo para ayudar a otros a incorporarse, y conservar en cada nodo todas las instantáneas jamás hechas le costaría a cada operador más disco cada mes. Los bloques antiguos también se podan (poda del historial).
El archivo histórico
A partir de la versión 0.5.8 es el almacenamiento descentralizado, y no cada nodo, el que conserva todas las instantáneas desde el bloque 0. Los trozos de cada instantánea los guardan cinco nodos registrados elegidos por sorteo (storage_replication), como los fragmentos de cualquier archivo almacenado (almacenamiento descentralizado). Cada nodo solo conserva sus tres últimas instantáneas; ningún nodo las conserva todas.
Ninguna máquina tiene por sí sola el historial, así que ningún operador puede perderlo ni retenerlo por sí solo. Un servidor de archivo gestionado por una sola organización, aunque fuera la ZooBC Foundation, sería exactamente ese punto único. Tampoco se descarta nada: el archivo histórico se remonta a la primera instantánea.
Guardar trozos del archivo histórico forma parte del deber de almacenamiento de un nodo registrado. En cada época de almacenamiento, el 10 % del fondo de longevidad se paga a partes iguales a los nodos que demuestran los trozos muestreados (fondos).
Leer el pasado
Quien quiera el estado en un momento pasado recorre la spine hacia atrás hasta la instantánea tomada en ese momento y lee su manifiesto. Descarga los trozos de la instantánea de sus poseedores y comprueba cada uno con su hash en el manifiesto, de modo que un poseedor no pueda colar un trozo falso. Después vuelve a montar la instantánea, comprueba el hash del conjunto y reconstruye el estado en esa altura: cada saldo, cada plaza y cada registro de ese momento. Ningún nodo tiene por sí solo el historial, y no hace falta ningún nodo de archivo.
Las comprobaciones no requieren confiar en los poseedores: la spine la cofirman las plazas, y sus manifiestos fijan el hash de cada trozo, así que un trozo falso se detecta al instante.
Otras formas de ver el pasado
- Un depósito de longevidad mantiene una transacción elegida, y su bloque, en cada nodo mientras dure el depósito (pagar por conservar datos (longevidad)).
- Un operador puede conservar todo el historial en su propio nodo con
keep_all_history; es una elección local, no el comportamiento por defecto. - Los nodos de archivo ejecutan un servicio de indexación junto a un nodo y sirven las búsquedas y las estadísticas del explorador (explorador y los nodos de archivo).