HotStuff: de cero a estado del arte

Artículo 31 de 47

66%

completado al llegar aquí

Sistemas distribuidosNota de investigación11 min de lectura

Cómo Twins detecta pérdida de estado y doble voto en protocolos BFT

Cómo Twins duplica réplicas con la misma identidad para emular equivocación y pérdida de estado, y genera escenarios sistemáticos que exponen bugs BFT.

Ruta HotStuff: 0/47

En 1 Minuto

Entiende cómo Twins prueba implementaciones BFT: ejecuta dos instancias correctas con la misma identidad para emular equivocación y pérdida de estado, y combina particiones de red y líderes en escenarios sistemáticos que revelan bugs de safety y liveness.

Prerrequisitos
  • HotStuff-2, DAG-BFT y Twins (hotstuff2-frontier-dag-bft-twins)
  • Cambio de vista y Pacemaker en HotStuff (hotstuff-view-change-pacemaker)
Cuándo Detenerte

Detente cuando puedas explicar por qué una réplica gemela que no vio un mensaje se comporta como una réplica que olvidó su estado, y cómo un escenario de Twins describe rondas, líderes y particiones.

Glosario Rápido de Notación

Glosario de Notación Matemática y Criptográfica

v— Vista (View / Round)

Número de vista o ronda actual. Cada vista tiene un único líder designado.

Ejemplo: view = 42
Haz clic en un símbolo para desplegar su definición formal y su aplicación en el protocolo.
Mapa conceptual

Ruta mental de la detección de bugs con Twins

  1. Gemelos

    Misma identidad, dos instancias

  2. Escenario

    Rondas, líderes y particiones

  3. Comportamiento bizantino emergente

    Equivocación y amnesia

  4. Invariante

    Safety y liveness

De la duplicación de identidades a la violación de un invariante observable.
Explicación Didáctica

Decodificador Didáctico de Conceptos BFT

Pérdida de estado (state loss)

En palabras simples: Un notario que firma una escritura, pierde su libro de registro y al día siguiente firma otra escritura incompatible convencido de que es la primera.

Detalle técnico: Una réplica que no conserva su lockedQC o su última ronda votada puede volver a votar en conflicto con lo que ya firmó; para el resto del sistema, eso es indistinguible de un voto doble.

Bloqueo de liveness

En palabras simples: Dos grupos de una comisión esperan documentos distintos y ninguno reúne firmas suficientes para seguir.

Detalle técnico: Configuración en la que ninguna propuesta logra n - f votos porque las réplicas correctas quedaron repartidas entre rondas, locks o certificados incompatibles.

Traducción de lenguaje formal a analogías intuitivas del mundo real.

En HotStuff-2, DAG-BFT y Twins Twins apareció como una herramienta de la frontera. Aquí lo miramos con lupa: qué emula exactamente, cómo construye escenarios y qué tipo de errores puede sacar a la luz. Twins es una metodología de testing para sistemas BFT propuesta por Bano y coautores.

El problema de fondo es incómodo. Una prueba de safety en papel razona sobre un adversario arbitrario, pero un test unitario razona sobre los casos que su autor imaginó. Los bugs de consenso suelen vivir en el hueco entre ambos: una combinación concreta de líder, retrasos y estado local que nadie escribió a mano.

La idea: dos instancias, una identidad

Escribir un nodo bizantino a mano es caro. Hay que decidir qué mentiras dice, cuándo y a quién, y cada estrategia maliciosa es un programa nuevo que mantener. Twins evita ese trabajo con un truco: ejecuta dos instancias de la misma réplica, con la misma identidad y las mismas claves, y las dos corren el código correcto sin modificar.

Para las demás réplicas, los dos gemelos son un único participante. Si cada gemelo está en una parte distinta de la red, cada uno ve propuestas distintas y responde con honestidad a lo que ve. Desde fuera, esa réplica acaba de firmar dos votos o dos propuestas en conflicto para la misma ronda. Eso es equivocación, y aparece sin una sola línea de código malicioso.

Como un sistema con n=3f+1n = 3f + 1 réplicas tolera a lo sumo ff bizantinas, Twins limita la duplicación a ff réplicas. Una réplica con gemelo se cuenta como bizantina; las demás son correctas, y sobre ellas se verifican las propiedades. Esa elección mantiene el experimento dentro del modelo de fallas del protocolo: si algo se rompe, se rompió con un adversario que el protocolo promete tolerar.

Qué fallas bizantinas cubre y cuáles no

Los autores agrupan los comportamientos que Twins reproduce en tres familias: equivocación, voto doble y pérdida del estado interno. Las dos primeras salen directamente de que los gemelos vean mensajes distintos. La tercera es más sutil y es la que da título a este artículo.

Imagina que un gemelo estuvo en la partición donde se formó un QC y se bloqueó en él, mientras el otro gemelo estaba aislado y nunca lo vio. Si en la ronda siguiente la red pone al segundo gemelo junto a las réplicas que reciben una propuesta conflictiva, ese gemelo vota sin ninguna restricción. Para el resto del sistema, esa identidad acaba de comportarse como una réplica que olvidó su lockedQC. La amnesia se emula sin simular un disco ni un reinicio.

Twins no pretende cubrir todo lo que un adversario arbitrario puede hacer. Los gemelos siempre ejecutan el protocolo; no envían mensajes mal formados ni inventan campos. El argumento del paper es que los ataques que importan contra protocolos de la familia HotStuff, los que rompen safety o detienen el progreso, se reducen en la práctica a combinaciones de equivocación, voto doble y amnesia. Validar mensajes mal formados sigue siendo trabajo de otras pruebas.

Generación sistemática de escenarios

Un escenario de Twins fija, para cada ronda, quién es el líder y cómo se parte la red. Dentro de una partición los mensajes se entregan; entre particiones se descartan. Con eso basta para describir situaciones que un tester humano tardaría en imaginar: un líder gemelo que propone una cosa a un grupo y otra al otro, una réplica correcta que se queda sin oír un QC, o un cambio de vista en el que solo parte de la red vio la propuesta anterior.

El generador construye los escenarios en etapas: enumera las particiones posibles de las réplicas, las combina con las asignaciones de líder y luego encadena esas combinaciones a lo largo de varias rondas. El número de escenarios crece de forma combinatoria con las réplicas y las rondas, de modo que la búsqueda se acota con parámetros explícitos y puede recorrerse de forma exhaustiva dentro de esos límites o muestrearse.

Flujo visual

De parámetros a veredicto en Twins

Etapas de generación y ejecución de escenarios.
  1. Fijar réplicas y gemelos
  2. Enumerar particiones
  3. Asignar líderes por ronda
  4. Encadenar rondas en escenarios
  5. Ejecutar de forma determinista
  6. Comprobar safety y liveness

La ejecución es determinista: la misma descripción produce la misma traza. Eso cambia la relación con un bug. En lugar de un fallo intermitente en un clúster real, el equipo recibe un escenario que se puede reproducir, reducir y convertir en test de regresión. Los autores describen su implementación sobre la base de código de DiemBFT, el descendiente de HotStuff diseñado para producción.

Anatomía de un bug de pérdida de estado

Veamos un ejemplo ilustrativo construido por TrautsLab, no un caso reportado en el paper. Supón una implementación de Chained HotStuff que guarda su lockedQC y su última ronda votada solo en memoria. Las reglas del protocolo son correctas: una réplica solo vota una propuesta que extienda su lockedQC o que traiga un QC de vista más alta. El problema está en la implementación, que puede perder ese estado.

La réplica R1R_1 vota la propuesta AA en la vista 5 y queda bloqueada en el QC correspondiente. Después se reinicia y vuelve con su estado inicial. En la vista 6 un líder propone A′A', que no extiende AA. Con la memoria vacía, R1R_1 no tiene nada que le prohíba votar, y su voto puede completar un QC conflictivo junto a réplicas que no vieron AA. El argumento de safety de HotStuff cuenta con que cada réplica correcta del quórum recuerde su lock; aquí el testigo correcto de la intersección perdió la memoria.

Twins encuentra este tipo de error sin modelar el reinicio, porque un gemelo que no vio el bloqueo produce exactamente la misma secuencia de votos que una réplica amnésica. La corrección obvia es persistir el estado de safety antes de enviar el voto. DiemBFT aísla ese estado en un módulo de safety separado, que lleva la ronda más alta votada y el QC de referencia para decidir si es seguro votar.

Figura 1

Secuencia ilustrativa de un bug de pérdida de estado

Fuentes:

[1]
Secuencia ilustrativa de un bug de pérdida de estado
Cómo leer esta figura

El diagrama muestra una línea de tiempo con cuatro marcas. En t1 la réplica R1 vota A en la vista 5 y fija su lockedQC. En t2 ocurre un crash con reinicio sin estado persistido. En t3 lockedQC vuelve a su valor inicial. En t4, en la vista 6, R1 vota A' y rompe safety.

Visual original de TrautsLab. Ejemplo ilustrativo: tras un reinicio sin persistencia, la réplica olvida su lockedQC de la vista 5 y vota la propuesta conflictiva A' en la vista 6. Twins produce la misma traza con un gemelo que no vio el bloqueo.
Cuidado técnico

Perder estado equivale a equivocar

Una réplica que olvida su lockedQC o su última ronda votada puede emitir votos en conflicto con los que ya firmó. Para el resto del sistema esa réplica es indistinguible de una bizantina, y Twins emula esa amnesia con un gemelo que no recibió el mensaje que fijó el bloqueo.
Bosquejo de Demostración: Si una implementación no conserva el estado de safety, su comportamiento entra en la familia de pérdida de estado interno que Twins reproduce; la réplica deja de contar como correcta en el argumento de intersección de quórums.

Bugs de liveness: particiones, líderes y rondas perdidas

No todos los errores que encuentra Twins rompen safety. El mismo generador produce escenarios en los que nadie firma nada contradictorio y, aun así, el sistema deja de avanzar. Un patrón típico: una partición deja a parte de las réplicas correctas bloqueadas en un QC que el resto no conoce, el siguiente líder construye sobre un certificado más viejo y una fracción de las réplicas lo rechaza. Si ningún lado reúne n−fn - f votos, la ronda muere, y si el patrón se repite en las rondas siguientes, el sistema se estanca.

Por eso Twins mira liveness además de safety: no basta con que nadie confirme bloques en conflicto, también hay que comprobar que las réplicas correctas siguen confirmando. Para que la prueba sea justa, el veredicto de liveness tiene sentido cuando el escenario deja de partir la red, porque con particiones permanentes ningún protocolo bajo sincronía parcial promete progreso. Un bug de este tipo suele apuntar al Pacemaker o a la información que viaja en el cambio de vista: si el highQC de las réplicas no llega al líder siguiente, el líder no puede proponer algo que todas las réplicas correctas acepten.

Ojo con la interpretación. Que Twins no encuentre un error dentro de los límites explorados no demuestra que el protocolo sea correcto; demuestra que ningún escenario de ese espacio lo rompe. Twins complementa una prueba formal y la revisión de diseño, no las sustituye.

BFT Bug Hunting

Checklist mental de auditoría con Twins

5 de 5 revisados

Preguntas para leer o diseñar una campaña de Twins.
Referencias

Bibliografía académica

Formato IEEENumerado para ingeniería, sistemas y protocolos.
  1. [1]

    S. Bano et al., "Twins: BFT Systems Made Robust," arXiv:2004.10617, 2020.

    Gemelos con la misma identidad, generación de escenarios por particiones y líderes, y ejecución determinista.

  2. [2]

    M. Yin, D. Malkhi, M. K. Reiter, G. G. Gueta, and I. Abraham, "HotStuff: BFT Consensus in the Lens of Blockchain," PODC, 2019.

    Reglas de bloqueo con lockedQC y el papel de highQC en el cambio de vista.

  3. [3]

    The Diem Team, "DiemBFT v4: State Machine Replication in the Diem Blockchain," 2021.

    Technical reportID: DIEMBFT-V4-2021Abrir fuente (abre en otra pestaña)

    Descendiente productivo de HotStuff con un módulo de safety que conserva la ronda votada.

Fuentes primarias, papers seminales y especificaciones técnicas citadas en esta investigación.

Siguiente lectura

Para repasar las reglas de bloqueo que Twins pone a prueba, vuelve a QC, highQC y three-chain. Si quieres ver el diseño de producción sobre el que se implementó Twins, continúa con DiemBFT, Jolteon y Ditto.

Rutas vecinas

Si este tema te abrió hambre, sigue por aquí.

Series y labs que comparten área o dependen de esta ruta. Pocas opciones, para no convertir la curiosidad en menú infinito.

Sigue leyendo

Ideas conectadas con este artículo

Una ruta corta para continuar sin abrir veinte pestañas y perder el hilo.

Los comentarios se cargan al final de la lectura para no meter peso antes de tiempo.