Gossip e o Grafo de Canais
Como os nos descobrem canais publicos, politicas de roteamento e caminhos possiveis
Lightning · Técnico
No roteamento onion, a origem precisa conhecer uma rota antes de montar o pacote criptografado. Mas a Lightning nao tem um servidor central dizendo quais canais existem. Cada no aprende a rede por gossip: mensagens assinadas que anunciam canais publicos, metadados de nos e politicas de roteamento.
O resultado local desse processo e o grafo de canais. Nesse grafo, os vertices sao node ids, as arestas sao canais publicos e cada direcao da aresta tem uma politica propria: fee base, fee proporcional, CLTV delta, valor minimo, valor maximo e flag de disponibilidade. A busca de caminho usa esse grafo para escolher uma rota, mas o gossip nao garante que a rota tenha liquidez real.
A especificacao principal e a BOLT 7. Ela conecta Lightning diretamente ao Bitcoin on-chain, porque um canal publico so deve ser aceito se apontar para uma funding transaction existente.
Conteúdo
Modelo mental
Gossip nao e o pagamento. Gossip e o mapa publico aproximado que permite calcular uma rota. O pagamento real ainda usa HTLCs, commitments e onion routing.
- Dois peers abrem um canal on-chain com uma funding transaction.
- Se quiserem tornar o canal publico, eles trocam assinaturas de anuncio.
- Depois que a funding output tem profundidade suficiente, um
channel_announcementpode ser propagado. - Cada lado publica seu proprio
channel_update, porque a politica de encaminhamento e direcional. - Os node ids envolvidos podem publicar
node_announcementcom alias, cor, enderecos e features. - Outros nos validam, armazenam e repassam essas mensagens para montar seu proprio grafo.
Descricao longa do diagrama
O diagrama mostra varios nos Lightning conectados. Uma mensagem channel_announcement destaca a existencia de um canal publico. Mensagens channel_update aparecem em cada direcao do canal, indicando taxas e CLTV. Uma mensagem node_announcement aparece ligada a um no, indicando alias e endereco. Setas simples mostram as mensagens sendo repassadas pela rede.
Mensagens BOLT 7
A BOLT 7 nao define apenas tres mensagens publicas. Ela tambem define mensagens de consulta e filtros para sincronizar o grafo sem depender de receber tudo por inundacao.
| Tipo | Mensagem | Escopo | Funcao |
|---|---|---|---|
| 259 | announcement_signatures | entre os dois peers do canal | Troca assinaturas antes de publicar um canal publico. |
| 256 | channel_announcement | gossip publico | Prova que um canal publico existe e liga dois node ids a uma funding output on-chain. |
| 258 | channel_update | gossip publico | Anuncia a politica de roteamento de uma direcao do canal. |
| 257 | node_announcement | gossip publico | Anuncia metadados do no: alias, cor, enderecos e features. |
| 261 | query_short_channel_ids | sincronizacao | Pede anuncios e updates para uma lista de SCIDs. |
| 263 | query_channel_range | sincronizacao | Pede os SCIDs conhecidos em uma faixa de blocos. |
| 265 | gossip_timestamp_filter | sincronizacao | Filtra updates por timestamp para receber apenas informacao recente. |
Essas mensagens viajam dentro do protocolo wire. Portanto, elas seguem a moldura geral da BOLT 1: type de 2 bytes e payload especifico da mensagem.
Antes do anuncio publico
O canal publico nao aparece magicamente no gossip. Primeiro, os dois peers precisam trocar announcement_signatures. Essa mensagem e enviada entre os participantes do canal, nao como gossip global. Ela permite que cada lado obtenha as assinaturas necessarias para construir um channel_announcement completo.
Essa etapa importa porque um anuncio publico precisa provar duas coisas ao mesmo tempo:
- os dois node ids Lightning aceitam associar seus nos ao canal;
- as duas chaves Bitcoin da funding output aceitam associar aquela saida on-chain ao canal anunciado.
Sem essa dupla prova, qualquer pessoa poderia inventar canais falsos entre node ids conhecidos ou apontar para saidas Bitcoin que nao controla.
channel_announcement
O channel_announcement e o certificado publico de existencia do canal. Ele diz: "existe um canal publico nesta blockchain, localizado por este short channel id, entre estes dois node ids, com estas chaves Bitcoin na funding output".
| Campo | Tamanho | Funcao |
|---|---|---|
| node_signature_1/2 | 64 bytes cada | Assinaturas dos dois node ids sobre o anuncio. |
| bitcoin_signature_1/2 | 64 bytes cada | Assinaturas das duas chaves Bitcoin que controlam a funding output. |
| features | variavel | Feature bits do canal, codificados como vetor de features. |
| chain_hash | 32 bytes | Identifica a blockchain onde a funding transaction existe, como Bitcoin mainnet ou testnet. |
| short_channel_id | 8 bytes | Localizacao compacta da funding output: bloco, indice da transacao e indice da saida. |
| node_id_1/2 | 33 bytes cada | Chaves publicas comprimidas dos dois nos Lightning. |
| bitcoin_key_1/2 | 33 bytes cada | Chaves publicas Bitcoin usadas na saida de financiamento 2-de-2. |
O ponto anti-spam esta aqui: para anunciar um canal publico, o anunciante precisa apontar para bitcoin realmente travado em uma saida de transacao. Verificar essa saida exige conceitos de altura de bloco, txid, vout, UTXO e P2WSH ou outro formato de script usado pela funding output.
ao receber channel_announcement:
1. conferir se chain_hash e da rede esperada
2. decodificar short_channel_id em bloco, txindex e outputindex
3. localizar a transacao no bloco indicado
4. conferir se a saida indicada existe e ainda corresponde a funding output valida
5. verificar as bitcoin_signature_1/2 contra as bitcoin_key_1/2
6. verificar as node_signature_1/2 contra os node_id_1/2
7. aceitar o canal no grafo somente se as provas baterem A validacao exata depende do estado da cadeia visto pelo no. Uma reorganizacao, uma funding transaction ainda rasa ou um fechamento de canal podem mudar se aquele canal deve permanecer no grafo local.
Short Channel ID (SCID)
O Short Channel ID e um identificador compacto de 8 bytes. Ele nao e um hash aleatorio. Ele codifica a localizacao da funding output dentro da blockchain:
SCID = blockheight x txindex x outputindex
SCID numerico = (blockheight << 40) | (txindex << 16) | outputindex | Parte | Tamanho | Exemplo | Significado |
|---|---|---|---|
| blockheight | 24 bits | 700000 | Altura do bloco que confirmou a funding transaction. |
| txindex | 24 bits | 1337 | Posicao da funding transaction dentro daquele bloco. |
| outputindex | 16 bits | 0 | Indice da funding output dentro da transacao. |
Na forma humana, o mesmo valor costuma aparecer como 700000x1337x0. O x e apenas separador. Por baixo, os tres campos sao empacotados em um inteiro de 64 bits.
Descricao longa do diagrama
O diagrama mostra uma pilha simples de blocos. Um bloco especifico esta marcado pela altura. Dentro dele ha uma lista de transacoes, com uma transacao marcada pelo indice. Dentro dessa transacao ha saidas numeradas, e a saida zero esta destacada como funding output. Ao lado, o valor 700000x1337x0 e decomposto em bloco, transacao e saida.
channel_update
O channel_announcement diz que o canal existe. O channel_update diz se uma direcao daquele canal pode ser usada para roteamento e quanto custa usar essa direcao.
Isso e direcional. Um canal entre Alice e Bob pode ter uma politica para Alice -> Bob e outra para Bob -> Alice. Por isso, um canal publico normalmente tem dois updates ativos, um por sentido.
| Campo | Tamanho | Funcao |
|---|---|---|
| signature | 64 bytes | Assinatura do node id responsavel por esta direcao. |
| chain_hash | 32 bytes | Blockchain da funding output. |
| short_channel_id | 8 bytes | Canal ao qual esta politica pertence. |
| timestamp | 4 bytes | Versao temporal do update; updates antigos sao ignorados. |
| message_flags | 1 byte | Indica se campos opcionais, como htlc_maximum_msat, aparecem. |
| channel_flags | 1 byte | Indica a direcao e se aquela direcao esta desabilitada. |
| cltv_expiry_delta | 2 bytes | Diferenca minima de CLTV exigida entre HTLC de entrada e de saida. |
| htlc_minimum_msat | 8 bytes | Menor HTLC que o no aceita encaminhar por essa direcao. |
| fee_base_msat | 4 bytes | Taxa fixa cobrada por encaminhamento nessa direcao. |
| fee_proportional_millionths | 4 bytes | Taxa proporcional em partes por milhao do valor encaminhado. |
| htlc_maximum_msat | 8 bytes opcional | Maior HTLC aceito nessa direcao, se anunciado. |
A formula de fee anunciada para um hop e:
fee_msat = fee_base_msat + floor(amount_to_forward_msat * fee_proportional_millionths / 1_000_000) O cltv_expiry_delta entra no calculo de timeout da rota. Cada hop exige que o HTLC de entrada tenha mais blocos de folga que o HTLC de saida. Isso da tempo para reagir a falhas e fechamentos unilaterais. Veja a relacao com locktime e com a operacao de HTLCs em canais.
canal: 700000x1337x0
direcao: node_id_1 -> node_id_2
fee_base_msat = 1000
fee_proportional_millionths = 250
cltv_expiry_delta = 40
htlc_minimum_msat = 1000
htlc_maximum_msat = 500000000
valor a encaminhar = 200000 msat
fee = 1000 + floor(200000 * 250 / 1000000)
fee = 1050 msat Nao confunda politica de roteamento com liquidez. O gossip pode dizer que uma direcao cobra 1050 msat para encaminhar, mas nao revela se ha saldo remoto suficiente para encaminhar aquele pagamento agora.
node_announcement
O node_announcement descreve um no publico. Ele ajuda carteiras, exploradores e peers a exibirem e encontrarem aquele no, mas nao cria canal sozinho. Um no sem canal publico relevante nao e util para o grafo de roteamento publico.
| Campo | Funcao |
|---|---|
| signature | Assinatura do node id sobre o anuncio. |
| features | Features do no, como suporte a campos opcionais e extensoes. |
| timestamp | Versao temporal do anuncio. |
| node_id | Chave publica comprimida que identifica o no Lightning. |
| rgb_color | Cor publica exibida por exploradores e UIs. |
| alias | Nome curto publico, nao confiavel e nao unico. |
| addresses | Enderecos de rede onde outros peers podem tentar conexao. |
Alias e cor nao sao identidade forte. A identidade forte e o node id, uma chave publica comprimida. Dois nos podem escolher aliases parecidos, e um alias pode mudar ao longo do tempo.
Sincronizacao de gossip
Um no recem-conectado nao precisa esperar passivamente o mundo inteiro reenviar todos os anuncios. A BOLT 7 define mensagens de consulta para sincronizar o grafo por faixas de blocos, listas de SCIDs e janelas de timestamp.
| Mensagem | Uso |
|---|---|
| query_channel_range | Pergunta quais SCIDs existem em uma faixa de alturas de bloco. |
| reply_channel_range | Responde com uma lista compacta de SCIDs e pode indicar se a resposta esta completa. |
| query_short_channel_ids | Pede os anuncios e updates correspondentes a SCIDs especificos. |
| reply_short_channel_ids_end | Marca o fim da resposta para uma consulta por SCID. |
| gossip_timestamp_filter | Pede apenas mensagens com timestamp dentro de uma janela. |
Na pratica, a rede precisa equilibrar atualidade e custo. Flooding agressivo demais desperdicaria banda. Flooding lento demais deixaria carteiras calculando rotas com politicas antigas. Por isso, implementacoes fazem deduplicacao, ignoram updates antigos, aplicam limites de frequencia e podam canais fechados ou obsoletos.
Montando o grafo de canais
Cada no constroi seu proprio grafo local. Nao existe "o grafo oficial" da Lightning. Existem visoes locais que convergem razoavelmente, mas podem divergir por latencia, filtros, conexoes, canais privados, politicas recentes e informacoes que ainda nao chegaram.
| Mensagem | Elemento no grafo | Dados usados |
|---|---|---|
| channel_announcement | aresta | SCID, dois node ids, chaves Bitcoin e prova on-chain do canal. |
| channel_update | aresta direcional | fees, CLTV delta, limites de HTLC, flag disabled e timestamp. |
| node_announcement | vertice | alias, cor, enderecos e features do no. |
para montar o grafo:
1. guardar channel_announcement valido como canal publico
2. anexar channel_update de cada direcao ao canal
3. ignorar update com timestamp mais antigo que o conhecido
4. marcar direcao como indisponivel quando o bit disabled estiver ativo
5. guardar node_announcement somente para node id ligado a canal conhecido
6. podar canais fechados ou inconsistentes com a cadeia
7. entregar o grafo resultante para a busca de caminho
Descricao longa do diagrama
O diagrama mostra um grafo com varios nos conectados por canais. Os nos aparecem como circulos e os canais como linhas. Algumas linhas possuem setas em sentidos diferentes, indicando que cada direcao pode ter politica propria. Uma caixa lateral lista dados vindos de channel_announcement, channel_update e node_announcement.
Canais publicos vs. privados
Nem todo canal entra no gossip. Um canal privado, ou nao anunciado, existe entre dois peers, mas nao aparece no grafo publico. Ele ainda pode receber ou enviar pagamentos, desde que o pagador receba informacao suficiente por outro caminho.
Em invoices BOLT 11, isso aparece como routing hints no campo r. O recebedor inclui uma pequena rota final com node id, SCID, fee base, fee proporcional e CLTV delta para que o pagador consiga chegar ate um canal que nao descobriria pelo gossip publico.
Essa diferenca e importante para privacidade: canal privado reduz exposicao no grafo publico, mas nao torna o pagamento invisivel para os peers envolvidos. Tambem aumenta a dependencia de hints corretos e atualizados na invoice.
Ferramenta: Short Channel ID
A ferramenta abaixo converte entre a forma humana blocoxtxxsaida, decimal e hexadecimal do SCID. Ela e didatica e roda somente no navegador. Nao cole dados sensiveis de carteira; SCID de canal publico pode ser publico, mas exemplos educativos devem usar valores ficticios.
Short Channel ID
Privacidade, seguranca e limites
Gossip e publico por design. Isso ajuda roteamento e auditoria, mas expõe metadados:
- node id, alias e enderecos de rede podem ligar infraestrutura a uma identidade operacional;
- canais publicos revelam funding outputs, capacidade inicial e relacao entre dois node ids;
- updates revelam politica de fees, CLTV e disponibilidade declarada;
- o grafo nao revela liquidez local/remota, entao pagamentos ainda podem falhar;
- canais privados nao aparecem no grafo, mas podem ser inferidos por routing hints, probing ou comportamento de pagamentos.
Do ponto de vista de seguranca, a regra mais importante e nao aceitar gossip sem validacao. Assinaturas, chain hash, SCID, funding output e timestamps existem para impedir spam barato, impersonacao e atualizacoes antigas sobrescrevendo informacao mais nova.
Armadilhas comuns
- Tratar SCID como txid. O SCID aponta para posicao no bloco, nao e hash da transacao.
- Assumir que canal publico tem liquidez. Gossip anuncia existencia e politica, nao saldo disponivel.
- Ignorar direcao. Fees e CLTV delta pertencem a uma direcao do canal, nao ao canal inteiro.
- Aceitar update antigo. O timestamp evita que informacao velha substitua politica mais recente.
- Confiar em alias. Alias e metadado visual; node id e a identidade criptografica.
- Publicar canal sem pensar em privacidade. Um canal publico fica ligado a uma funding output on-chain e a dois node ids.
Mapa de dependências conceituais
Antes de ler esta página
- Canais de Pagamento a fundo
- Operacao de Canais e Encaminhamento
- Protocolo Wire
- Altura de bloco
- Saidas de transacao
Depois desta página
- Busca de Caminho
- Pedidos de Pagamento BOLT 11
- Seguranca e Privacidade a fundo
- Ferramenta Short Channel ID
Referências técnicas usadas
- BOLT 7: P2P Node and Channel Discovery
- BOLT 1: Base Protocol
- BOLT 2: Peer Protocol for Channel Management
- BOLT 11: Invoice Protocol for Lightning Payments
Com o grafo em maos, o proximo problema e escolher uma rota que provavelmente funcione, pese fees, respeite CLTV e lide com falhas. Esse e o assunto da busca de caminho.