Glossário / Lightning e camada 2
Script de encerramento
- O que é um script de encerramento?
- Um script de encerramento é o endereço on-chain para o qual seu saldo Lightning é pago quando um canal fecha de forma cooperativa, indicado na mensagem shutdown do BOLT 2 como um scriptpubkey bruto.
Cada lado de um canal que está fechando indica seu próprio destino, e a transação de encerramento paga os dois lá. O BOLT 2 dá a essa mensagem o tipo 38 e aceita apenas scripts de versão de testemunha 0, a menos que os pares tenham negociado os bits de recurso 26 e 27. Quem mover fundos Lightning de volta para o armazenamento a frio deve verificar esse destino antes de fechar, não depois.
Como funciona
Um script de encerramento viaja dentro de uma mensagem do BOLT 2 de tipo 38, que carrega o id do canal, um comprimento de dois bytes e, em seguida, os próprios bytes do script.
Qualquer um dos pares pode enviar essa mensagem, e quando não há mais atualizações pendentes o outro deve responder com um shutdown próprio. A partir daí o canal está em fase de encerramento: nenhum update_add_htlc pode seguir um shutdown, e um nó deve se recusar a rotear qualquer HTLC que chegue depois. Ela pode ser enviada antes de channel_ready, então um canal cuja transação de financiamento ainda está sendo confirmada pode ser abandonado cedo.
A especificação é restrita quanto ao que o script pode ser. Duas formas são sempre legais: OP_0 e uma inserção de 20 bytes, uma saída pay to witness public key hash, ou OP_0 e uma inserção de 32 bytes, pay to witness script hash. As versões de testemunha 1 a 16, seguidas de uma inserção de 2 a 40 bytes, são legais apenas onde option_shutdown_anysegwit foi negociada, os bits de recurso 26 e 27, então um pagamento Taproot depende de seu par oferecer suporte a isso. Uma terceira forma veio com option_simple_close, os bits 60 e 61: OP_RETURN mais uma inserção de 6 a 75 bytes, ou a variante OP_PUSHDATA1 para 76 a 80 bytes, sendo o teto o fato de que um script OP_RETURN é padrão no Bitcoin apenas até 83 bytes. Ele existe onde sua parte é pequena demais para valer uma saída, e o valor deve então ser zero, de modo que vai para os mineradores como taxa.
Um nó também pode fixar seu destino quando o canal é aberto, no registro TLV upfront_shutdown_script, tipo 0, de open_channel e accept_channel, os bits de recurso 4 e 5. Se ambos os pares anunciaram isso e um script de comprimento diferente de zero foi fornecido, um shutdown posterior que indique qualquer outra coisa deve fazer a conexão falhar. O BOLT 2 é franco sobre o que isso garante: chama o pré-compromisso de "a weak commitment (a malevolent implementation tends to ignore specifications like this one!)" (um compromisso fraco: uma implementação mal-intencionada tende a ignorar especificações como esta), que vale uma melhoria incremental, porque mudar o destino depois exige a cooperação de seu par.
Onde você o vê
Os scripts de encerramento pertencem a quem é dono do canal, o que nem sempre é você.
Entre as 41 carteiras analisadas neste site, compare a Phoenix, com nota 4,0, que roda um nó Lightning real e autônomo no celular, com a Wallet of Satoshi, com nota 2,7 e marcada com cautela por seu modo custodial. Os canais da Phoenix são seus, então um fechamento cooperativo coloca na mensagem shutdown um endereço que você controla. No modo custodial da Wallet of Satoshi, retirada dos Estados Unidos e da União Europeia, os canais são da empresa, os scripts indicam os endereços dela, e o que você tem é um crédito contra a empresa, não uma chave.
O segundo lugar onde ele aparece é um fechamento que falha silenciosamente. Os nós antigos ainda podem enviar scripts de encerramento não segwit, e o BOLT 2 observa que uma transação de encerramento cuja saída não segwit esteja abaixo de 546 satoshis, possível quando dust_limit_satoshis foi definido mais baixo, provavelmente nunca chegará aos mineradores. Nenhum fundo está em risco, mas o canal precisa ser fechado à força em vez de liquidado. Sob option_simple_close, um novo closing_complete substitui o anterior, então tanto a taxa quanto o script de saída podem ser revisados, a menos que a variante antecipada tenha congelado o destino na abertura do canal.
Script de encerramento vs fechamento forçado
Um script de encerramento decide onde o dinheiro cai apenas em um fechamento cooperativo.
Um fechamento forçado pula a negociação: você publica a transação de compromisso mais recente, e suas saídas pagam chaves derivadas dos pontos base (basepoints) trocados quando o canal foi aberto, não um endereço que você indicou. O script que você definiu com cuidado não tem efeito sobre a única saída que não precisa da permissão de seu par. Defina-o para o fechamento que você pretende e guarde um backup de canais para o que você não pretende.