Pular para o conteúdo
buybitcoinsmart

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.

Não confundir com

Perguntas frequentes

Posso definir um endereço Taproot como meu script de encerramento?

Somente se você e seu par negociaram option_shutdown_anysegwit, os bits de recurso 26 e 27. Sem isso, o BOLT 2 permite apenas duas formas, uma inserção de 20 bytes ou uma de 32 bytes após OP_0, que são os dois tipos de script de versão de testemunha 0.

O script de encerramento se aplica a um fechamento forçado?

Não. Um fechamento forçado transmite a transação de compromisso mais recente, cujas saídas pagam chaves derivadas dos pontos base que ambos os lados trocaram quando o canal foi aberto, então o endereço que você indicou em uma mensagem shutdown não desempenha nenhum papel nele.

Por que uma transação de encerramento não pagaria nada ao meu lado?

Porque option_simple_close permite que quem fecha com um saldo pequeno demais para valer uma saída indique um script OP_RETURN em vez disso, e a especificação exige que o valor dessa saída seja zero, então o saldo vai para os mineradores como taxa.

Leia a seguir

Termos relacionados

Mais em Lightning e camada 2

Ler esta página em inglês