Wiki de ZooBC
Seguridad y arquitectura

De qué protege Proof of Participation

Proof of Participation se diseñó frente a un atacante fuerte: uno que puede ejecutar cualquier número de nodos y cuentas, ve todos los mensajes de la red, explota cualquier fallo de la lógica y tiene mucho dinero. Solo supone que el atacante no puede falsificar firmas, no puede encontrar colisiones de hash y no puede comprar todos los tokens. Frente a ese atacante, aspira a impedir cuatro cosas: robar, censurar, reescribir el historial y perturbar la cadena. Esta página repasa los principales ataques y las reglas que los responden.

Comprar la producción de bloques

En Proof of Work, el poder sigue al hardware; en Proof of Stake, a las monedas. Ambos pueden comprarse deprisa. En Proof of Participation, cada plaza registrada que no está suspendida tiene la misma probabilidad de ser sorteada para el siguiente bloque, sea cual sea su saldo o su hardware (véase sorteo). Las monedas y las máquinas por sí solas no compran nada: el poder necesita plazas.

Las plazas solo llegan a través de la cola, al ritmo que fija el protocolo. El primer recién llegado entra 7 días después del génesis. Después, cada admisión fija la espera hasta la siguiente: 600 días divididos entre las plazas contadas antes de ese recién llegado, entre un mínimo de 7 y un máximo de 90 días. Las plazas génesis cuentan como máximo como 11, y las plazas suspendidas no cuentan. Con 11 plazas la espera es de unos 54.5 días, así que el segundo recién llegado entra hacia el día 61.5. La cola se ordena por el stake multiplicado por el tiempo de espera, así que un atacante también debe superar las pujas de los aspirantes honestos.

Identidades Sybil

Un atacante Sybil crea muchas identidades para ganar influencia. En Proof of Participation una identidad es una plaza del registro, y cada plaza tiene costes reales:

  • Dinero. Un stake bloqueado de al menos el mínimo de la cola, que empieza en 100 ZBC (las plazas pueden votarlo entre una unidad atómica y 250 ZBC, y a la entrada la mitad de la mediana del stake en cola puede elevarlo). El 10 % está en riesgo.
  • Tiempo. Un lugar en una cola ordenada por stake × tiempo de espera, y una admisión pausada: semanas o meses entre recién llegados.
  • Trabajo. Una plaza nueva empieza con una puntuación de participación del 20 % y no gana nada hasta que es madura: 4 unidades de puntuación después de la admisión más un bloque propio, 2 días por debajo de 2880 nodos. Después debe seguir produciendo en sus turnos y retransmitiendo.

Una plaza que guarda silencio cuenta como ausente, no gana nada y pierde puntuación; en cero es expulsada y el 10 % de lo bloqueado va al fondo de longevidad. El mismo 10 % se pierde al salir estando ausente o suspendido, o al abandonar la cola. Una salida en buen estado devuelve todo lo bloqueado tras un periodo de enfriamiento de 7 días. Véanse turnos perdidos, suspensión y expulsión y salir del registro.

Tres columnas de coste por identidad. Dinero: un stake de al menos el mínimo de la cola (desde 100 ZBC), con el 10 % en riesgo. Tiempo: orden de la cola por stake × espera, una admisión por ciclo. Trabajo: empezar en el 20 %, sin ingresos hasta la madurez, y el silencio lleva a la expulsión en 0.
Tres columnas de coste por identidad. Dinero: un stake de al menos el mínimo de la cola (desde 100 ZBC), con el 10 % en riesgo. Tiempo: orden de la cola por stake × espera, una admisión por ciclo. Trabajo: empezar en el 20 %, sin ingresos hasta la madurez, y el silencio lleva a la expulsión en 0.

Una mayoría de las plazas

Supongamos que un atacante controlara más de la mitad de las plazas. Produciría la mayoría de los bloques y podría construir la rama más pesada, que es lo que compra una mayoría en cualquier diseño basado en la cadena más pesada. Podría:

  • retrasar o censurar transacciones dejándolas fuera de sus bloques;
  • sustituir bloques recientes, dentro del límite de reversión, construyendo una rama más pesada.

No podría falsificar nada. Cada nodo comprueba cada bloque: la firma de cada transacción, la prueba de la semilla de cada bloque, cada recibo y cada importe de la coinbase. Una mayoría no puede gastar los ZBC de cuentas cuyas claves no tiene, no puede pagarse más de lo que marca el calendario fijo de la coinbase y no puede reescribir el historial con más de 720 bloques (3 horas) de antigüedad ni por debajo del último punto de control de la spine (véase finalidad y reversión). Además, los bloques producidos tras turnos saltados pesan menos, y las plazas inactivas pierden sus ingresos y su puntuación.

Dos columnas. Puede: censurar o retrasar transacciones, sustituir bloques dentro de los últimos 720. No puede: falsificar firmas, gastar las monedas de otros, acuñar monedas de más, bajar del punto de control de la spine. Una cadena con los últimos 720 bloques marcados y un punto de control de la spine más atrás: el historial antiguo no se mueve.
Dos columnas. Puede: censurar o retrasar transacciones, sustituir bloques dentro de los últimos 720. No puede: falsificar firmas, gastar las monedas de otros, acuñar monedas de más, bajar del punto de control de la spine. Una cadena con los últimos 720 bloques marcados y un punto de control de la spine más atrás: el historial antiguo no se mueve.

Jugar con la semilla

La semilla que impulsa cada sorteo es la salida de una función aleatoria verificable: un productor no puede elegirla entre varios valores. Su única palanca es retener su bloque, lo que le cuesta un turno perdido, ingresos y puntuación, y solo pasa la semilla al siguiente nodo sorteado (véase semilla del bloque (VRF)).

Reescribir el historial desde muy atrás

Un ataque de largo alcance construye un historial distinto desde muy atrás en el pasado, por ejemplo con las claves antiguas de nodos que salieron del registro hace mucho. Cada una de estas defensas lo detiene por sí sola:

  • un nodo en funcionamiento nunca revierte más de 720 bloques;
  • ningún nodo se reorganiza por debajo del último punto de control cofirmado en la cadena spine;
  • un nodo nuevo sigue la spine, cuyos bloques necesitan dos tercios de las plazas y que registra qué claves de nodo entraron y cuáles salieron, así que las claves que salieron hace mucho no están en su lista de firmantes;
  • la versión que instala un nodo nuevo puede llevar un pin de versión, de modo que un historial de la spine falsificado se rechaza al arrancar.

Las claves no caducan, y nadie revisa las ramas a mano.

Eclipse

En un ataque de eclipse, el atacante rodea un nodo con sus propios pares para que el nodo solo vea la cadena del atacante. Contra un nodo registrado esto es difícil. Sus pares asignados, 12 en mainnet, se sortean a partir de la semilla de un bloque de periodo y se vuelven a sortear cada 40 bloques (unos 10 minutos), así que el atacante no puede elegirlos (véase recibos y la topología de la red). Los pares demuestran sus claves de nodo en un saludo inicial firmado que también nombra el hash del génesis de la cadena. Y basta con un par honesto: la elección de bifurcación se hace por peso, así que una sola conexión que informe de una rama más pesada permite al nodo descargarla y comprobarla bloque a bloque. Un nodo cuya punta se ha quedado rezagada sigue la punta que indican dos tercios de una muestra de pares registrados.

El tráfico entre pares viaja como gRPC en claro, sin cifrar: la protección viene de las firmas y de la verificación, no del secreto.

Otros ataques

  • La doble firma de un bloque se demuestra con un EquivocationReport y se carga como un turno perdido (véase doble firma (equivocación)).
  • Repetir una transacción firmada en otra cadena ZooBC fracasa, porque toda firma cubre el hash del génesis de la cadena (véase firmas vinculadas a la cadena).
  • Las instantáneas falsificadas se detectan mediante los hashes nombrados en la spine cofirmada y mediante una muestra comprobada con pares registrados (véase instantáneas y sincronización rápida).

Véase también