Enrutamiento Onion

Cómo esconder el camino de un pago

⚡ Lightning · Técnico

En encaminamiento, vimos que Bob ayuda a Alice a pagar a Carol. Pero eso levanta un problema de privacidad: ¿Bob debería saber que Alice es la origen y Carol es el destino? Ni hablar. El enrutamiento onion garantiza que cada nodo sepa solo de quién recibió y a quién reenviar — nada más.

La idea de la cebolla

La origen monta un paquete en capas cifradas, una para cada salto — como una cebolla. Cada nodo puede pelar exactamente una capa (la suya), y lo que encuentra dentro es:

O sea: Bob pela su capa, descubre "reenvía X a Carol", y pasa una cebolla más pequeña — sin saber nunca quién montó todo ni cuántos saltos quedan.

El paquete onion como una cebolla de capas cifradas, una por salto: la exterior para el primer nodo y el núcleo para el destino. Tamaño fijo de 1300 bytes.

Tamaño fijo: nadie sabe tu posición

Si la cebolla se encogiera a cada capa pelada, un nodo podría adivinar su posición en la ruta por el tamaño del paquete. Para evitar eso, el paquete onion tiene tamaño fijo (el payload de enrutamiento tiene 1300 bytes). A medida que las capas se van quitando, se añade un relleno (filler) pseudoaleatorio al final, manteniendo el tamaño constante. Así, cada nodo ve un paquete del mismo tamaño — sea el primer o el último salto.

Cómo se cifran las capas

Lightning usa un esquema basado en Sphinx (BOLT 4). La idea es generar un secreto compartido entre la origen y cada nodo de la ruta, sin que los nodos se hablen antes:

La origen monta la cebolla de dentro hacia fuera (del destino al primer salto), y cada capa lleva un HMAC para que el nodo verifique que su parte no fue alterada.

Derivación del secreto compartido: la clave efímera de la origen combinada por ECDH con la clave pública de cada nodo genera un secreto, del cual salen las claves de cifrado (rho) y de HMAC (mu).

Pelando una capa

Cuando un nodo recibe la cebolla (junto con el punto efímero actual), hace lo siguiente: rehace el ECDH para obtener el secreto compartido, deriva las claves, verifica el HMAC, descifra su capa para leer las instrucciones, "ciega" el punto efímero para el siguiente salto y reenvía la cebolla interna. Hoy los payloads son TLV (type-length-value), lo que permite incluir campos nuevos sin romper nodos antiguos.

Un nodo pelando una capa: entra la cebolla + punto efímero, el nodo deriva el secreto, verifica el HMAC, lee sus instrucciones (valor, cltv, siguiente salto) y reenvía la cebolla interna.

Arma una ruta y mira las capas que la origen construye (con los valores y CLTV de cada salto calculados de atrás hacia adelante):

Constructor de Ruta (Onion)

Constructor de Ruta Onion

Calcula, del destino hacia el origen, el valor, la tarifa y el CLTV de cada hop. Es una simulacion didactica del payload por hop, no un paquete Sphinx real.

Resultado de la ruta onion

¿Y cuando algo falla?

Los errores también vuelven cifrados en capas. El nodo donde falló el pago monta un mensaje de error y lo cifra con el secreto compartido de ese nodo; cada nodo en el camino de regreso añade su propia capa. Cuando el error llega a la origen, solo ella puede pelar todo y descubrir qué nodo falló y por qué — sin revelarlo a los intermediarios. Eso permite a la cartera probar otra ruta de forma inteligente.

Caminos cegados (route blinding)

Una adición más reciente son los caminos cegados (blinded paths), usados por los offers (BOLT 12). Dejan que el destinatario esconda la parte final de la ruta — la cartera monta la cebolla hasta un punto de entrada, y desde ahí el camino queda ciego, mejorando la privacidad de quien recibe (y no solo de quien paga).

Hasta aquí asumimos que la origen ya conoce la ruta. Pero ¿cómo descubre los nodos y canales que existen? Es el gossip y el grafo de canales — la próxima página.