HotStuff: de cero a estado del arte

Artículo 15 de 47

32%

completado al llegar aquí

Sistemas distribuidosNota de investigación14 min de lectura

El abuelo de los consensos BFT: PBFT (1999) y sus tres pasos

Cómo PBFT (Castro y Liskov, 1999) ordena solicitudes con pre-prepare, prepare y commit, qué certifica cada quórum 2f+1 y por qué su view-change es cuadrático.

Ruta HotStuff: 0/47

Prerequisitos recomendados

Si alguno de estos conceptos todavía está medio nebuloso, empieza por aquí. Te ahorra tropiezos y un par de cejas fruncidas.

En 1 Minuto

Comprende la arquitectura pionera de PBFT (Practical Byzantine Fault Tolerance, Castro & Liskov 1999): las tres fases de confirmación (Pre-Prepare, Prepare y Commit), la construcción del certificado preparado y el cambio de vista que lo transporta.

Prerrequisitos
  • Consenso BFT desde cero (bft-consensus-from-zero)
  • De PBFT a cadenas: el puente mental (pbft-tendermint-streamlet-bridge)
Cuándo Detenerte

Detente cuando puedas detallar qué evidencia exige un nodo en PBFT antes de pasar de la fase Prepare a la fase Commit, y qué evidencia sobrevive a un cambio de vista.

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 las Fases del Camino Feliz en PBFT

  1. 1. Pre-Prepare

    Líder propone secuencia

  2. 2. Prepare

    Acuerdo de orden dentro de la vista

  3. 3. Commit

    Acuerdo que sobrevive a vistas

  4. 4. Ejecución & Reply

    Respuesta al cliente

Secuencia clásica de tres pasos de Castro & Liskov 1999.
Explicación Didáctica

Decodificador Didáctico de Conceptos BFT

Fase Pre-Prepare

En palabras simples: El presidente de una mesa de debates golpea el mazo y dice: 'Abramos el expediente número 45 para discutir la propuesta A'. Asigna un número de orden oficial.

Detalle técnico: Mensaje PRE-PREPARE con vista v, número de secuencia s y digest d, autenticado por el primario, que asigna la posición s a la solicitud de digest d en la vista v.

Estado Prepared(m, v, s)

En palabras simples: Todos los vocales de la mesa se miran entre sí y levantan la mano confirmando: 'Estamos de acuerdo en que la propuesta A es el expediente número 45'.

Detalle técnico: Certificado local que contiene el mensaje Pre-Prepare y 2f mensajes Prepare de réplicas distintas que coinciden en (v, s, d).

Estado Committed-Local(m, v, s)

En palabras simples: Los vocales firman el acta oficial de la reunión y la sellan. Saben que aunque cambie el presidente de la mesa, el acta no se podrá destruir.

Detalle técnico: La réplica está Prepared y además aceptó 2f + 1 mensajes Commit coincidentes; implica que al menos f + 1 réplicas correctas están Prepared para (v, s, d).

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

En De PBFT a cadenas trazamos la línea evolutiva del consenso BFT. Para entender qué cambió HotStuff en 2019, primero hay que estudiar al protocolo sobre cuyos hombros se construyó esa línea: PBFT (Practical Byzantine Fault Tolerance), presentado por Miguel Castro y Barbara Liskov en OSDI 1999.

Antes de PBFT, buena parte de la literatura bizantina se apoyaba en sincronía o se consideraba demasiado costosa para un servicio real. La contribución de Castro y Liskov fue un algoritmo de replicación de máquinas de estados (SMR) que es seguro en un sistema asíncrono, que tolera réplicas bizantinas y que incorpora optimizaciones suficientes para que el costo frente a un servicio no replicado fuera moderado en su evaluación. Este capítulo reconstruye el mecanismo, sus invariantes y el precio que pagó por ellos.

Modelo de fallas: por qué n = 3f + 1

PBFT supone nn réplicas, de las cuales a lo sumo ff pueden ser bizantinas: pueden mentir, callar, enviar mensajes distintos a distintos pares o coludirse. La red puede perder, retrasar, duplicar o reordenar mensajes. Lo único que el adversario no puede hacer es romper la criptografía: no puede falsificar la autenticación de una réplica correcta ni encontrar colisiones del digest.

Con ese adversario, el protocolo usa n=3f+1n = 3f + 1 réplicas y quórums de tamaño q=2f+1q = 2f + 1. El argumento es aritmético. Una réplica solo puede esperar respuesta de n−fn - f pares, porque ff pueden no contestar nunca; pero entre los que sí contestan puede haber hasta ff bizantinos. Para que las respuestas correctas superen a las maliciosas hace falta n−2f>fn - 2f > f, es decir, n>3fn > 3f. Con n=3f+1n = 3f + 1, dos quórums cualesquiera de 2f+12f + 1 se intersecan en al menos f+1f + 1 réplicas, y al menos una de ellas es correcta.

El umbral de un tercio tiene una genealogía clara. Lamport, Shostak y Pease mostraron que, con mensajes orales, el problema de los generales bizantinos no tiene solución si un tercio o más de los generales son traidores. PBFT trabaja en un modelo distinto, asíncrono y con mensajes autenticados, pero conserva esa resiliencia óptima de n=3f+1n = 3f + 1.

Hay una segunda frontera igual de importante: FLP. Ningún protocolo determinista puede garantizar terminación en un sistema completamente asíncrono con una sola falla. Castro y Liskov lo asumen explícitamente: safety no depende de sincronía, pero liveness requiere una hipótesis débil de sincronía, en la que los retardos no crezcan indefinidamente más rápido que el tiempo.

El camino normal: vistas, primario y número de secuencia

PBFT organiza la ejecución en vistas. En cada vista vv existe un único líder, el primario, determinado como p=v mod np = v \bmod n; el resto de las réplicas actúan como respaldos. En este artículo usamos ss para el número de secuencia y reservamos nn para el número de réplicas; el paper original usa nn para la secuencia y ∣R∣|R| para el conjunto de réplicas.

Cuando un cliente envía una solicitud mm al primario, se desencadenan tres fases de mensajes:

Flujo visual

Secuencia de Mensajes en el Camino Normal de PBFT

Intercambio de mensajes entre el cliente, el primario y las réplicas de respaldo.
  1. Solicitud del cliente al primario
  2. Pre-Prepare del primario a las réplicas
  3. Prepare de todas a todas
  4. Commit de todas a todas
  5. Ejecución y respuesta al cliente

La escena sigue esas fases con n=4n = 4 y la réplica R3 en falla, contando los mensajes de cada una.

Cargando escena animada...

1. Fase Pre-Prepare

El primario calcula el digest d=D(m)d = D(m), asigna un número de secuencia ss y envía a todas las réplicas:

⟨PRE-PREPARE,v,s,d⟩σp\langle\text{PRE-PREPARE}, v, s, d\rangle_{\sigma_p}

Una réplica acepta el mensaje si la autenticación del primario es válida, si está en la vista vv, si no aceptó antes otro Pre-Prepare para la misma vista y secuencia con un digest distinto, y si ss cae entre dos marcas de agua, hh y HH, que impiden que un primario malicioso agote el espacio de secuencias.

2. Fase Prepare

Al aceptar el Pre-Prepare, la réplica ii difunde a todas las demás:

⟨PREPARE,v,s,d,i⟩σi\langle\text{PREPARE}, v, s, d, i\rangle_{\sigma_i}

Cuando reúne el Pre-Prepare más 2f2f mensajes Prepare coincidentes de réplicas distintas, alcanza el predicado Prepared(m,v,s)\text{Prepared}(m, v, s). Ese conjunto de mensajes es el certificado preparado.

3. Fase Commit

Estar Prepared no basta para ejecutar. La réplica sabe que existe un orden acordado dentro de la vista vv, pero no sabe si ese conocimiento sobreviviría a un cambio de primario. Por eso difunde:

⟨COMMIT,v,s,d,i⟩σi\langle\text{COMMIT}, v, s, d, i\rangle_{\sigma_i}

Cuando está Prepared y acepta 2f+12f + 1 mensajes Commit coincidentes, alcanza Committed-Local(m,v,s)\text{Committed-Local}(m, v, s) y ejecuta mm una vez ejecutadas todas las solicitudes con secuencia menor. Después responde al cliente, que acepta el resultado al recibir f+1f + 1 respuestas idénticas de réplicas distintas: al menos una de ellas proviene de una réplica correcta.

Un detalle de implementación: la notación σ\sigma sugiere firmas, y así se presenta el algoritmo para simplificar. En el sistema original, los mensajes del camino normal se autentican con vectores de MACs, llamados authenticators, y las firmas de clave pública se reservan para el cambio de vista, porque un MAC es mucho más barato de calcular que una firma.

Qué certifica cada quórum

Las dos fases de votación no son redundantes: cada una protege un invariante distinto.

Prepare ordena dentro de una vista. Si una réplica correcta está Prepared(m,v,s)\text{Prepared}(m, v, s) y otra réplica correcta está Prepared(m′,v,s)\text{Prepared}(m', v, s), entonces D(m)=D(m′)D(m) = D(m'). Ambos certificados contienen 2f+12f + 1 réplicas que avalaron el par (v,s)(v, s); sus conjuntos se intersecan en al menos una réplica correcta, y una réplica correcta nunca acepta dos Pre-Prepare distintos para la misma vista y secuencia.

Commit hace que el orden sobreviva al cambio de vista. Si una réplica correcta está Committed-Local(m,v,s)\text{Committed-Local}(m, v, s), entonces al menos f+1f + 1 réplicas correctas están Prepared(m,v,s)\text{Prepared}(m, v, s). Ese conjunto es lo bastante grande como para que cualquier quórum futuro de 2f+12f + 1 réplicas contenga al menos una que conserve el certificado preparado. Es la propiedad que permite que la decisión sea final sin esperar a que todas las réplicas la conozcan.

Sin la fase Commit, una réplica podría ejecutar tras ver su certificado preparado mientras casi nadie más lo tiene; un cambio de vista en ese momento podría elegir otro valor para la misma secuencia. La segunda ronda de votos convierte un conocimiento local en un hecho que el siguiente primario está obligado a descubrir.

Teorema

Teorema de Seguridad de PBFT

Castro & Liskov 1999
Si una réplica correcta i alcanza el estado Committed-Local(m, v, s), ninguna réplica correcta j ejecutará una solicitud m' distinta de m en el número de secuencia s, ni en la vista v ni en ninguna vista posterior.
Bosquejo de Demostración: La intersección de quórums en n = 3 garantiza que al menos réplicas correctas poseen el certificado Prepared(m, v, s). Todo cambio de vista se apoya en mensajes VIEW-CHANGE, que incluyen al menos una réplica correcta con ese certificado, de modo que el nuevo primario debe volver a proponer m en la secuencia s.

El cambio de vista: transportar certificados preparados

Si el primario falla o actúa de forma maliciosa, los respaldos lo detectan con temporizadores: una réplica que tiene una solicitud pendiente y no la ve ejecutada a tiempo deja de aceptar mensajes de la vista vv y difunde un mensaje VIEW-CHANGE para la vista v+1v + 1.

Ese mensaje es la memoria de la réplica. Incluye el número de secuencia de su último checkpoint estable con la prueba correspondiente, y un conjunto con el certificado preparado de cada solicitud que alcanzó Prepared con secuencia posterior a ese checkpoint. Cada certificado, a su vez, contiene un Pre-Prepare y 2f2f mensajes Prepare.

El primario de la vista v+1v + 1 espera 2f2f mensajes VIEW-CHANGE válidos de otras réplicas, que junto con el suyo forman un quórum de 2f+12f + 1, y difunde un mensaje NEW-VIEW. Ese mensaje contiene los VIEW-CHANGE recibidos y un conjunto de nuevos Pre-Prepare: para cada secuencia en la que algún VIEW-CHANGE trae un certificado preparado, el nuevo primario vuelve a proponer el digest del certificado de vista más alta; para los huecos, propone una solicitud nula. Las réplicas no confían en esa reconstrucción: la recalculan a partir de los mismos VIEW-CHANGE y rechazan el NEW-VIEW si no coincide.

Aquí se cierra el argumento de seguridad. Si mm quedó Committed-Local en alguna réplica correcta, al menos f+1f + 1 réplicas correctas guardan su certificado; el quórum del NEW-VIEW interseca ese conjunto, así que el nuevo primario no puede omitir mm sin que las réplicas lo detecten.

Los checkpoints completan el cuadro. Periódicamente las réplicas difunden un digest de su estado; con 2f+12f + 1 mensajes coincidentes el checkpoint se vuelve estable, pueden descartar los mensajes anteriores y avanzar las marcas de agua hh y HH. Sin ellos, los registros y los mensajes de cambio de vista crecerían sin límite.

El talón de Aquiles: intercambios todos contra todos

Observa el patrón de comunicación. En Prepare y en Commit, cada réplica difunde a todas las demás, de modo que cada fase cuesta del orden de n2n^2 mensajes:

mensajes por fase=O(n2)\text{mensajes por fase} = \mathcal{O}(n^2)

Con n=4n = 4 réplicas (f=1f = 1), cada fase cuesta como mucho n(n−1)=12n(n - 1) = 12 mensajes. Con n=1000n = 1000, la misma fórmula da del orden de un millón de mensajes por fase. La aritmética no depende de la implementación: es consecuencia de que cada réplica necesita escuchar directamente a un quórum.

El cambio de vista es todavía más pesado. Cada réplica difunde su VIEW-CHANGE a todas, lo que vuelve a dar O(n2)\mathcal{O}(n^2) mensajes, y cada uno transporta certificados preparados que contienen a su vez 2f+12f + 1 mensajes; el NEW-VIEW reenvía 2f+12f + 1 de esos VIEW-CHANGE. El tamaño total de la evidencia crece más rápido que el número de réplicas.

Esa es la deuda que HotStuff se propuso saldar. Su camino feliz usa un líder que agrega votos en un certificado de quórum (QC) compacto, y su cambio de líder evita reenviar los certificados de todas las réplicas, de modo que el costo de comunicación por vista con líder correcto es lineal en nn. El precio es una fase adicional de votación respecto a las dos de PBFT, una decisión que se analiza en QC, highQC y la regla de tres cadenas y en View-change y pacemaker en HotStuff.

Impacto de Negocio & Finanzas

Impacto Operativo de la Arquitectura PBFT

Problema Comercial / Operacional

PBFT fue diseñado y evaluado para grupos pequeños de réplicas en redes locales, donde el tráfico todos-contra-todos es asumible.

Solución del Paper (Insight Técnico)

Al crecer el comité, el tráfico cuadrático del camino normal y el tamaño de los mensajes de cambio de vista dominan el costo del protocolo.

Impacto para el Producto / Negocio: Motiva la evolución hacia arquitecturas de comunicación lineal por vista, como HotStuff, cuando el número de validadores crece.
Fases Normales3 FasesPre-Prepare, Prepare, Commit
Tráfico Camino NormalO(n^2)intercambio todos-contra-todos
Resiliencian = 3f + 1quórums de 2f + 1
FinalidadDeterministatras 2f + 1 commits
PBFT Fundamentals

Checklist mental de PBFT 1999

5 de 5 revisados

Conceptos clave de Castro & Liskov 1999.
Referencias

Bibliografía académica

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

    M. Castro and B. Liskov, "Practical Byzantine Fault Tolerance," OSDI, 1999.

    Base práctica para replicación de estado con fallas bizantinas y comparación con fases cuadráticas.

  2. [2]

    L. Lamport, R. Shostak, and M. Pease, "The Byzantine Generals Problem," ACM TOPLAS, vol. 4, no. 3, pp. 382-401, 1982, doi: 10.1145/357172.357176

    PaperID: LAMPORT-BYZANTINE-1982Abrir fuente (abre en otra pestaña)

    Fuente primaria para distinguir los modelos de mensajes orales y mensajes firmados.

  3. [3]

    M. J. Fischer, N. A. Lynch, and M. S. Paterson, "Impossibility of Distributed Consensus with One Faulty Process," JACM, vol. 32, no. 2, pp. 374-382, 1985, doi: 10.1145/3149.214121

    Resultado de imposibilidad para consenso determinista en un sistema completamente asíncrono con una falla por crash.

  4. [4]

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

    Fuente central para QC, highQC, Chained HotStuff, view-change lineal y three-chain commit.

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

Siguiente lectura

Continúa con PBFT, Tendermint y Streamlet para ver cómo las familias posteriores reorganizaron estas fases, o salta a Tendermint: locks vistos desde HotStuff para comparar el certificado preparado con un lock.

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.