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)

Bits de Funcionalidades (BOLT 9)

Los mensajes init y los anuncios cargan un vector de bits que dice lo que un nodo soporta. Pega el vector en hex.

Use bytes big-endian, como aparecen en el mensaje.

Ejemplos:

Resultado de los feature bits

Estructura de un mensaje Wire: 2 bytes de tipo seguidos del payload; los tipos pares son obligatorios y los impares pueden ignorarse.

"It's ok to be odd"

¿Cómo evolucionar el protocolo sin romper nodos antiguos? Por la paridad del tipo:

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).

Un registro TLV: type, length y value (con type y length en BigSize), formando un stream ordenado por tipo.

Identifica un mensaje por su tipo y desarma un stream TLV:

Mensajes Wire y TLV

Mensajes Wire y TLV

Identifica el tipo de 2 bytes y valida la estructura genérica de un stream TLV. No valida el schema completo.

Tipo del mensaje

Los 2 primeros bytes son el tipo big-endian. El catálogo de nombres de esta herramienta es parcial.

Ejemplos:

Resultado del mensaje wire

Secuencia TLV

Secuencia type-length-value con BigSize mínimo y types en orden creciente.

Ejemplos:

Resultado del stream 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).