Finalidad y reversión
Un bloque de ZooBC pasa a ser definitivo de dos maneras. Cuando tiene más de 720 bloques (3 horas) de profundidad, ningún nodo que se mantenga al paso de la red lo revertirá. Y cuando un bloque de la spine cofirmado por dos tercios de las plazas lo nombra, a él o a un bloque posterior, como su punto de control, ningún nodo se reorganizará por debajo de él en absoluto, sea cual sea el peso que afirme tener una rama competidora. Un nodo que acaba varado en el lado equivocado de estos límites no se queda ahí: se declara atascado y se reconstruye a partir de la red.
Reversión, dentro de un límite estricto
Los nodos de ZooBC siguen la rama más pesada (véase elección de bifurcación y dificultad acumulada). Cuando un nodo descubre una rama más pesada, revierte sus propios bloques recientes hasta el punto en que se separan las dos ramas y después aplica los bloques de la otra rama, comprobando cada uno. Una reversión restaura cada tabla del estado a la altura objetivo a partir de filas con versiones, incluida la coinbase de los bloques eliminados.
Esa reversión tiene un límite estricto, max_rollback_height: 720 bloques en mainnet, 3 horas a 15 segundos por bloque, y 60 bloques (15 minutos) en devnet. Una rama que requeriría una reversión más profunda se rechaza, sea cual sea su peso.
El límite es seguro porque un nodo nunca revierte a ciegas. Descarga una rama competidora y la pesa antes de tocar su propia cadena: encuentra el verdadero punto de separación, comprueba la profundidad antes de descargar nada, pesa la rama página a página, desiste tras un número limitado de intentos y solo revierte cuando se ha demostrado que la rama es más pesada.
El suelo del punto de control
La cadena spine añade una segunda garantía, más fuerte. Cada bloque de la spine nombra un bloque de referencia de la cadena principal y lo fija exactamente, por su hash y su peso, no solo por su altura. En cuanto un nodo guarda un bloque de la spine con suficientes cofirmas, esa altura de referencia pasa a ser la altura finalizada de la cadena.
Ninguna reorganización la cruza. Un nodo rechaza una bifurcación cuyo punto de separación queda por debajo de la altura finalizada antes de descargar un solo bloque, y la vuelve a rechazar si alguna vez se le pide que elimine bloques por debajo de ella. Un bloque de la spine necesita las cofirmas de dos tercios de las plazas registradas, y cada firmante comprueba antes su contenido con su propia cadena, así que un punto de control es una declaración del registro en su conjunto. Todo nodo honesto lo trata como definitivo en cuanto lo guarda, sin esperar a más bloques de la spine.
Por qué el punto de control es más profundo que el límite de reversión
Aquí se encuentran dos cifras. Un nodo puede revertir hasta 720 bloques. Y un punto de control de la spine, como la instantánea que nombra, describe la cadena 760 bloques por debajo de la punta (main_snapshot_min_height).
Si el punto de control fuera menos profundo que el límite de reversión, la spine podría comprometerse con un bloque que una reorganización legítima aún podría sustituir, y el punto de control firmado y la cadena que sigue todo el mundo no coincidirían. Por eso el constructor del génesis exige que main_snapshot_min_height supere max_rollback_height en al menos 20 bloques. Mainnet usa 760 frente a 720, un margen de 40 bloques; devnet mantiene la misma forma con 80 frente a 60. Todo bloque que nombra un punto de control queda ya más allá de cualquier reversión permitida.
Nodos varados: atasco y reconstrucción
Un nodo que estuvo aislado más tiempo que el límite de reversión puede descubrir que el resto de la red ha seguido una rama más pesada fuera de su alcance. No revierte hasta ella, pero tampoco sigue solo para siempre.
Cuando al menos tres pares registrados confirman una rama más pesada que queda fuera de su alcance, el nodo se declara atascado y deja de producir en su propia rama. El detector de atascos del propio nodo, una regla local, vigila además si hay 10 resoluciones de bifurcación fallidas seguidas a una misma altura, frente a al menos 2 pares, durante al menos 1800 segundos (30 minutos). Con auto_resync activado, el valor por defecto a partir de la versión 0.5.8, un nodo atascado descarta su cadena local y la reconstruye a partir de la red, empezando por los puntos de control y las instantáneas de la spine (véase instantáneas y sincronización rápida).
Un nodo rezagado sigue al registro
Un nodo cuya punta tiene más de 7200 segundos (2 horas) de antigüedad no se fía de cualquier par que diga ir por delante. Sigue la punta que indican al menos dos tercios de una muestra de pares registrados (al menos ceil(2 × n / 3) de n pares, con n de al menos 3).
Comparación con la finalidad probabilística
En Proof of Work, la confianza en un bloque crece con su profundidad pero nunca llega a ser certeza; los usuarios de Bitcoin suelen esperar seis bloques antes de dar un pago por liquidado. ZooBC sustituye esa costumbre por reglas: un límite de reversión estricto de 3 horas y un punto de control cofirmado aproximadamente una vez al día, por debajo del cual el historial no cambia. El precio es que un nodo aislado durante más de 3 horas en una rama minoritaria no puede volver revirtiendo; en su lugar, se reconstruye.