Busca de Caminho

Escolher uma rota — e entregar o pagamento

⚡ Lightning · Técnico

Com o grafo de canais em mãos, falta o último passo: escolher uma rota da origem até o destino e entregar o pagamento. Diferente da internet (onde cada roteador decide o próximo salto), na Lightning é a origem que calcula a rota inteira — é o source-based routing, e é o que permite o roteamento onion.

O ponto cego: você não conhece os saldos

Aqui está o que torna a busca de caminho difícil. Pelo gossip, você sabe que um canal existe, sua capacidade e a política (taxa, cltv). Mas você não sabe como o saldo está dividido entre os dois lados — e é justamente isso que determina se o canal consegue encaminhar o seu valor naquela direção.

Resultado: a busca de caminho é probabilística. Você escolhe um caminho promissor, tenta, e se falhar (por exemplo, saldo insuficiente em algum salto), o erro onion te diz onde falhou — e você tenta outra rota.

A origem calcula a rota inteira sobre o grafo (source-based routing), escolhendo um caminho entre várias alternativas até o destino.

A função de custo

Entre os caminhos possíveis, qual é o "melhor"? A carteira atribui um custo a cada aresta e procura o de menor custo (tipicamente com um algoritmo tipo Dijkstra, rodado de trás para frente, do destino para a origem — porque taxas e cltv se acumulam nesse sentido). O custo combina:

Compare rotas candidatas pela taxa total e pelo CLTV total:

Ícone Ferramenta Comparador de Rotas
Ícone Ferramenta

Comparador de Rotas

A carteira acha vários caminhos possíveis e escolhe o melhor. Informe as rotas candidatas e veja a taxa total e o CLTV total de cada uma.

Entrega: tentar, errar, tentar de novo

Entregar um pagamento costuma ser um ciclo:

  1. escolhe a rota de menor custo ainda não descartada;
  2. monta a cebola e envia o HTLC;
  3. se chegou, ótimo — o segredo volta e liquida tudo;
  4. se falhou, lê o erro onion, aprende com ele (qual canal estava sem saldo) e tenta a próxima rota.

As implementações guardam o que aprenderam sobre a rede nessas tentativas (no LND isso se chama mission control) para que as próximas escolhas sejam mais certeiras.

Ciclo de tentativa: a primeira rota falha por falta de saldo, o erro onion volta, e a carteira tenta outra rota, aprendendo com a falha.

Pagamentos em partes (MPP)

E se nenhum caminho único tiver saldo suficiente para o valor todo? Aí entram os pagamentos multipartes (MPP, Multi-Part Payments): a origem divide o valor em pedaços e envia cada um por uma rota diferente. Todos os pedaços carregam o mesmo payment_hash, e um payment_secret os amarra. O destinatário só resgata quando a soma dos pedaços recebidos bate com o valor total — então continua sendo tudo ou nada.

Pagamento multipartes: a origem divide o valor em pedaços enviados por rotas diferentes, todos com o mesmo payment_hash, e o destino só resgata quando o total chega.

E os clientes leves?

Manter o grafo inteiro e calcular rotas dá trabalho — pesado demais para uma carteira de celular. O trampoline routing resolve isso deixando o cliente leve escolher só alguns nós "trampolim" e delegar a eles o cálculo do caminho detalhado, sem abrir mão do roteamento onion.

Já entendemos como o pagamento acha o caminho. A seguir, voltamos ao ponto de partida de tudo: a invoice (BOLT 11) — o pedido de pagamento que a origem lê para saber quanto, para quem e com qual payment_hash.