Substrate: del runtime al consenso propio

Artículo 18 de 20

90%

completado al llegar aquí

Sistemas distribuidosNota de investigación17 min de lectura

BEEFY: finalidad compacta para puentes

Por qué GRANDPA es caro de verificar en Ethereum y cómo BEEFY firma compromisos ECDSA sobre una raíz MMR, con muestreo aleatorio en el light client del puente.

Ruta Substrate: 0/20

Un contrato en Ethereum custodia activos que representan saldos en Polkadot. Para liberar fondos necesita creer una sola afirmación: "el bloque 1 000 000 de la relay chain es final y su estado contiene este mensaje". En el capítulo de GRANDPA vimos que esa afirmación se demuestra con una justificación: firmas de más de dos tercios de los validadores. El problema es que verificar esa justificación dentro de la EVM es caro y, con las firmas que usa GRANDPA, poco práctico.

BEEFY (Bridge Efficiency Enabling Finality Yielder) existe para ese contrato. Al terminar este capítulo deberías poder explicar qué firma un validador BEEFY, por qué esa firma es más barata de verificar fuera de Polkadot, qué retraso añade frente a GRANDPA y qué confianza queda depositada en quien transporta las pruebas.

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 GRANDPA con claves BEEFY, relayer y light client

Los mismos validadores votan; un relayer lleva las pruebas; un contrato las verifica.

Evidencia

Compromiso firmado (justificación BEEFY)

Raíz MMR, número de bloque e id de conjunto, con firmas ECDSA de más de 2/3.

Estado

Mejor bloque BEEFY, por detrás del mejor GRANDPA

Lo que el puente considera final en la cadena de origen.

Preguntas guía

  • ¿Qué hace caro verificar una justificación GRANDPA fuera de Polkadot?
  • ¿Qué contiene un compromiso BEEFY y por qué se firma con ECDSA sobre secp256k1?
  • ¿Por qué BEEFY siempre va por detrás de GRANDPA, y cuánto?
  • ¿Qué supuestos añade el relayer y cómo los reduce el muestreo aleatorio?

Conexiones dentro de la serie

Por qué no basta con GRANDPA

La especificación de Polkadot define BEEFY como "a secondary protocol to GRANDPA to support efficient bridging between the Polkadot network (relay chain) and remote, segregated blockchains, such as Ethereum". La palabra clave es secundario: BEEFY no decide qué es final. Solo vuelve a atestiguar, en un formato más barato, lo que GRANDPA ya decidió.

La misma especificación explica el problema: "GRANDPA justifications are large and are expensive to verify on other chains like Ethereum that do not support some cryptographic signature schemes." Son dos costes distintos, y el README del crate sc-consensus-beefy los separa.

El primero es estructural. En GRANDPA cada votante vota por el bloque que cree más reciente y el protocolo finaliza el ancestro común con apoyo suficiente. El README lo dice así: "voters are voting on different things". Como cada voto puede apuntar a un bloque distinto, la prueba necesita los datos de cada voto y, a veces, cabeceras adicionales para comprobar las ascendencias.

El segundo es criptográfico. GRANDPA firma con ed25519, que según el mismo README "we can't efficiently verify in the EVM". Un contrato que quiera verificar cientos de firmas ed25519 paga un gas que hace inviable el puente.

Una nota sobre el umbral. El artículo de GRANDPA asume que, de n votantes, como mucho f son bizantinos, con f menor que n/3, y exige n − f votos para finalizar. BEEFY hereda ese modelo: sus rondas concluyen con "2/3rd + 1" votos válidos.

Qué firma un validador BEEFY

El README propone un modelo mental útil: BEEFY "should be considered as an extra voting round done by GRANDPA validators for the current best finalized block." Como el bloque ya es final, no hay bifurcaciones que resolver: todos votan exactamente lo mismo. Ese es el atajo que GRANDPA no puede tomar.

Lo que se firma es un compromiso. La especificación lo define como la tupla (payload, Block Number, ValidatorSetID); un compromiso firmado añade la lista de firmas. Un compromiso firmado válido es lo que el README llama justificación BEEFY o prueba de finalidad BEEFY.

El payload es, según la especificación, "the Merkle root of the MMR generated where the leaf data contains the following fields for each block". Cada hoja guarda la versión del formato, información del próximo conjunto de autoridades BEEFY, el número y hash del bloque padre y una raíz de las cabeceras de parachains.

Un Merkle Mountain Range (MMR) es un árbol de Merkle de solo inserción: una lista de subárboles perfectos que se fusionan a medida que crecen. La especificación lo elige porque añadir hojas no obliga a reconstruir el árbol. Para el puente, la consecuencia es concreta: con una sola raíz firmada, el contrato puede verificar después la inclusión de cualquier bloque anterior mediante una prueba de Merkle, sin haber visto cada cabecera.

La información del próximo conjunto de autoridades dentro de la hoja también importa. Es la forma en que el contrato aprende, de manera verificable, qué claves deberá aceptar en la sesión siguiente. Un puente que no siguiera esos cambios acabaría aceptando firmas de un conjunto viejo.

Claves ECDSA, rondas y retraso

Las claves cambian respecto de GRANDPA. La especificación: "Validators use an ECDSA key scheme for signing Beefy messages." El par de claves es secp256k1, y la clave pública ocupa 33 bytes en lugar de 32. El README explica la elección sin rodeos: la primera versión se pensó para un light client escrito en Solidity, "Hence the choice of the initial cryptography for BEEFY: secp256k1 and usage of keccak256 hashing function."

El conjunto de validadores es el mismo que el de GRANDPA, aunque con otras claves de sesión. Y el retraso es inherente: "BEEFY finalized block lags behind the best GRANDPA (finalized) block."

Figura 1

BEEFY: de la finalidad de GRANDPA al light client del puente

Fuentes:

[1][2][4]
BEEFY: de la finalidad de GRANDPA al light client del puente
Cómo leer esta figura

Fila superior con siete bloques B1 a B7 encadenados. Una flecha verde rotulada BEEFY apunta a B2, una azul rotulada GRANDPA apunta a B5 y una gris rotulada mejor producido apunta a B7; una nota dice que BEEFY solo vota bloques ya finalizados por GRANDPA y por eso va por detrás. En la segunda fila, una caja verde con el compromiso (payload raíz del MMR, número de bloque e id del conjunto de validadores) apunta a otra caja verde de firmas ECDSA secp256k1 de al menos dos tercios más uno del conjunto. Desde ahí, una flecha va a la caja del relayer, fuera de cadena, y otra al light client, un contrato en Ethereum. Una nota inferior explica el muestreo aleatorio de Snowbridge: el relayer se compromete, el contrato elige al azar unas pocas firmas y el relayer debe presentarlas; si no las presenta o no son válidas, el compromiso no se acepta.

Visual original de TrautsLab. En la cadena hay tres cabezas: la mejor producida, la mejor finalizada por GRANDPA y, por detrás, la mejor finalizada por BEEFY. Los validadores firman un compromiso sobre la raíz MMR con ECDSA; un relayer lo lleva a un light client en Ethereum que verifica una muestra aleatoria de firmas.

¿Cuánto retraso? Depende de cómo se eligen las rondas. El README define bloques obligatorios: el primero de cada sesión debe tener justificación BEEFY. Tras finalizar el obligatorio, la siguiente ronda apunta a un bloque cuya distancia al mejor BEEFY es una potencia de dos, según la mitad de la brecha con GRANDPA. Si BEEFY se atrasa, las rondas cambian con menos frecuencia para darles tiempo de concluir.

La regla tiene una lectura operativa: el retraso no es constante. Con buena red, BEEFY puede llegar a finalizar cada bloque que finaliza GRANDPA, aunque el README advierte que con bloques cortos será raro y sugiere un min_delta entre rondas; con validadores lentos, el salto entre bloques BEEFY crece. Un puente que promete tiempos de liberación tiene que medir esa distribución, no suponerla.

El relayer y el muestreo aleatorio

Los votos BEEFY viajan por gossip entre nodos de Polkadot. Ningún contrato de Ethereum escucha ese gossip: alguien tiene que llevarle las pruebas. La especificación llama a ese actor relayer: "an abstract entity that takes finality proofs from the Polkadot network and makes those available to the light clients."

El relayer no puede inventar finalidad: no tiene las claves de los validadores. Lo que sí puede hacer es no entregar, entregar tarde o intentar convencer al contrato con menos firmas de las necesarias. La seguridad del puente depende de que el contrato verifique lo suficiente, y la disponibilidad depende de que haya al menos un relayer honesto y activo. Esa es la pregunta de confianza que hay que documentar.

Aun con ECDSA, verificar todas las firmas es caro. La Web3 Foundation lo cuantifica: verificar 401 firmas por actualización, con unos 600 validadores en Polkadot, "remains expensive". La respuesta es un protocolo interactivo en tres fases: el relayer se compromete y afirma tener una supermayoría, aportando una firma que puede ser penalizada si es fraudulenta; el contrato usa RANDAO para elegir al azar unas 25 firmas; el relayer presenta exactamente esas.

La especificación recoge la misma idea con sus términos: el relayer guarda en la cadena remota unos datos testigo que indican qué validadores votaron, sin las firmas, y el light client pide después las firmas que quiere comprobar. La seguridad pasa a ser probabilística y criptoeconómica: el tamaño de la muestra se calcula para que atacar no compense.

Según la Web3 Foundation, ese diseño, Random Sampling BEEFY, protege Snowbridge, un puente entre Polkadot y Ethereum lanzado en junio de 2024. Las cifras de uso y valor bloqueado de esa fuente son de su fecha de publicación y no se repiten aquí.

Decisión de diseño

Qué finalidad consume un puente

Justificación GRANDPA

La prueba primaria de finalidad, con firmas ed25519 y votos sobre bloques distintos.

Ideal para
Puentes entre cadenas Substrate y light clients con verificación nativa de ed25519.
Ojo con
Cara o inviable de verificar en la EVM.
Precaución

BEEFY con todas las firmas

Compromiso ECDSA sobre raíz MMR, verificado por completo.

Ideal para
Destinos donde verificar cientos de firmas secp256k1 es asumible.
Ojo con
Va por detrás de GRANDPA; el coste crece con el número de validadores.
Recomendado

BEEFY con muestreo aleatorio

Compromiso, desafío con aleatoriedad del destino y respuesta con una muestra.

Ideal para
Puentes hacia Ethereum con conjuntos de validadores grandes.
Ojo con
Seguridad probabilística; depende de la calidad de la aleatoriedad y del cálculo de la muestra.
La elección cambia el retraso, el coste de verificación y los supuestos sobre el transportista de pruebas.

Dónde vive BEEFY en un nodo y en un runtime

En el Polkadot SDK, el nodo kitchensink es el ejemplo que conecta todas las piezas. Su runtime incluye pallet_beefy, pallet_mmr y pallet_beefy_mmr; este último configura el MMR para que cada nueva raíz se deposite como digest BEEFY (OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest<Runtime>) y convierte las claves ECDSA de las autoridades al formato de Ethereum (BeefyEcdsaToEthereum).

En el servicio del nodo, BEEFY se monta como un envoltorio más en la cadena de importación: FullBeefyBlockImport envuelve al BlockImport de GRANDPA, y el servicio registra un protocolo de gossip propio y un manejador de justificaciones bajo demanda. Es el mismo patrón que veremos en el capítulo siguiente: cada motor de finalidad entra al nodo por la cadena de BlockImport y por la red.

Para observarlo, el nodo expone suscripciones RPC paralelas: grandpa_subscribeJustifications y beefy_subscribeJustifications, además de beefy_getFinalizedHead. Son la base del laboratorio de este capítulo.

Qué cambia respecto de Ethereum

Quien viene de validadores, attestations y BLS conoce otra solución al mismo problema de tamaño: Ethereum agrega firmas BLS para que muchos votos quepan en poco espacio. BEEFY, en su versión actual, no agrega: usa ECDSA porque es lo que la EVM verifica barato, y compensa con un compromiso único y con muestreo. El README deja abierta la puerta a otros esquemas, incluidas firmas umbral, en el futuro.

La segunda diferencia es la dirección del puente. El capítulo Puentes y riesgo cross-chain clasifica los verificadores por tipo: multisig, comité, light client o pruebas de validez. Un puente con BEEFY es un light client de la finalidad de Polkadot dentro de Ethereum. Su riesgo no está en un multisig, sino en la corrección del contrato verificador, en la aleatoriedad usada para el muestreo y en la disponibilidad de relayers.

La tercera es el retraso. En Ethereum, la finalidad de Casper FFG avanza por épocas; en Polkadot, GRANDPA finaliza cadenas enteras y BEEFY va detrás. Un puente hacia Ethereum desde Polkadot hereda la suma de ambos: el retraso de GRANDPA, el de BEEFY y el tiempo que tarde el relayer en completar el protocolo de muestreo.

Laboratorio propuesto

Estado: propuesta. Este laboratorio todavía no está publicado en lab.trautslab.dev; describe lo que se construirá, en local, sin red pública ni fondos reales.

Objetivo. Ver con datos que BEEFY va por detrás de GRANDPA y comparar el tamaño de las dos justificaciones del mismo tramo.

Pasos propuestos.

  1. Levantar una red local con el nodo kitchensink, cuyo runtime incluye BEEFY, MMR y BEEFY-MMR, con al menos tres validadores.
  2. Suscribirse por RPC a grandpa_subscribeJustifications y beefy_subscribeJustifications y registrar, para cada justificación, el número de bloque y la hora de llegada.
  3. Para un mismo bloque con ambas justificaciones, comparar el tamaño en bytes de la codificación de cada una.

Evidencia esperada. Una serie de números de bloque BEEFY siempre menores o iguales que los de GRANDPA en el mismo instante, con saltos que crecen si se ralentiza la red. Una justificación BEEFY de tamaño fijo por firma frente a una GRANDPA que incluye datos por voto. Que el chain spec de desarrollo del kitchensink active BEEFY sin configuración extra, y los tamaños concretos, quedan a validar al construir el laboratorio.

Referencias

Bibliografía académica

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

    Web3 Foundation, "Polkadot Protocol Specification: Finality," w3f/polkadot-spec, docs/sect-finality.md, 2026.

    GRANDPA y BEEFY: motivación, mismo conjunto de validadores, claves ECDSA, MMR, compromiso firmado, relayer y light client.

  2. [2]

    Parity Technologies, "sc-consensus-beefy: README," polkadot-sdk, substrate/client/consensus/beefy/README.md, commit 544e829, 2026.

    source codeID: SDK-BEEFY-READMEAbrir fuente (abre en otra pestaña)

    Dificultades de las pruebas GRANDPA, objetivos de BEEFY, modelo mental, compromisos, rondas, bloques obligatorios, gossip, mala conducta, elección de secp256k1 y keccak256.

  3. [3]

    A. Stewart and E. Kokoris-Kogia, "GRANDPA: a Byzantine Finality Gadget," arXiv:2007.01560, 2020.

    Finality gadget, umbral f < n/3 y seguridad con responsabilidad.

  4. [4]

    Web3 Foundation Research, "BEEFY," w3f/research, docs/Polkadot/protocols/BEEFY.md, 2025.

    Random Sampling BEEFY: protocolo de compromiso, desafío y respuesta con RANDAO; uso en Snowbridge.

  5. [5]

    Parity Technologies, "Kitchensink node runtime," polkadot-sdk, substrate/bin/node/runtime/src/lib.rs, commit 544e829, 2026.

    source codeID: SDK-KITCHENSINK-RUNTIMEAbrir fuente (abre en otra pestaña)

    Configuración de pallet_beefy, pallet_mmr y pallet_beefy_mmr en el runtime de ejemplo.

  6. [6]

    Parity Technologies, "Kitchensink node service," polkadot-sdk, substrate/bin/node/cli/src/service.rs, commit 544e829, 2026.

    source codeID: SDK-KITCHENSINK-SERVICEAbrir fuente (abre en otra pestaña)

    Cadena de importación con BeefyBlockImport sobre GRANDPA, protocolo de gossip BEEFY y justificaciones bajo demanda.

  7. [7]

    Parity Technologies, "sc-consensus-beefy-rpc," polkadot-sdk, substrate/client/consensus/beefy/rpc/src/lib.rs, commit 544e829, 2026.

    source codeID: SDK-BEEFY-RPCAbrir fuente (abre en otra pestaña)

    Métodos RPC beefy_subscribeJustifications y beefy_getFinalizedHead.

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.