El sorteo: quién produce el siguiente bloque
En Proof of Participation nadie compite por producir un bloque. Para cada nueva altura, un sorteo aleatorio sobre el registro de nodos designa a los productores en orden: el primer sorteo designa al productor de la ronda 1, el segundo al productor de la ronda 2, y así sucesivamente. Todos los nodos ejecutan el mismo sorteo sobre los mismos datos y obtienen la misma lista, de modo que cada nodo sabe quién puede producir el siguiente bloque y rechaza un bloque de cualquier otro.
Una lotería que todos pueden repetir
Un sorteo justo necesita una aleatoriedad que nadie controle y que todos puedan reproducir. ZooBC la toma del bloque anterior. Cada bloque lleva una semilla de 64 bytes, un valor que su productor no puede elegir (véase semilla del bloque (VRF)). La semilla inicia un generador de números pseudoaleatorios, y cada número que produce el generador elige una entrada de la lista de nodos que pueden ser sorteados.
Como la semilla de un bloque solo existe cuando ese bloque existe, nadie conoce de antemano el orden del bloque siguiente: normalmente el orden se conoce con un solo bloque de antelación. (Un atacante con muchas plazas puede ver a veces más lejos; véase semilla del bloque (VRF).) Y como todos los nodos tienen el mismo bloque anterior y el mismo registro, todos calculan la misma lista. No hay ningún acertijo que resolver, ningún turno rotatorio publicado ni ningún coordinador.
La lista sobre la que se sortea
El sorteo elige dentro del conjunto seleccionable:
- el registro activo en el bloque anterior, es decir, los nodos admitidos (registrados); los nodos en cola no forman parte de él;
- ordenado por id de nodo, de menor a mayor (el id de un nodo se toma de los primeros 8 bytes de su clave de nodo);
- menos todos los nodos con una suspensión vigente (véase turnos perdidos, suspensión y expulsión). Si al quitarlos no quedara nadie, se usa en su lugar todo el conjunto activo.
Si todos los nodos activos están suspendidos, se añade como candidato de reanudación el mejor nodo en cola que haya mantenido su asistencia (véase cola), para que la cadena siempre pueda volver a arrancar; un bloque suyo lo admite de inmediato.
Los bloques se juzgan estrictamente según el registro del bloque anterior, sin recurrir a ninguna otra altura. Todos los nodos rechazan un bloque de un nodo que no fue sorteado para su ronda.
El generador
La receta exacta, que toda implementación debe seguir bit a bit:
h = SHA3-256("zbc-blocksmith" ‖ seed of the previous block)
v = bytes 24 to 31 of h, read as a big-endian 64-bit number
Splitmix64(v) seeds a xoroshiro128+ generator
each draw: r = the next non-negative 63-bit number
the draw names entry (r mod n) of the selectable set, n = its size
El sorteo 1 designa al productor de la ronda 1, el sorteo 2 al de la ronda 2, y así sucesivamente (véase rondas, tiempos y ventanas). Los sorteos son independientes, así que el mismo nodo puede aparecer más de una vez en una misma lista.
La etiqueta zbc-blocksmith mantiene este sorteo separado de las demás elecciones aleatorias que se toman de las semillas de los bloques, cada una con su propia etiqueta: zbc-coinbase para la lotería coinbase, zbc-receipt y zbc-receipt-datum para los recibos, zbc-topology-v2 para la topología de pares y zbc-apps para las apps en ZooBC.
Todas las plazas tienen la misma probabilidad
Cada sorteo elige cualquier entrada del conjunto seleccionable con la misma probabilidad. No interviene nada más: ni el hardware del nodo, ni el saldo de su propietario, ni su stake, ni su puntuación de participación. Un operador que tiene 3 de 30 plazas activas produce aproximadamente un bloque de cada diez.
Este es el primer objetivo de diseño de Proof of Participation: un poder de producción de bloques uniforme. La única vía hacia más poder es tener más plazas, y las plazas solo se obtienen a través de la cola, una admisión a la vez, al ritmo que fija el protocolo (véase ritmo de admisión). Dejar la puntuación fuera del sorteo es deliberado: un nodo con una puntuación alta gana más, pero no produce más bloques, no elige más semillas y no tiene más ocasiones de dejar fuera transacciones.
Dos refinamientos
- El productor anterior. El nodo que produjo el bloque anterior sigue en el conjunto seleccionable, pero sus sorteos no cuentan antes de la ronda 10, así que solo produce el siguiente bloque como último recurso tardío. Véase rondas de prioridad, bloques vacíos y el productor anterior.
- Rondas tardías. Los productores a partir de la ronda 11 solo pueden producir bloques sin transacciones. Véase también rondas de prioridad, bloques vacíos y el productor anterior.