La cadena spine
Cada nodo de ZooBC mantiene dos cadenas. La cadena principal produce un bloque cada 15 segundos y lleva las transacciones. A su lado funciona la spine: un bloque al día en mainnet, sin ninguna transacción. Un bloque de la spine registra aquello que avala el registro en su conjunto, un punto de control de la cadena principal, las claves de nodo que entraron o salieron y los manifiestos de las instantáneas más recientes, y necesita las firmas de dos tercios de las plazas. Eso convierte a la spine en el ancla de la finalidad y en el punto de partida de todo nodo nuevo.
Qué contiene un bloque de la spine
- Un punto de control. Cada bloque de la spine nombra un bloque de referencia de la cadena principal lo bastante profundo como para estar liquidado: 760 bloques (3 horas y 10 minutos) por debajo de la punta principal cuando se produce el bloque de la spine, y nunca más bajo que la referencia del bloque de la spine anterior. Copia la raíz de Merkle de ese bloque, y su hash de carga se compromete con el propio hash y la dificultad acumulada del bloque de referencia, así que el punto de control fija un bloque exacto, no solo una altura.
- Cambios de claves públicas. Las claves de nodo añadidas al registro o eliminadas de él desde el bloque de la spine anterior.
- Manifiestos de instantáneas. Para cada instantánea reciente del estado de la cadena principal: el hash del archivo completo, el hash de cada trozo, la altura de referencia, una caducidad y el hash del génesis de la cadena principal (véase instantáneas y sincronización rápida).
La spine produce un bloque por cada spine_smithing_period: 86 400 segundos, uno al día, en mainnet y en testnet, y 3600 segundos, uno por hora, en devnet, donde la profundidad del punto de control es de 80 bloques (20 minutos).
Cofirmado por dos tercios de las plazas
Un bloque de la spine lleva una firma agregada: un recuento de 4 bytes seguido, para cada firmante, de su clave de nodo de 32 bytes y su firma Ed25519 de 64 bytes, todas sobre los mismos 204 bytes de cabecera. El hash del bloque es el SHA3-256 de los bytes de cabecera y de todo el campo de firmas.
El número de firmas necesarias es:
required = max(spine_min_signatures, ceil(n × 67 / 100))
donde n es el tamaño de la lista de firmantes. Con 11 plazas, 11 × 67 / 100 = 7.37, redondeado hacia arriba a 8. El redondeo hacia arriba es intencionado: 7 sería menos de dos tercios de 11.
La spine cuenta todas las plazas de su lista de firmantes, estén suspendidas o no. Es el único recuento de dos tercios en el que las plazas suspendidas siguen contando, de modo que un punto de control siempre habla en nombre de dos tercios de todas las plazas (véase reglas de los dos tercios).
Si faltan demasiadas plazas y la spine se detiene, el listón se relaja en un solo paso: tras 3 periodos de la spine sin ningún bloque de la spine guardado (3 días en mainnet), basta con más de la mitad, 6 de 11. Ningún listón puede bajar de spine_min_signatures, que es 5 en todas las cadenas. Exigir las 11 firmas permitiría que una sola plaza ausente detuviera la spine.
Los firmantes comprueban antes de firmar
Una plaza nunca firma a ciegas. Antes de cofirmar una propuesta, cada firmante comprueba que:
- los cambios de claves son iguales a los cambios de su propio registro en el mismo intervalo;
- cada manifiesto de su cadena es igual a su propia instantánea, hash por hash; un firmante que no tiene la instantánea se abstiene;
- el bloque de referencia es lo bastante profundo y no retrocede;
- no ha cofirmado ya un bloque distinto a esa altura de la spine.
Cuando un nodo guarda un bloque de la spine, vuelve a comprobar el contenido, junto con el sorteo del productor y la dificultad del bloque.
Quién propone, y cuándo
El productor de la spine se sortea entre la lista de firmantes: el firmante del índice LE64(SHA3-256(seed ‖ "spine" ‖ round)) mod n, donde la semilla es la semilla del bloque principal en la altura de referencia del bloque de la spine anterior, de modo que cualquier validador puede repetir el sorteo. En mainnet una ronda de la spine dura 100 segundos, la ventana de creación es de 300 segundos y la tolerancia de 150 segundos; un firmante rechaza una propuesta con más antigüedad que su ventana de recogida de 60 segundos. Un bloque de la spine que llega antes que el anterior más el periodo, menos la tolerancia, se rechaza.
Los bloques de la spine nunca están vacíos. Entre spines que compiten, gana la que tiene más firmas. Un nodo pesa una spine competidora antes de revertir nada, nunca revierte su spine por debajo del pin de versión y restaura su propia spine si la otra no consigue aplicarse.
Para qué sirve la spine
- La finalidad. Ningún nodo reorganiza la cadena principal por debajo del último punto de control de la spine guardado (véase finalidad y reversión).
- La sincronización rápida. Un nodo nuevo sincroniza primero la spine: sus manifiestos indican qué instantánea descargar, y sus cambios de claves, en qué claves de nodo confiar (véase instantáneas y sincronización rápida).
- El archivo histórico. El almacenamiento descentralizado, y no cada nodo, conserva todas las instantáneas desde el bloque cero, así que cualquiera puede recorrer la spine hacia atrás hasta cualquier instantánea pasada y reconstruir el estado de aquel momento (véase archivo histórico y la lectura del pasado).
La spine la mantiene cada nodo, no la Foundation, y en ella no se negocia nada.