Glossário / Lightning e camada 2
LNURL
- O que é LNURL?
- LNURL é uma família de pequenos protocolos web que permitem a uma carteira Lightning obter de um servidor uma fatura nova, um saque ou um desafio de login seguindo um único link codificado.
As faturas Lightning expiram e só podem ser pagas uma vez, o que as torna incômodas de imprimir ou publicar. O LNURL resolve isso colocando uma solicitação HTTPS na frente da fatura: sua carteira pede a um servidor a solicitação de pagamento no momento em que você quer pagar. As especificações ficam fora dos BOLTs e são numeradas a partir de LUD-01.
Como funciona
O LNURL transforma um link estático em uma conversa ao vivo entre uma carteira e um servidor.
O próprio link é todo o truque. Em sua forma original, LUD-01, uma URL HTTPS é codificada em bech32 com o prefixo lnurl, o que produz um bloco que sobrevive a ser impresso como código QR ou digitado em uma janela de chat. A forma mais recente, LUD-17, dispensa a codificação e usa prefixos de esquema simples, como lnurlp:, na frente de uma URL comum, o que é mais curto e mais fácil de depurar. De qualquer forma, a carteira decodifica o link, faz uma solicitação GET e recebe um JSON que informa que tipo de interação é essa.
O campo tag desse JSON decide tudo o que vem depois. LUD-06 define payRequest, o fluxo de pagamento: o servidor devolve uma URL de callback mais minSendable e maxSendable, ambos em milisatoshis, e uma string de metadados que a carteira exibe. Você escolhe um valor, a carteira chama de volta com ele e o servidor devolve uma fatura BOLT11 recém-gerada exatamente por esse valor. LUD-03 define withdrawRequest, que funciona no sentido oposto: o servidor oferece dinheiro e a carteira fornece uma fatura para recebê-lo. LUD-02 solicita um canal a um par. LUD-04 define auth, em que a carteira assina um desafio com uma chave derivada por domínio, que é como alguns sites Lightning fazem seu login sem senha.
A propriedade de segurança que vale a pena entender é limitada. O LNURL garante que a fatura veio do domínio do link e que o valor dela corresponde ao que você aprovou, porque a carteira confere a fatura recebida antes de pagar. Ele não garante nada sobre quem controla esse domínio. Escanear um código LNURL colado sobre um código autêntico em uma barraca de mercado paga o servidor do atacante, e o pagamento é concluído exatamente como foi projetado.
Onde você o encontra
A maioria das pessoas encontra o LNURL sem nunca ver a palavra.
Páginas de gorjeta e doação usam LNURL-pay atrás de um código QR, e é por isso que o mesmo código impresso funciona para cem clientes diferentes com cem valores diferentes. Brindes em conferências de Bitcoin e cartões de faucet usam LNURL-withdraw: você escaneia, sua carteira gera discretamente uma fatura e os sats chegam sem nenhuma fatura visível. Algumas carteiras Lightning e serviços web usam o LNURL-auth como todo o seu sistema de login.
A maior implantação é indireta. Um endereço Lightning, a forma user@domain, é definido na LUD-16 e é construído diretamente sobre o LNURL-pay: o endereço é traduzido em um caminho HTTPS well-known e, a partir daí, o fluxo é um LUD-06 comum. Se sua carteira aceita endereços Lightning, ela já fala LNURL.
A principal ressalva é a disponibilidade. Como há um servidor web no meio, um código LNURL é tão confiável quanto esse servidor e seu certificado TLS. Uma fatura BOLT11, depois de gerada, pode ser paga com o servidor offline; um link LNURL, não.
LNURL vs fatura BOLT11
O LNURL é uma forma de obter uma solicitação de pagamento; uma fatura BOLT11 é a solicitação de pagamento. Essa única diferença explica suas propriedades. Uma fatura é autossuficiente, assinada pelo nó destinatário, válida por um tempo determinado e pagável uma única vez. Um link LNURL não contém valor, nem hash de pagamento, nem assinatura, permanece válido indefinidamente e funciona para qualquer número de pagadores, porque cada um deles gera uma nova fatura. Imprima uma fatura e ela morre dentro de uma hora. Imprima um código LNURL e ele continua funcionando até o domínio deixar de funcionar.