Canales de Pago (en profundidad)

Financiación, transacción de compromiso, revocación y cierre

⚡ Lightning · Técnico

En la versión para principiantes hablamos del canal como una "cuenta". Aquí vamos a ver qué pasa al nivel de las transacciones Bitcoin: cómo el canal se ancla on-chain, cómo el saldo se representa y actualiza, y por qué hacer trampa no compensa.

La transacción de financiación (funding)

Abrir un canal es crear una salida multisig 2-de-2 en la blockchain — normalmente una P2WSH cuyo script es:

OP_2 <pubkey_alice> <pubkey_bob> OP_2 OP_CHECKMULTISIG

Esa salida es la transacción de financiación. El valor depositado en ella es la capacidad del canal, y nadie puede mover ese dinero sin la firma de los dos. El par txid:índice_de_salida de esa salida identifica el canal para siempre — es el channel point.

Transacción de financiación: entradas on-chain de Alice (y/o Bob) creando una salida multisig 2-de-2 que es el canal, identificado por el channel point (txid:índice).

Tradicionalmente solo un lado financia el canal (single-funded), pero también existe la financiación por ambos (dual funding). De cualquier forma, es una única transacción on-chain la que da origen al canal.

La transacción de compromiso (commitment)

El saldo actual del canal se representa mediante una transacción de compromiso: una transacción que gasta la salida de financiación y divide el dinero entre los dos. No se publica mientras el canal está abierto — es la carta bajo la manga de cada lado para cerrar el canal en cualquier momento en el estado actual.

El detalle crucial: cada lado guarda su propia versión, y son asimétricas. La versión de Alice tiene estas salidas:

En la versión de Bob es el espejo: su to_local es el que queda retrasado y revocable. En otras palabras: quien publica la transacción de compromiso es quien espera — su propio dinero queda bloqueado por el to_self_delay, mientras el del otro lado sale al instante.

Transacción de compromiso (versión de Alice): gasta la salida de financiación y crea to_local (Alice, retrasado y revocable), to_remote (Bob, inmediato) y una salida por HTLC.

Prueba un estado de canal y ve las salidas que cada lado ve:

Transacción de Compromiso

Transacción de Compromiso

Arma un estado del canal y mira las salidas de la transacción de compromiso (commitment) de cada lado. Usa valores ficticios.

Separe varios HTLCs con comas. Valores por debajo del dust_limit aparecen como trimmed.

Ver la versión de:

Resultado de la transacción de compromiso

Revocación y penalidad

Cada vez que el saldo cambia, ambos crean una nueva transacción de compromiso y invalidan la anterior. Pero, ¿cómo se invalida una transacción que ya está firmada y sería válida en la blockchain?

La respuesta es la revocación. La salida to_local no puede gastarse solo por el dueño — tiene dos caminos:

En cada actualización, cada lado entrega al otro el secreto de revocación del estado anterior. Con ese secreto, la clave de revocación del estado antiguo pasa a ser derivable por la contraparte. Resultado: si Alice intenta publicar un estado antiguo (revocado) — por ejemplo, uno en el que tenía más saldo — Bob tiene la ventana del to_self_delay para usar la clave de revocación y barrer todo el to_local de ella. Sumando el to_remote que ya es suyo, Bob se queda con todo el canal.

Penalidad: Alice publica una transacción de compromiso antigua (revocada); Bob usa la clave de revocación para barrer su to_local dentro del to_self_delay y se queda con todo el saldo del canal.

Por eso hacer trampa es irracional: la penalización es perder todo. Ese mecanismo es lo que permite que dos desconocidos mantengan un canal sin confiar el uno en el otro.

Cierre del canal

Hay tres formas de que un canal termine:

Detalles que han evolucionado

El diseño de arriba es el "clásico". Vale la pena saber que el protocolo avanzó:

A continuación: cómo el dinero realmente se mueve por un canal y a través de varios — los HTLCs y el encaminamiento de pagos.