Busca de Caminho
Como a origem escolhe uma rota provavel, calcula fees e CLTV, e aprende com falhas
Lightning · Técnico
Com o grafo de canais em maos, a origem ainda nao tem uma resposta pronta. Ela sabe quais canais publicos foram anunciados, quais politicas de roteamento estao no channel_update e quais short_channel_id apontam para funding outputs on-chain. Mas ela nao sabe a informacao mais importante para entregar o pagamento: quanto saldo existe naquela direcao agora.
A busca de caminho e o processo de escolher uma rota, calcular o valor e o CLTV que cada hop deve receber, montar o pacote onion, tentar o pagamento e aprender com as falhas. A especificacao nao manda usar um algoritmo unico. Os BOLTs definem os dados e as regras que precisam ser respeitados; a escolha entre rotas e uma heuristica de implementacao.
As fontes primarias desta pagina sao a BOLT 7 para politicas de roteamento e gossip, a BOLT 4 para payloads e falhas onion, a BOLT 2 para HTLCs entre peers e a BOLT 11 para os dados vindos da invoice.
Conteúdo
Modelo mental
Na internet, cada roteador escolhe o proximo salto. Na Lightning, a origem escolhe a rota inteira. Isso e necessario porque a origem precisa construir a cebola antes de enviar o primeiro update_add_htlc. Cada hop recebe apenas seu proprio payload: quanto encaminhar, para qual canal e com qual CLTV.
Uma rota candidata tem esta forma:
Alice -> Bob -> Carol -> Dina Alice e a pagadora. Dina e a recebedora. Bob e Carol sao hops de encaminhamento. Alice calcula quanto deve oferecer a Bob para que Bob consiga pagar Carol, Carol consiga pagar Dina, cada hop receba sua taxa e todos os CLTVs tenham folga suficiente.
Descricao longa do diagrama
O diagrama mostra um grafo de nos Lightning. A origem aparece em um lado e o destino em outro. Varias rotas possiveis ligam os dois. Uma rota esta destacada, indicando que a origem escolheu todos os saltos antes de enviar o pagamento.
Entradas da busca
A busca combina dados publicos, dados privados e memoria local. Nenhum desses conjuntos e perfeito.
| Fonte | Dados usados |
|---|---|
| Invoice BOLT 11 | valor, destino, payment_hash, payment_secret, min_final_cltv_expiry_delta, features e routing hints opcionais. |
| Grafo de gossip | channel_announcement, channel_update, node_announcement, short_channel_id, politica direcional, flag disabled e timestamps. |
| Estado local | canais do proprio no, saldo local conhecido, peers conectados, limites do canal, HTLCs pendentes e historico de falhas. |
| Memoria de tentativas | penalidades e probabilidades aprendidas com falhas onion, pagamentos bem-sucedidos, probing e informacao expirada. |
A invoice diz o que pagar. O gossip diz por onde talvez seja possivel passar. O estado local diz por onde voce consegue sair agora. O historico de tentativas diz quais caminhos parecem ruins ou bons neste momento.
BOLT vs. heuristica
Esta separacao evita muita confusao:
- Especificacao: campos de
channel_update, formato do onion payload, formulas de fee, deltas de CLTV, mensagens de falha, validacoes de HTLC e dados da invoice. - Heuristica: escolher Dijkstra, Yen, A*, fluxo min-cost, penalidades probabilisticas, randomizacao, limite de tentativas, divisao MPP e politicas de privacidade.
- Implementacao: nomes como mission control, scoring interno, cache de liquidez, probing ativo e parametros de retry variam entre LND, Core Lightning, Eclair e outras carteiras.
Por isso, dizer "a Lightning usa Dijkstra" e uma simplificacao. Muitas implementacoes usam uma busca de menor custo sobre um grafo, frequentemente calculada de tras para frente porque fees e CLTV se acumulam a partir do destino. Mas a rede nao exige um algoritmo especifico.
entrada:
- invoice BOLT 11
- grafo local de gossip
- altura atual do bloco
- estado dos canais locais
- historico de tentativas
1. identificar destino, valor, payment_secret e CLTV final minimo
2. adicionar routing hints privados, se a invoice tiver campo r
3. filtrar arestas por direcao, disabled, min/max HTLC e features
4. calcular de tras para frente:
- valor que cada hop precisa receber
- taxa cobrada por cada hop
- CLTV de entrada exigido por cada hop
5. atribuir custo:
- taxa total
- custo de tempo por CLTV acumulado
- penalidades por falha ou baixa probabilidade
- custo de privacidade ou preferencia local
6. montar a onion route da melhor candidata
7. enviar update_add_htlc pelo primeiro canal
8. em caso de falha, atualizar penalidades e tentar outra rota Grafo candidato
O grafo de gossip nao pode ser usado cru. A carteira primeiro transforma o grafo publico em um conjunto de arestas candidatas para aquele pagamento. O filtro precisa respeitar a direcao exata do canal, porque channel_update e direcional.
| Verificacao | Por que importa |
|---|---|
| Direcao do canal | A politica usada e a do sentido exato do encaminhamento. Um canal publico tem duas direcoes possiveis. |
| channel_flags | O bit de direcao identifica qual node id assinou aquele update; o bit disabled remove aquela direcao da rota. |
| htlc_minimum_msat | O HTLC encaminhado precisa ser maior ou igual ao minimo anunciado para aquela direcao. |
| htlc_maximum_msat | Se anunciado, limita o maior HTLC aceito por aquela direcao; nao prova liquidez real. |
| fee_base_msat e fee_proportional_millionths | Definem a taxa que o hop cobra sobre o valor que ele vai encaminhar. |
| cltv_expiry_delta | Define a folga minima entre o HTLC de entrada e o HTLC de saida daquele hop. |
| features | O pagador precisa evitar rotas que exigem recursos que ele, os hops ou o recebedor nao suportam. |
O short_channel_id conecta a aresta do grafo a uma funding output na blockchain: altura do bloco, indice da transacao e indice da saida. Essa ligacao prova que o canal publico existiu, mas nao prova que a saida ainda tem uma distribuicao de saldos favoravel para o pagamento. Para entender essa ponte on-chain, revise UTXO, saida de transacao e Short Channel ID.
Fees de roteamento
A taxa Lightning de um hop nao e a mesma coisa que a taxa de minerador de uma transacao Bitcoin. A taxa on-chain paga espaco em bloco. A taxa Lightning remunera um no intermediario por bloquear liquidez e assumir risco operacional ao encaminhar HTLCs.
Na politica anunciada por channel_update, a formula e:
fee_msat = fee_base_msat + floor(amount_to_forward_msat * fee_proportional_millionths / 1_000_000) O detalhe importante e o sentido do calculo. Para saber quanto Alice deve enviar ao primeiro hop, ela comeca pelo valor que Dina precisa receber e anda para tras. Cada hop cobra taxa sobre o valor que ele vai encaminhar ao proximo hop.
| Direcao | Encaminha | Base | PPM | Taxa | Precisa receber |
|---|---|---|---|---|---|
| Carol -> Dina | 100.000 | 1.000 | 100 | 1.010 | 101.010 |
| Bob -> Carol | 101.010 | 500 | 200 | 520 | 101.530 |
altura atual = 800
valor final = 100.000 msat
min_final_cltv_expiry_delta = 18
Carol -> Dina:
fee = 1.000 + floor(100.000 * 100 / 1.000.000)
fee = 1.010 msat
Carol precisa receber 101.010 msat
CLTV de entrada de Carol = 818 + 40 = 858
Bob -> Carol:
fee = 500 + floor(101.010 * 200 / 1.000.000)
fee = 520 msat
Bob precisa receber 101.530 msat
CLTV de entrada de Bob = 858 + 80 = 938
Alice envia para Bob:
amount_msat = 101.530
cltv_expiry = 938
taxa total = 1.530 msat O valor enviado pelo primeiro hop inclui todas as taxas posteriores. No exemplo, Alice oferece 101.530 msat a Bob para que Dina receba 100.000 msat. A diferenca de 1.530 msat e a taxa total de roteamento.
CLTV acumulado
Cada HTLC tem um vencimento absoluto em altura de bloco. Esse prazo se conecta ao locktime do Bitcoin porque, se algo der errado e o canal fechar unilateralmente, as partes precisam de tempo para resolver HTLCs on-chain.
A invoice informa um delta final minimo, normalmente pelo campo c de BOLT 11 ou pelo valor padrao quando ele nao aparece. Cada hop intermediario acrescenta seu cltv_expiry_delta. Assim como as fees, o CLTV e calculado de tras para frente.
| Etapa | Delta aplicado | CLTV resultante |
|---|---|---|
| Dina recebe | min_final_cltv_expiry_delta = 18 | 800 + 18 = 818 |
| Carol exige folga | cltv_expiry_delta = 40 | 818 + 40 = 858 |
| Bob exige folga | cltv_expiry_delta = 80 | 858 + 80 = 938 |
Um CLTV maior aumenta a chance de a rota ser aceitavel para os hops, mas tambem prende liquidez por mais tempo quando o pagamento fica pendente ou falha tarde. Por isso, muitas carteiras colocam um custo de tempo na funcao de custo, alem da taxa em msat.
Liquidez local e remota
Capacidade do canal nao e liquidez disponivel naquela direcao. Se um canal tem capacidade de 1.000.000 sats, isso nao diz se ha 200.000 sats do lado certo para encaminhar agora.
Para um canal entre Alice e Bob:
- Liquidez local de Alice e o saldo que Alice consegue empurrar para Bob. Para Alice, isso e liquidez de saida.
- Liquidez remota de Alice e o saldo que esta do lado de Bob. Para Alice, isso e liquidez de entrada.
- Liquidez direcional muda a cada pagamento, rebalanceamento, fee, HTLC pendente e fechamento parcial do estado off-chain.
- Liquidez de canais de terceiros nao e conhecida pela origem. Ela so infere por sucessos, falhas, hints, probing e historico.
Essa e a razao de a busca ser probabilistica. O pagador conhece bem seus proprios canais, mas a parte remota do caminho e uma estimativa. O htlc_maximum_msat anunciado pode impedir um pagamento grande demais, mas nao garante que o canal tenha saldo suficiente.
Ferramenta: Comparador de Rotas
A ferramenta abaixo compara rotas candidatas pela taxa total e pelo CLTV total. Ela e didatica: calcula a parte deterministica da politica anunciada, mas nao simula liquidez oculta, falhas onion, concorrencia, privacidade ou penalidades de implementacao.
Comparador de Rotas
Falhas e retries
A entrega real costuma ser um ciclo de tentativa e aprendizado. A origem monta a cebola, envia o HTLC pelo primeiro canal e espera o resultado. Se o pagamento falha, uma falha onion volta pelo caminho reverso. A origem tenta interpretar o erro sem esquecer que a informacao e parcial, temporal e pode ser imprecisa.
Descricao longa do diagrama
O diagrama mostra uma origem tentando uma primeira rota. Um dos canais intermediarios esta marcado como sem liquidez suficiente. Uma seta de erro volta para a origem. Em seguida, a origem escolhe uma segunda rota diferente e tenta novamente.
| Falha | Como a origem pode interpretar |
|---|---|
| temporary_channel_failure | O canal ou direcao nao conseguiu encaminhar agora. Pode indicar falta de liquidez, canal indisponivel ou estado temporario. |
| amount_below_minimum | O valor ficou abaixo do htlc_minimum_msat anunciado ou esperado pelo hop. |
| fee_insufficient | O HTLC de entrada nao pagou a taxa exigida para aquela direcao. |
| incorrect_cltv_expiry | O CLTV oferecido nao bate com a politica do hop para o proximo salto. |
| expiry_too_soon | O HTLC chegaria perto demais do vencimento para ser seguro encaminhar. |
| channel_disabled | A direcao foi marcada como desabilitada em channel_update. |
| unknown_next_peer | O hop nao conhece ou nao consegue usar o proximo peer indicado. |
| incorrect_or_unknown_payment_details | O destino rejeitou o pagamento, por invoice desconhecida, valor incorreto, segredo incorreto ou expiracao. |
Uma carteira bem comportada nao tenta infinitamente. Ela limita tentativas, evita repetir a mesma falha, respeita expiracao da invoice, evita CLTV inseguro e nao assume que um erro antigo ainda vale depois de muitos blocos ou depois de politicas de canal mudarem.
Probing
Probing e usar tentativas de pagamento para aprender algo sobre liquidez ou topologia. Pode aparecer de forma defensiva, quando a carteira testa caminhos para melhorar entrega, ou como tecnica de vigilancia, quando alguem tenta mapear saldos de canais de terceiros.
A Lightning nao tem uma mensagem "me diga seu saldo". O probing explora efeitos colaterais: se um HTLC quase chega ao destino e falha de uma forma especifica, a origem aprende que os canais anteriores provavelmente tinham liquidez suficiente para aquele valor. Se falha antes, a origem aprende um limite aproximado sobre algum trecho.
Probing e uma faca de dois gumes. Ajuda pathfinding, mas prejudica privacidade, consome recursos de roteamento e pode revelar informacao de liquidez. O payment_secret em BOLT 11 ajuda o destino a rejeitar tentativas que conhecem apenas o payment_hash, mas nao elimina probing sobre hops intermediarios.
Pagamentos em partes (MPP)
Quando uma rota unica parece improvavel ou cara demais, a origem pode dividir o pagamento em partes. Em MPP (Multi-Part Payments), varios HTLCs carregam o mesmo payment_hash e chegam ao mesmo recebedor com o mesmo payment_secret. O payload final tambem informa o valor total esperado, permitindo que o recebedor aceite o conjunto apenas quando as partes somam o total.
Descricao longa do diagrama
O diagrama mostra uma origem dividindo um pagamento em tres partes. Cada parte segue uma rota diferente por canais distintos. Todas chegam ao mesmo destino e estao marcadas com o mesmo payment_hash. O destino so liquida quando a soma das partes atinge o valor total.
MPP nao e magia de liquidez. A origem ainda precisa escolher tamanho de partes, rotas candidatas, CLTVs compativeis e limite de tentativas. Partes pequenas demais podem bater em htlc_minimum_msat ou pagar muita taxa base. Partes grandes demais podem falhar por falta de saldo. E se uma parte falha, a carteira precisa decidir se tenta substituir aquela parte, reinicia tudo ou espera o timeout.
Modelos probabilisticos
Algumas explicacoes avancadas modelam roteamento como um processo probabilistico. Uma cadeia de Markov, por exemplo, pode representar nos como estados e canais como transicoes ponderadas por custo, sucesso esperado, capacidade anunciada, historico e aleatoriedade. Isso ajuda a raciocinar sobre distribuicao de caminhos, centralizacao e inferencia de privacidade.
Mas isso e modelo analitico ou heuristica, nao parte obrigatoria dos BOLTs. A rede nao exige que uma carteira use cadeia de Markov. O cuidado tecnico e nao confundir uma ferramenta matematica para estudar escolhas de rota com uma regra de consenso ou uma mensagem de protocolo.
| Sinal | Efeito comum no score |
|---|---|
| Falha recente | aumentar penalidade daquele canal, direcao, par de nos ou intervalo de valor por algum tempo. |
| Sucesso recente | aumentar a probabilidade de usar caminhos parecidos, sem assumir que a liquidez continua igual. |
| Canal proprio | usar saldo local real e limites do canal, porque essa parte e conhecida pelo pagador. |
| Gossip antigo | penalizar updates antigos ou politicas que mudam com frequencia. |
| Valor alto | preferir canais com maior capacidade, dividir em MPP ou aceitar mais tentativas. |
| Privacidade | evitar sempre o caminho mais barato, randomizar entre rotas razoaveis ou usar partes menores. |
Armadilhas comuns
- Assumir que o caminho mais barato vai funcionar. Fee baixa nao revela liquidez disponivel.
- Somar fees no sentido errado. Cada hop cobra sobre o valor que encaminha ao proximo hop; por isso o calculo e reverso.
- Ignorar CLTV. Uma rota barata pode ser ruim se prende liquidez por muito tempo ou viola deltas minimos.
- Tratar
htlc_maximum_msatcomo saldo. Ele e limite anunciado, nao prova de capacidade liquida. - Confundir canal privado com impossivel de rotear. Routing hints em BOLT 11 podem revelar uma parte final nao publicada no gossip.
- Repetir retries agressivamente. Isso piora privacidade, cria carga na rede e pode consumir janelas de CLTV.
- Apresentar probing como recurso neutro. Ele tambem e tecnica de inferencia contra a privacidade de liquidez.
Resumo
- A origem escolhe a rota inteira porque precisa montar o pacote onion antes de enviar o HTLC.
- Gossip fornece existencia, politicas e SCIDs; nao fornece saldos locais/remotos de canais de terceiros.
- Fees e CLTV sao calculados de tras para frente, a partir do valor e do vencimento final.
- Falhas onion alimentam retries e scoring, mas sao informacao local, temporal e incompleta.
- MPP pode dividir valor por rotas diferentes, mas adiciona novas decisoes de tamanho, custo, privacidade e retry.
- A parte normativa esta nos BOLTs; o algoritmo de selecao de caminho e heuristica de implementacao.
Mapa de dependências conceituais
Antes de ler esta página
- Gossip e o Grafo de Canais
- Roteamento Onion
- Pedidos de Pagamento BOLT 11
- Operacao de Canais e Encaminhamento
- Locktime
- Taxa de Transacao
Depois desta página
- Pedidos de Pagamento BOLT 11
- Segurança e Privacidade a fundo
- Comparador de Rotas
- Construtor de Rota Onion
Referências técnicas usadas
- BOLT 7 — P2P Node and Channel Discovery
- BOLT 4 — Onion Routing Protocol
- BOLT 2 — Peer Protocol for Channel Management
- BOLT 11 — Invoice Protocol for Lightning Payments
- Gossip e o Grafo de Canais
- Roteamento Onion
- Operacao de Canais e Encaminhamento
- Locktime
- Taxa de Transacao
A seguir, voltamos ao ponto de partida do pagamento: a invoice BOLT 11, que informa destino, valor, payment_hash, payment_secret, CLTV final e dicas de rota.