Protocolo Wire
O formato das mensagens entre nós
⚡ Lightning · Técnico
Tudo o que vimos — abrir canais, mover HTLCs, fofocar sobre a rede — acontece por mensagens que os nós trocam. O protocolo Wire (BOLT 1) define o formato dessas mensagens.
Uma mensagem
Toda mensagem começa com um tipo de 2 bytes (big-endian), seguido do payload. O tipo diz o que é a mensagem (e, portanto, como interpretar o resto):
[ tipo: 2 bytes ][ payload: bytes ] Há mensagens de controle (init, error, ping/pong), de canal (open_channel, commitment_signed, revoke_and_ack…) e de gossip (channel_announcement, node_announcement…). A primeira mensagem trocada é sempre a init, que carrega os feature bits (BOLT 9) — o que cada lado suporta.
Feature Bits (BOLT 9)
"It's ok to be odd"
Como evoluir o protocolo sem quebrar nós antigos? Pela paridade do tipo:
- Tipo par → é obrigatório entender. Se um nó recebe um tipo par que não conhece, ele falha a conexão.
- Tipo ímpar → pode ser ignorado com segurança se não for conhecido. É a regra "it's ok to be odd", que permite introduzir recursos opcionais.
TLV: campos opcionais e extensíveis
Para acrescentar campos novos a uma mensagem sem reescrever o protocolo, usa-se um stream TLV (type-length-value) no fim do payload. Cada registro é:
[ type (BigSize) ][ length (BigSize) ][ value: length bytes ] Os registros vêm em ordem crescente de tipo, e vale a mesma regra par/ímpar (par = obrigatório, ímpar = opcional). O BigSize é um inteiro de tamanho variável: valores < 253 cabem em 1 byte; senão, um prefixo 0xfd/0xfe/0xff indica 2, 4 ou 8 bytes (big-endian).
Identifique uma mensagem pelo seu tipo e desmonte um stream TLV:
Mensagens Wire e TLV
As mensagens viajam dentro de um túnel cifrado entre os nós. Como esse túnel é estabelecido é o assunto da próxima página: o transporte criptografado (Noise).