Ethereum: de historia a labs

Artículo 29 de 48

60%

completado al llegar aquí

Sistemas distribuidosNota de investigación13 min de lectura

Gasper: Casper FFG + LMD-GHOST en una sola cabeza

Cómo decide Ethereum: LMD-GHOST elige la cabeza con el último voto de cada validador y Casper FFG justifica y finaliza checkpoints por supermayoría.

Ruta Ethereum: 0/48

Tu servicio acredita depósitos en cuanto ve la transacción en un bloque. Una mañana, ese bloque desaparece de la cadena y el depósito con él. ¿Fallo de Ethereum? No: el bloque era la cabeza, no un bloque finalizado. Ethereum responde a dos preguntas distintas con dos mecanismos distintos, y confundirlas cuesta dinero.

La primera pregunta es "¿cuál es la cabeza de la cadena ahora?". La responde LMD-GHOST, una regla de elección de bifurcación (fork choice). La segunda es "¿qué parte de la historia ya no se puede revertir sin destruir mucho ETH?". La responde Casper FFG, un mecanismo de finalidad. ethereum.org llama Gasper a la combinación de ambos. El paper que lo formaliza lo presenta como una versión idealizada de la Beacon Chain.

Brújula de lectura

Actor, evidencia y estado

Antes de avanzar, ubica quién actúa, qué prueba queda y qué parte del sistema cambia.

Actor

Validadores que votan

Cada attestation lleva a la vez un voto de cabeza y un voto de finalidad.

Evidencia

Enlace de supermayoría

Votos de al menos 2/3 del stake entre dos checkpoints.

Estado

Cabeza, justificado, finalizado

Tres marcas distintas sobre el mismo árbol de bloques.

Preguntas guía

  • Si un bloque es la cabeza, ¿qué garantía tienes sobre él? ¿Y si está finalizado?
  • ¿Por qué LMD-GHOST cuenta solo el último voto de cada validador?
  • ¿Qué tiene que pasar para que un checkpoint justificado se finalice?
  • ¿Por qué el número mágico es un tercio del stake y no la mitad?

Conexiones dentro de la serie

Dos preguntas distintas: cabeza y finalidad

En condiciones normales, el fork choice casi no trabaja. Hay un único proponente por slot y los validadores honestos votan su bloque. La regla solo decide algo cuando hay mucha asincronía en la red o un proponente que publica dos bloques para el mismo slot. En esos casos, es la defensa que mantiene a todos en la misma rama.

La finalidad, en cambio, trabaja siempre y a otro ritmo. Solo los bloques en el límite de cada epoch, los checkpoints, pueden justificarse y finalizarse. Por eso la cabeza avanza cada 12 segundos y la finalidad avanza de epoch en epoch.

El original de Casper FFG traía su propia regla: seguir la cadena con el checkpoint justificado de mayor altura. Gasper la sustituyó por LMD-GHOST. La pieza que los une es simple: LMD-GHOST no empieza a buscar la cabeza desde la génesis, sino desde el último checkpoint justificado. FFG fija el pasado; LMD-GHOST elige el presente sobre ese pasado.

Figura 1

Gasper: FFG fija el pasado y LMD-GHOST elige la cabeza

Fuentes:

[2][4][3]
Gasper: FFG fija el pasado y LMD-GHOST elige la cabeza
Cómo leer esta figura

Diagrama en dos zonas separadas por una línea discontinua. Zona izquierda, titulada Casper FFG: el checkpoint C sub e menos 1, marcado finalizado, apunta al checkpoint C sub e, marcado justificado; un arco verde por encima los une con la etiqueta enlace mayor o igual a dos tercios del stake. Debajo: qué ya no se revierte sin quemar al menos un tercio del stake. Zona derecha, titulada LMD-GHOST: desde C sub e salen dos ramas, una azul hacia A1 con peso w de A1 y luego A2 marcada cabeza, y otra gris hacia B1 con peso w de B1. Debajo: desde C sub e elige el hijo con más peso, w de A1 mayor que w de B1, con el último voto de cada validador.

Visual original de TrautsLab. Un enlace de supermayoría entre el checkpoint C(e-1) y su hijo directo C(e) finaliza el primero y justifica el segundo. Desde el checkpoint justificado, LMD-GHOST baja por el hijo con más peso de votos hasta la cabeza.

Estado de votos en LMD-GHOST: el último mensaje de cada validador

El nombre se lee en dos partes. Latest message driven: si un validador votó varias veces, solo cuenta su voto más reciente. Greedy heaviest observed subtree: en cada bifurcación se elige el hijo cuyo subárbol acumula más peso de votos. El peso es saldo efectivo, no número de validadores.

La especificación lo escribe en pocas líneas. Este es un extracto de get_head:

python
# Extracto de consensus-specs, phase0/fork-choice.md (comentarios traducidos)
def get_head(store: Store) -> ForkChoiceNode:
    nodes = get_filtered_node_tree(store)
    head = ForkChoiceNode(root=store.justified_checkpoint.root)
    while True:
        children = [child for child in get_node_children(store, head) if child in nodes]
        if len(children) == 0:
            return head
        # Más peso gana; empate: raíz lexicográficamente mayor
        head = max(children, key=lambda child: (get_weight(store, child), child.root))

get_weight suma el saldo efectivo de los validadores activos y no penalizados cuyo último mensaje apoya ese nodo o un descendiente. Los validadores detectados votando dos veces de forma contradictoria quedan fuera de la suma.

Un ejemplo hipotético con cinco validadores de igual saldo. Tres votaron por última vez a A2 y dos a B1. Aunque uno de los tres hubiera votado antes a B1, ese voto viejo ya no cuenta. El subárbol de A1 pesa tres y el de B1 pesa dos: la cabeza es A2.

Hay un ajuste más, el proposer boost. Si un bloque llega a tiempo en su slot, recibe durante ese slot un peso extra igual a PROPOSER_SCORE_BOOST = 40 % del peso medio de un comité. Como razonamiento: ese extra dificulta que alguien guarde votos para reorganizar un bloque honesto publicado a tiempo.

Invariante de Casper FFG: justificar, finalizar y no contradecirse

Cada attestation incluye un voto FFG con dos checkpoints: source, el último justificado que ve el validador, y target, el checkpoint de la epoch actual. Un enlace de supermayoría entre a y b existe cuando validadores con al menos 2/3 del depósito votan con source a y target b.

Las reglas son recursivas. Un checkpoint está justificado si es la raíz o si hay un enlace de supermayoría que llega a él desde otro justificado. Está finalizado si está justificado y hay un enlace de supermayoría desde él hasta su hijo directo. En la práctica de Ethereum: dos epochs seguidas justificadas, la primera queda finalizada.

La especificación lo implementa con un registro de bits de las últimas epochs justificadas y cuatro casos de finalización; el más común es "las dos epochs más recientes justificadas, la más nueva usando la anterior como source". El umbral es literal: el saldo que votó el target multiplicado por 3 debe ser mayor o igual que el saldo activo total multiplicado por 2.

Estado de votos

De votos a finalidad en el caso normal

Caso más frecuente: dos epochs consecutivas justificadas. La especificación contempla otros tres casos con saltos de epoch.
  1. Epoch eLos validadores votan source C(e-1), ya justificado, y target C(e).
  2. C(e) justificadoVotos con al menos 2/3 del saldo activo forman el enlace C(e-1) a C(e).
  3. Epoch e+1Los votos pasan a source C(e) y target C(e+1).
  4. C(e) finalizadoEl enlace C(e) a C(e+1) llega a 2/3: C(e+1) se justifica y C(e), con su hijo directo justificado, se finaliza.

¿Qué impide votar a dos ramas a la vez? Dos reglas de slashing, que la especificación comprueba así:

python
# Extracto de consensus-specs, phase0/beacon-chain.md
def is_slashable_attestation_data(data_1: AttestationData, data_2: AttestationData) -> bool:
    return (
        # Double vote
        (data_1 != data_2 and data_1.target.epoch == data_2.target.epoch)
        or
        # Surround vote
        (data_1.source.epoch < data_2.source.epoch and data_2.target.epoch < data_1.target.epoch)
    )

Doble voto: dos votos distintos con el mismo target. Voto envolvente: un voto cuyo intervalo de epochs contiene estrictamente al de otro.

Por qué un tercio: seguridad responsable y vivacidad plausible

Casper FFG prueba dos propiedades. Accountable safety: dos checkpoints en conflicto no pueden quedar ambos finalizados a menos que al menos un tercio de los validadores viole una regla de slashing. Plausible liveness: pase lo que pase antes, si al menos dos tercios siguen el protocolo, siempre pueden crear enlaces nuevos sin violar ninguna regla.

El argumento del tercio es aritmética de cuórums. Si dos tercios votaron una rama y dos tercios otra, la intersección es al menos un tercio, y esos validadores votaron dos veces. Como el doble voto se castiga al máximo, revertir la finalidad exige quemar al menos un tercio del ETH en staking.

El mismo número explica el riesgo opuesto. Con más de un tercio del stake desconectado o en contra, nadie puede formar dos tercios y la finalidad se detiene. Para eso existe el inactivity leak: si la cadena no finaliza durante más de cuatro epochs, los validadores que no votan con la mayoría pierden saldo poco a poco hasta que la mayoría recupera los dos tercios. El mecanismo tiene su propio capítulo de investigación: inactivity leaks como cura para particiones masivas.

Riesgo operativo

Qué le puedes prometer a un usuario según la marca del bloque

Las tres marcas viven en el mismo árbol; difieren en cuánto cuesta revertirlas.

Cabeza

Resultado de LMD-GHOST en tu nodo ahora mismo.

  • Puede cambiar con votos nuevos o con latencia de red.
  • Sirve para mostrar estado provisional en una interfaz.

Justificado

Checkpoint con enlace de supermayoría desde otro justificado.

  • Difícil de revertir, pero todavía posible en condiciones raras.
  • Es el punto de partida de LMD-GHOST.

Finalizado

Justificado y con enlace a su hijo directo.

  • Revertirlo exige que al menos 1/3 del stake sea penalizado.
  • Es el umbral razonable para acreditar depósitos de valor alto.

Vuelve al depósito perdido del principio. La corrección no es esperar "más bloques" a ojo, sino leer el bloque finalized del nodo y acreditar solo lo que está por debajo. Cuesta minutos de latencia, y es la única marca con una garantía que se puede explicar en una frase.

Referencias

Bibliografía académica

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

    ethereum.org, "Gasper," Ethereum developer documentation, accessed 2026-11-12.

    official docsID: ETH-GASPER-DOCSAbrir fuente (abre en otra pestaña)

    Casper FFG más LMD-GHOST; justificación y finalización por checkpoints; inactivity leak; definición de LMD-GHOST.

  2. [2]

    V. Buterin, D. Hernandez, T. Kamphefner, K. Pham, Z. Qiao, D. Ryan, J. Sin, Y. Wang, and Y. X. Zhang, "Combining GHOST and Casper," arXiv:2003.03052, 2020.

    Define Gasper como versión idealizada de la Beacon Chain y prueba safety, plausible liveness y probabilistic liveness.

  3. [3]

    ethereum/consensus-specs, "Phase 0: Beacon Chain Fork Choice," GitHub specification, accessed 2026-11-12.

    specID: CONSENSUS-SPECS-FORK-CHOICEAbrir fuente (abre en otra pestaña)

    get_head, get_weight, latest_messages y PROPOSER_SCORE_BOOST = 40.

  4. [4]

    V. Buterin and V. Griffith, "Casper the Friendly Finality Gadget," arXiv:1710.09437, 2017.

    Enlaces de supermayoría, checkpoints justificados y finalizados, accountable safety y plausible liveness.

  5. [5]

    ethereum.org, "Proof-of-stake (PoS)," Ethereum developer documentation, accessed 2026-11-12.

    official docsID: ETH-POS-DOCSAbrir fuente (abre en otra pestaña)

    Checkpoints, enlace de supermayoría, coste de revertir la finalidad e inactivity leak tras más de cuatro epochs.

  6. [6]

    ethereum/consensus-specs, "Phase 0: The Beacon Chain," GitHub specification, accessed 2026-11-12.

    specID: CONSENSUS-SPECS-PHASE0Abrir fuente (abre en otra pestaña)

    weigh_justification_and_finalization e is_slashable_attestation_data.

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

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.