Wiki de ZooBC
Proof of Participation

Doble firma (equivocación)

La equivocación, o doble firma, significa que un mismo productor firma dos bloques distintos sobre el mismo bloque padre. Distintos nodos podrían entonces ver primero bloques distintos, y la red podría dividirse durante un tiempo. ZooBC lo trata de tres maneras: un nodo honesto nunca lo hace, ni siquiera tras un fallo; cualquier nodo registrado que vea dos de esos bloques puede demostrarlo en la cadena con un EquivocationReport; y al productor se le carga un turno perdido, con la pérdida de ingresos y de puntuación que conlleva.

Qué cuenta como equivocación

Cuando un nodo es sorteado para producir, construye un bloque sobre la punta actual, su bloque padre. La equivocación consiste en firmar dos bloques con cabeceras distintas sobre ese mismo bloque padre. Un bloque tardío no es equivocación: solo suma menos peso a su rama (véase elección de bifurcación y dificultad acumulada). Producir bloques a alturas distintas tampoco es equivocación; cada altura tiene su propio bloque padre.

Un productor honesto nunca firma dos veces

Un productor recuerda, para cada bloque padre, el bloque que firmó, y además guarda ese registro en disco, para que un reinicio no le haga olvidarlo. Si vuelve a ser sorteado sobre el mismo bloque padre, reenvía el bloque que ya firmó en lugar de hacer uno nuevo.

Hay una excepción deliberada. Pasado el límite de recuperación, 3600 segundos después del bloque padre, una cadena que se ha detenido debe poder volver a arrancar. Un productor puede entonces firmar un bloque nuevo para ese bloque padre, que no se le carga, y después reenvía ese bloque. Del mismo modo, un par de bloques cuyas marcas de tiempo quedan a ambos lados del límite de recuperación (exactamente uno de ellos más de 3600 segundos después del bloque padre) es la reanudación de una cadena detenida, no una equivocación.

Detección

Un nodo que recibe dos cabeceras válidamente firmadas por un mismo productor registrado sobre un mismo bloque padre las trata como prueba:

  • registra al productor como mentiroso demostrado, lo que lo pone en la lista negra como par y lo desconecta, salvo que eso aislara al nodo de la red;
  • envía un EquivocationReport por cada bloque padre y productor;
  • aun así pasa ambos bloques a la validación como siempre; la elección de bifurcación escoge al superviviente, y en caso de empate exacto gana en todos los nodos la rama con el hash de punta más bajo.

El EquivocationReport

El informe (tipo de transacción 60) lleva la propia prueba: las dos cabeceras firmadas, cada una seguida de la firma de 64 bytes del productor. Con cabeceras de 284 bytes, el cuerpo ocupa 704 bytes: una longitud de 4 bytes, la cabecera 1, la firma 1, una longitud de 4 bytes, la cabecera 2, la firma 2.

El cuerpo del informe de 704 bytes como seis casillas; debajo, las dos cabeceras una al lado de la otra con la misma clave de productor en el desplazamiento 76 y el mismo hash del bloque padre en el desplazamiento 172.
El cuerpo del informe de 704 bytes como seis casillas; debajo, las dos cabeceras una al lado de la otra con la misma clave de productor en el desplazamiento 76 y el mismo hash del bloque padre en el desplazamiento 172.

La cadena hace trece comprobaciones, en este orden:

  1. que el tipo de informe está activo;
  2. que la comisión es exactamente 0, porque informar es un deber de los nodos registrados;
  3. que el cuerpo se descodifica correctamente y cada cabecera tiene el tamaño de una cabecera firmada: 204 bytes, o 284 con la prueba de la semilla;
  4. que las dos cabeceras son distintas;
  5. que la clave del productor, en el desplazamiento de bytes 76, es la misma en ambas;
  6. que el hash del bloque padre, en el desplazamiento 172, es el mismo en ambas;
  7. que ambas firmas se verifican con esa clave de productor;
  8. que el bloque padre es un bloque de esta cadena;
  9. que el par no queda a ambos lados del límite de recuperación de una hora;
  10. que el informe llega no más de 720 bloques después de la altura de la equivocación;
  11. que el productor es un nodo registrado;
  12. que el informante es un nodo registrado;
  13. que a este productor no se le ha cargado ya esa altura.

Afirmar que uno vio un segundo bloque no demuestra nada; las dos firmas sí. No hace falta ninguna votación de las plazas, porque cualquiera puede comprobar firmas.

El coste

Un informe válido carga al productor un turno perdido, una vez por productor y altura. Según las reglas decididas para la versión 0.5.8, una doble firma demostrada deja además al nodo «ausente» hasta su siguiente bloque propio: sin parte de la coinbase, de las comisiones ni de la longevidad, y con una puntuación de participación que baja. Cuatro turnos perdidos seguidos suspenden a un nodo. Véase turnos perdidos, suspensión y expulsión.

No se mueve ningún saldo. Al informante no se le paga, y no se quita nada del stake del productor: el ZBC nunca se quema (véase ZBC nunca se quema).

Las cabeceras A y B entran en un EquivocationReport (tipo 60), que entra en un bloque: un turno perdido, ausente hasta el siguiente bloque propio, sin ingresos, la puntuación baja. Al lado, se corta el enlace con el productor y no se quema ningún ZBC.
Las cabeceras A y B entran en un EquivocationReport (tipo 60), que entra en un bloque: un turno perdido, ausente hasta el siguiente bloque propio, sin ingresos, la puntuación baja. Al lado, se corta el enlace con el productor y no se quema ningún ZBC.

Véase también