Canais de Pagamento (a fundo)

Financiamento, transação de compromisso, revogação e fechamento

⚡ Lightning · Técnico

Na versão para iniciantes falamos do canal como uma "comanda". Aqui vamos ver o que acontece no nível das transações Bitcoin: como o canal é ancorado on-chain, como o saldo é representado e atualizado, e por que a trapaça não compensa.

A transação de financiamento (funding)

Abrir um canal é criar uma saída multisig 2-de-2 na blockchain — normalmente uma P2WSH cujo script é:

OP_2 <pubkey_alice> <pubkey_bob> OP_2 OP_CHECKMULTISIG

Essa saída é a transação de financiamento. O valor depositado nela é a capacidade do canal, e ninguém consegue mexer nesse dinheiro sem a assinatura dos dois. O par txid:índice_da_saída dessa saída identifica o canal para sempre — é o channel point.

Transação de financiamento: entradas on-chain da Alice (e/ou do Bob) criando uma saída multisig 2-de-2 que é o canal, identificado pelo channel point (txid:índice).

Tradicionalmente só um lado financia o canal (single-funded), mas há também o financiamento por ambos (dual funding). De qualquer forma, é uma única transação on-chain que dá origem ao canal.

A transação de compromisso (commitment)

O saldo atual do canal é representado por uma transação de compromisso: uma transação que gasta a saída de financiamento e divide o dinheiro entre os dois. Ela não é publicada enquanto o canal está aberto — é a carta na manga de cada lado para fechar o canal a qualquer momento no estado atual.

O detalhe crucial: cada lado guarda a sua própria versão, e elas são assimétricas. A versão da Alice tem estas saídas:

Na versão do Bob é o espelho: o to_local dele é que fica atrasado e revogável. Em outras palavras: quem publica a transação de compromisso é quem espera — o seu próprio dinheiro fica preso pelo to_self_delay, enquanto o do outro lado sai na hora.

Transação de compromisso (versão da Alice): gasta a saída de financiamento e cria to_local (Alice, atrasado e revogável), to_remote (Bob, imediato) e uma saída por HTLC.

Brinque com um estado de canal e veja as saídas que cada lado enxerga:

Ícone Ferramenta Transação de Compromisso
Ícone Ferramenta

Transação de Compromisso

Monte um estado do canal e veja as saídas da transação de compromisso (commitment) de cada lado.

Ver a versão de:

Revogação e penalidade

Toda vez que o saldo muda, os dois criam uma nova transação de compromisso e invalidam a antiga. Mas como "invalidar" uma transação que já está assinada e seria válida na blockchain?

A resposta é a revogação. A saída to_local não pode ser gasta só pelo dono — ela tem dois caminhos:

A cada atualização, cada lado entrega ao outro o segredo de revogação do estado anterior. Com esse segredo, a chave de revogação do estado antigo passa a ser derivável pela contraparte. Resultado: se a Alice tentar publicar um estado antigo (revogado) — por exemplo, um em que ela tinha mais saldo — o Bob tem a janela do to_self_delay para usar a chave de revogação e varrer todo o to_local dela. Somando ao to_remote que já é dele, o Bob fica com o canal inteiro.

Penalidade: a Alice publica uma transação de compromisso antiga (revogada); o Bob usa a chave de revogação para varrer o to_local dela dentro do to_self_delay e fica com todo o saldo do canal.

Por isso trapacear é irracional: a punição é perder tudo. Esse mecanismo é o que permite que dois desconhecidos mantenham um canal sem confiar um no outro.

Fechando o canal

Há três jeitos de um canal terminar:

Detalhes que evoluíram

O desenho acima é o "clássico". Vale saber que o protocolo avançou:

A seguir: como o dinheiro realmente se move por um canal e através de vários — os HTLCs e o encaminhamento de pagamentos.