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:
- las instrucciones para él: cuánto reenviar (
amt_to_forward), con qué plazo (outgoing_cltv_value) y por qué canal (short_channel_iddel siguiente salto); - la cebolla interna (las capas restantes), que reenvía al siguiente nodo sin poder leerlas.
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.
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 crea una clave efímera y hace un ECDH (Diffie-Hellman en curva elíptica) con la clave pública de cada nodo. Eso da un secreto compartido por salto.
- De ese secreto se derivan claves específicas: una para cifrar la capa (rho), una para el HMAC de integridad (mu), y otras para el relleno.
- La clave efímera se "ciega" (blinded) en cada salto, así que cada nodo hace el ECDH con un punto efímero diferente — pero la origen ya lo calculó todo de antemano.
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.
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.
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)
¿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.