Elección de bifurcación y dificultad acumulada
A veces dos versiones de la cadena compiten durante un tiempo, por ejemplo cuando la red queda dividida unos minutos. Cada nodo de ZooBC sigue entonces la rama con la mayor dificultad acumulada: un total acumulado de pesos de bloque en el que un bloque de un productor sorteado pronto pesa más que uno tardío. La regla es la misma aritmética en todos los nodos, así que la red converge sin que nadie elija un ganador.
Más pesada, no más larga
Cada bloque suma al total acumulado una cantidad que disminuye cuanto más abajo estaba su productor en el sorteo de esa altura. En su forma más simple, un bloque suma 1 000 000 dividido entre el puesto del productor en el sorteo: un bloque del primer productor sorteado suma 1 000 000, y uno del tercero, unos 333 333.
Por tanto, una cadena de bloques puntuales pesa más que una cadena cuyos productores no dejaban de perder sus turnos, aunque la segunda cadena sea más larga. Tres bloques de la primera ronda pesan 3 000 000; cuatro bloques de la tercera ronda pesan unos 1 333 332.
Las alternativas no funcionarían. Contar transacciones permitiría a un productor rellenar su bloque para ganar. «El primero que se ve» varía de un nodo a otro por los retrasos de la red, así que los nodos podrían quedar divididos para siempre. Y no existe ninguna autoridad que marque una rama como oficial.
El peso exacto de un bloque
A partir de la versión 0.5.8 el incremento de un bloque es:
increment = floor(1,000,000 × |S| / (k × |A|))
- S es el conjunto del sorteo en el bloque anterior: los nodos activos menos los suspendidos.
- A es el registro activo completo en el bloque anterior. La proporción |S| / |A| nunca es mayor que 1.
- k cuenta los sorteos hasta la última aparición del productor en las rondas hasta la ronda del bloque: 1 para el productor sorteado en primer lugar que estampa a tiempo, 3 para un productor designado por el tercer sorteo. (Si el productor no se encuentra ahí, se usa su primera aparición dentro de 2 × n sorteos, siendo n el número de nodos del conjunto del sorteo, y, si tampoco, una posición en orden de hash.)
Dos suelos impiden que un bloque reclame más de lo que le corresponde. k nunca es menor que la ronda en la que cae la marca de tiempo del bloque, así que una marca tardía no puede conservar el peso de una ronda temprana (véase rondas, tiempos y ventanas). Y para el productor del bloque anterior, k nunca es menor que su ronda degradada, la 10 (véase rondas de prioridad, bloques vacíos y el productor anterior).
La proporción del conjunto del sorteo importa cuando la red se divide. Si cada lado de una división suspende a los nodos de los que no recibe nada, de otro modo ambos lados sumarían 1 000 000 por cada bloque puntual y parecerían igual de pesados. Con la proporción, un lado que funciona con 3 de 11 plazas suma como máximo 272 727 por bloque, frente a 727 272 del lado con 8. Bloque a bloque, el lado que tiene más plazas es el más pesado.
Cada bloque lleva su dificultad acumulada como una cadena de dígitos decimales. Cada validador la vuelve a calcular y rechaza un bloque que la indique mal. Dos totales se comparan primero por longitud y luego dígito a dígito.
La puntuación de participación no interviene en nada de esto: el peso lee las posiciones en el sorteo y el conjunto del sorteo, no las puntuaciones.
Empates exactos
Los empates exactos ocurren, por ejemplo, cuando dos ramas de la misma longitud están formadas por bloques puntuales de la primera ronda. A partir de la versión 0.5.8 se comparan como bytes los hashes de los bloques de punta de ambas ramas, y gana el hash más bajo. Un nodo cambia a una rama de igual peso cuyo hash de punta es más bajo que el suyo, conserva la suya en caso contrario, y no pregunta a nadie. Todos los nodos aplican la misma comparación a los mismos dos hashes, así que toda la red converge a la vez.
Pesar una rama antes de cambiar
Que un par afirme que su rama es más pesada no demuestra nada por sí solo. Un nodo pesa una rama competidora antes de tocar su propia cadena:
- Busca el último bloque que comparten las dos cadenas.
- Descarga por páginas la rama posterior a ese bloque, comprobando cada firma de cabecera y los enlaces entre bloques.
- Vuelve a calcular el peso de cada bloque, reproduciendo el registro y las suspensiones propios de esa rama desde el bloque común en adelante, ya que pueden diferir al otro lado de una división.
- Se detiene en cuanto la rama es más pesada que su propia cadena, y solo entonces revierte y la aplica. Una rama que termina siendo más ligera, o que no consigue adelantar dentro de un número limitado de bloques, se rechaza sin revertir nada.
Un par cuya dificultad declarada difiere del valor recalculado queda registrado como mentiroso.
Las reversiones tienen límites estrictos: nunca más de 720 bloques (3 horas) en mainnet, y nunca por debajo del último punto de control cofirmado en la cadena spine. Véase finalidad y reversión.
Nodos rezagados y sondeos a pares
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. Los demás sondeos a pares que pueda hacer un nodo, para confirmar una rama más pesada o comprobar su estado, son política local, no consenso.