Substrate: del runtime al consenso propio

Artículo 17 de 20

85%

completado al llegar aquí

Sistemas distribuidosNota de investigación18 min de lectura

Sassafras: un solo productor por slot, en secreto

Cómo Sassafras busca un bloque por slot sin revelar al productor: tickets con ring VRF, repetidores y orden outside-in. Estado real en el Polkadot SDK: experimental.

Ruta Substrate: 0/20

Prerequisitos recomendados

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

Un equipo mide los intervalos entre bloques de su red BABE durante una semana. El promedio coincide con la duración del slot, pero la distribución no: hay huecos de dos y tres slots, y de vez en cuando dos bloques compiten por la misma altura. Alguien propone pasarse a Aura, que produce un bloque por turno con regularidad de reloj. Otro responde que con Aura cualquiera sabe quién produce el bloque de las 10:00:06, y que un atacante puede tumbar a ese nodo un segundo antes.

Sassafras intenta quedarse con lo mejor de ambos lados: exactamente un productor por slot, como Aura, y un productor desconocido hasta que produce, como BABE. Este capítulo explica cómo lo consigue y, con el mismo cuidado, en qué estado está dentro del Polkadot SDK. Spoiler honesto: es un componente experimental, sin cliente de nodo en la rama principal.

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 y sus repetidores

Cada validador genera tickets; otro validador al azar los publica en su nombre.

Evidencia

Ticket con ring VRF y prueba de pertenencia

Demuestra que lo emitió alguien del conjunto sin decir quién; al producir, el ganador revela que era suyo.

Estado

Lista ordenada de tickets de la próxima época

Vive en el almacenamiento del pallet experimental y fija el orden de producción.

Preguntas guía

  • ¿Qué problema de BABE y qué problema de Aura intenta resolver Sassafras a la vez?
  • ¿Qué es un ticket y por qué necesita una prueba de pertenencia a un anillo?
  • ¿Para qué sirve el repetidor y qué pasa si no colabora?
  • ¿Qué existe hoy en el Polkadot SDK y qué no?

Conexiones dentro de la serie

El problema: regularidad o secreto

Las dos familias de producción por slots que ya viste fallan en lugares opuestos. En BABE, la asignación es aleatoria, así que un slot puede tener varios ganadores o ninguno. La investigación de la Web3 Foundation lo resume con una imagen de fábrica de pan: los bloques salen "at unpredictable intervals, due to having multiple eligible block producers at once, or none at all."

Aura resuelve la regularidad con turnos fijos, pero paga en seguridad. El mismo texto advierte que si los productores se designan de forma no aleatoria y a intervalos fijos, "the chain becomes vulnerable to forking and denial-of-service attacks." Saber quién produce el próximo bloque es saber a quién atacar.

La categoría que resuelve ambas cosas se llama elección secreta de líder único (SSLE, single secret leader election): un solo líder por turno, y nadie salvo él sabe que lo es hasta que actúa. La misma fuente reconoce que las propuestas previas tenían problemas de eficiencia y que "none have been deployed to date". Sassafras es la propuesta de la Web3 Foundation para que una SSLE sea práctica.

El código del pallet define el objetivo con precisión de ingeniería: Sassafras "is a constant-time block production protocol that aims to ensure that there is exactly one block produced with constant time intervals rather than multiple or none." Fíjate en el verbo: aims. Es una meta de diseño, no una garantía demostrada en producción.

El ticket: una lotería que no revela al ganador

La idea base es una lotería por época. Todos los validadores evalúan una VRF sobre la misma entrada aleatoria y publican el resultado: ese valor es su ticket. El pallet lo describe así: cada validador firma la misma entrada VRF y publica la salida, que "is their lottery ticket that can be validated against their public key."

Hasta ahí, sería BABE con el resultado adelantado. El problema es evidente: si el ticket se valida contra la clave pública del validador, todos saben de quién es. El siguiente paso del pallet es justamente ocultar la clave: "We want to keep lottery winners secret, i.e. do not publish their public keys."

Pero sin clave pública, ¿cómo se evita que alguien publique tickets falsos y reserve slots que nunca usará? Cada slot reservado por un ticket falso sería un slot vacío, que es justo lo que el protocolo quería eliminar. La respuesta es una prueba de conocimiento cero que acompaña al ticket. El pallet la enuncia en lenguaje llano: "Here's my VRF output that has been generated using the given VRF input and my secret key. I'm not telling you my keys, but my public key is among those of the nominated validators".

Esa construcción tiene nombre: ring VRF, una VRF cuya prueba demuestra pertenencia a un "anillo" de claves sin señalar cuál. La investigación lo presenta como la novedad del protocolo: usa una ring VRF para elegir un único productor por bloque "while maintaining sufficient block producer secrecy within a “ring” of all participants." En el SDK, los primitivos de Sassafras declaran claves Bandersnatch (app_crypto!(bandersnatch, SASSAFRAS)) y exponen el contexto del anillo por runtime API.

Cuando llega su slot, el ganador demuestra que el ticket era suyo y produce el bloque. La nota técnica de la Web3 Foundation describe ese reclamo como una prueba no anónima de que la salida es de su VRF, que los demás nodos verifican al validar el bloque. El secreto dura exactamente hasta el momento en que ya no sirve atacarlo.

El repetidor y el orden outside-in

Una prueba de pertenencia no basta si el validador publica su propio ticket: la transacción delataría al emisor. Por eso el ticket viaja primero a otro validador. El pallet lo dice en una línea: "To anonymously publish the ticket to the chain a validator sends their tickets to a random validator who later puts it on-chain as a transaction." La investigación llama a ese intermediario repeater, "an identity guard".

¿Y si el repetidor no colabora? La nota técnica prevé que, si el ticket no aparece en cadena antes de cierto bloque, el propio validador lo publica. Pierde el anonimato de ese ticket, pero no el slot. Es un buen ejemplo de diseño defensivo: el camino privado es el normal, el público es la red de seguridad.

En cadena, el pallet recibe los tickets con la llamada submit_tickets, verifica la prueba de anillo y los acumula como candidatos ordenados para la próxima época. La asignación final a slots no sigue el orden de los tickets: "The assignment is computed dynamically using an outside-in strategy."

Outside-in significa que los tickets se reparten desde los extremos de la época hacia el centro. La nota técnica da el ejemplo (1,2,3,4,5) → (2,4,5,3,1). Si hay menos tickets que slots, los huecos quedan en el medio, y la nota indica que para esos slots "we use AuRa". Para que eso sea raro, el protocolo pide más tickets que slots: un factor de redundancia x = 2.

Figura 1

Sassafras: de los tickets secretos al orden de la época

Fuentes:

[1][2][4]
Sassafras: de los tickets secretos al orden de la época
Cómo leer esta figura

Fila superior con cuatro cajas encadenadas bajo el título época N: A, ticket con ring VRF y prueba de pertenencia; B, repetidor, cifrado para un validador al azar; C, on-chain, lo publica el repetidor con submit_tickets; D, orden, tickets ordenados con asignación outside-in. Desde D baja una flecha rotulada fija el orden hacia una llave que cubre la fila de la época N+1. Esa fila tiene siete casillas en orden t2, t4, t6, Aura en rojo, t5, t3 y t1, unidas por flechas. Un texto explica que cada slot tiene un ticket que su ganador reclama al producir y que si faltan tickets los slots del medio quedan para Aura. Un recuadro rojo final indica que en el Polkadot SDK existen pallet-sassafras y sp-consensus-sassafras, marcados como experimentales, y que no hay crate de cliente sc-consensus-sassafras en master.

Visual original de TrautsLab. En la época N cada validador genera un ticket con ring VRF, lo envía cifrado a un repetidor que lo publica, y los tickets ordenados fijan el orden outside-in de la época siguiente. Abajo, el estado del componente en el Polkadot SDK.

Hay una diferencia de calendario entre las fuentes que conviene no ocultar. El pallet habla de tickets para la próxima época; la nota técnica, más antigua en su formulación, consume en la época m+2 los tickets generados en la época m. Para un lector, la idea es la misma: el orden se fija antes de que empiece la época que lo usa. Para quien implemente, el calendario exacto es el del código, y queda a validar contra la versión del pallet que se use.

Lo que existe en el Polkadot SDK, y lo que no

Este es el punto donde un capítulo sobre Sassafras puede engañar sin querer, así que vamos por partes y con fuentes.

Existe un pallet. substrate/frame/sassafras está en el repositorio, y su README advierte: "The crate interfaces and structures are experimental and may be subject to changes." El mismo README enlaza un issue de seguimiento y una propuesta de RFC de la Fellowship (número 26).

Existen primitivos. substrate/primitives/consensus/sassafras define el identificador de motor SASS, las claves y la runtime API.

No existe un cliente de nodo en master. No hay substrate/client/consensus/sassafras: la ruta responde 404 y el Cargo.toml del workspace solo lista el pallet y los primitivos (comprobado el 13 de noviembre de 2026). Sin ese crate no hay slot worker, verificador ni import queue para Sassafras, es decir, nada de lo que en el capítulo de anatomía del consenso veremos que hace falta en el nodo. Con el código de master no se puede levantar una red que produzca bloques con Sassafras.

La adopción en Polkadot es una intención. La investigación dice que Polkadot "is set to replace" BABE y Aura por Sassafras, y que una especificación derivada, Safrole, se integró en el protocolo JAM. El estado de despliegue de Sassafras en Polkadot, y el de la RFC 26, quedan a validar: no encontramos una fuente primaria que confirme su activación.

Lista de verificación

Antes de adoptar un componente experimental de consenso

0 de 5 revisados

Qué cambia respecto de Ethereum

En la Beacon Chain de Ethereum, el proponente de cada slot sale de una semilla RANDAO ponderada por saldo efectivo, y desde Fulu la lista de proponentes de las próximas épocas se guarda en el estado. El capítulo La Beacon Chain desde cero lo detalla. El resultado es lo contrario del objetivo de Sassafras: el calendario de proponentes es público con antelación.

Comparación

¿Quién sabe quién produce el próximo bloque?

Comparación de modelo mental. Los detalles de cada protocolo están en sus capítulos.

Aura

Turnos fijos sobre la lista de autoridades.

  • Un productor por slot.
  • Calendario público y trivial de calcular.
  • Blanco fácil para denegación de servicio.

BABE

Lotería VRF privada por slot.

  • Productor desconocido hasta que publica.
  • Slots vacíos o con varios ganadores.
  • Intervalo entre bloques irregular.

Ethereum (Beacon Chain)

Un proponente por slot elegido con RANDAO.

  • Calendario conocido con antelación.
  • El slot queda vacío si el proponente falta.
  • Ver el capítulo de la Beacon Chain.

Sassafras (objetivo)

Tickets secretos ordenados antes de la época.

  • Un productor por slot como meta de diseño.
  • Identidad oculta hasta que produce.
  • Experimental en el Polkadot SDK.

Una diferencia de fondo merece atención: en la Beacon Chain el calendario público es una decisión aceptada, mientras que Sassafras pone el secreto del productor en el centro del diseño. Ninguno de los dos resuelve la finalidad por sí solo: Sassafras, como dice su propia investigación, puede combinarse con otro protocolo, por ejemplo GRANDPA, para obtener finalidad definitiva.

Cuándo vale la pena la complejidad

Volvamos al equipo del escenario. Sassafras ofrece intervalos regulares y productores ocultos, pero añade tres costes: una criptografía más pesada (pruebas de anillo con un contexto de configuración), un protocolo de publicación en dos saltos y una dependencia de componentes que hoy no tienen cliente de nodo.

Para una red privada con pocos validadores conocidos, el problema que Sassafras resuelve suele ser menor: los productores ya se conocen entre sí y la denegación de servicio se mitiga con red privada. Para una red pública grande, la regularidad del intervalo y el secreto del productor sí cambian el rendimiento y la superficie de ataque. La decisión no es "Sassafras sí o no", sino cuánto vale ese secreto frente a la madurez del código disponible.

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. No ejecuta Sassafras, porque no hay cliente de nodo en master.

Objetivo. Medir el problema que Sassafras intenta resolver, con los dos motores que sí funcionan, y razonar qué cambiaría.

Pasos propuestos.

  1. En la red BABE del laboratorio de BABE, registrar durante un periodo fijo el intervalo entre bloques consecutivos y contar slots vacíos y bloques en competencia.
  2. Repetir la medición en la misma red con Aura.
  3. Con los dos histogramas delante, discutir qué aportaría Sassafras sin ejecutarlo: qué forma tendría el histograma si la meta de un bloque por slot se cumpliera y qué información quedaría expuesta con Aura.

Evidencia esperada. Con Aura, intervalos concentrados en la duración del slot salvo cuando falta una autoridad. Con BABE, una distribución más ancha, con intervalos de varios slots y algunas alturas con dos bloques. La forma exacta depende del parámetro c de BABE y del número de autoridades, y queda a validar al construir el laboratorio.

Referencias

Bibliografía académica

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

    A. Caracheo, E. Crites, and F. Shirazi, "Sassafras Part 1: A Novel Single Secret Leader Election Protocol," Web3 Foundation Research, w3f/research, docs/Polkadot/protocols/Sassafras/sassafras-part-1.md, 2025.

    Motivación, SSLE con ring VRF, fases A a E, repetidor, relación con GRANDPA, intención de reemplazar BABE.

  2. [2]

    Parity Technologies, "pallet-sassafras: Extension module for Sassafras consensus," polkadot-sdk, substrate/frame/sassafras/src/lib.rs, commit 544e829, 2026.

    source codeID: SDK-SASSAFRAS-PALLETAbrir fuente (abre en otra pestaña)

    Objetivo del protocolo, lotería de tickets, SNARK de pertenencia, publicación vía otro validador, asignación outside-in, submit_tickets, contexto de ring VRF.

  3. [3]

    Parity Technologies, "sp-consensus-sassafras: Primitives for Sassafras consensus," polkadot-sdk, substrate/primitives/consensus/sassafras/src/lib.rs, commit 544e829, 2026.

    source codeID: SDK-SASSAFRAS-PRIMITIVESAbrir fuente (abre en otra pestaña)

    Tipos de autoridad Bandersnatch, SASSAFRAS_ENGINE_ID, runtime API con ring_context, peso de bloques primarios y secundarios.

  4. [4]

    Web3 Foundation Research, "SASSAFRAS," w3f/research, docs/Polkadot/protocols/block-production/SASSAFRAS.md, 2026.

    Parámetros (redundancia x = 2), fases de generación, publicación vía proxy, verificación, orden outside-in y fallback a Aura.

  5. [5]

    Parity Technologies, "pallet-sassafras: README," polkadot-sdk, substrate/frame/sassafras/README.md, commit 544e829, 2026.

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

    Advertencia de estado experimental; enlaces al issue de seguimiento y a la RFC 26 de la Fellowship.

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.