Protocolo Wire
El formato de los mensajes entre nodos
⚡ Lightning · Técnico
Todo lo que vimos — abrir canales, mover HTLCs, comentar sobre la red — ocurre mediante mensajes que los nodos intercambian. El protocolo Wire (BOLT 1) define el formato de esos mensajes.
Un mensaje
Todo mensaje comienza con un tipo de 2 bytes (big-endian), seguido por el payload. El tipo dice qué es el mensaje (y, por tanto, cómo interpretar el resto):
[ tipo: 2 bytes ][ payload: bytes ] Hay mensajes de control (init, error, ping/pong), de canal (open_channel, commitment_signed, revoke_and_ack…) y de gossip (channel_announcement, node_announcement…). El primer mensaje intercambiado siempre es init, que carga los feature bits (BOLT 9) — lo que cada lado soporta.
Feature Bits (BOLT 9)
"It's ok to be odd"
¿Cómo evolucionar el protocolo sin romper nodos antiguos? Por la paridad del tipo:
- Tipo par → es obligatorio entenderlo. Si un nodo recibe un tipo par que no conoce, falla la conexión.
- Tipo impar → puede ser ignorado con seguridad si no se conoce. Es la regla "it's ok to be odd", que permite introducir funciones opcionales.
TLV: campos opcionales y extensibles
Para añadir campos nuevos a un mensaje sin reescribir el protocolo, se usa un stream TLV (type-length-value) al final del payload. Cada registro es:
[ type (BigSize) ][ length (BigSize) ][ value: length bytes ] Los registros van en orden creciente de tipo, y vale la misma regla par/impar (par = obligatorio, impar = opcional). El BigSize es un entero de tamaño variable: valores < 253 caben en 1 byte; si no, un prefijo 0xfd/0xfe/0xff indica 2, 4 o 8 bytes (big-endian).
Identifica un mensaje por su tipo y desarma un stream TLV:
Mensajes Wire y TLV
Los mensajes viajan dentro de un túnel cifrado entre los nodos. Cómo se establece ese túnel es el tema de la próxima página: el transporte cifrado (Noise).