Glosario / Lightning y capa 2
Script de cierre
- ¿Qué es un script de cierre?
- Un script de cierre es la dirección on-chain a la que se paga su saldo Lightning cuando un canal se cierra de forma cooperativa, indicada en el mensaje shutdown de BOLT 2 como un scriptpubkey en bruto.
Cada lado de un canal que se cierra indica su propio destino, y la transacción de cierre paga allí a los dos. BOLT 2 asigna a ese mensaje el tipo 38 y solo acepta scripts de versión de testigo 0, salvo que los pares hayan negociado los bits de funcionalidad 26 y 27. Quien mueva fondos Lightning de vuelta al almacenamiento en frío debería comprobar ese destino antes de cerrar, no después.
Cómo funciona
Un script de cierre viaja dentro de un mensaje de BOLT 2 de tipo 38, que lleva el ID del canal, una longitud de dos bytes y, a continuación, los propios bytes del script.
Cualquiera de los dos pares puede enviar ese mensaje, y en cuanto no quedan actualizaciones pendientes el otro debe responder con su propio shutdown. A partir de ese momento el canal está en fase de cierre: ningún mensaje update_add_htlc puede seguir a un shutdown, y un nodo debería negarse a enrutar cualquier HTLC que llegue después. El mensaje puede enviarse antes de channel_ready, de modo que un canal cuya transacción de financiación todavía se está confirmando puede abandonarse pronto.
La especificación es estricta en cuanto a lo que puede ser el script. Hay dos formas siempre válidas: OP_0 y una inserción de datos de 20 bytes, una salida pay to witness public key hash, o OP_0 y una inserción de datos de 32 bytes, pay to witness script hash. Las versiones de testigo 1 a 16, seguidas de una inserción de datos de 2 a 40 bytes, solo son válidas cuando se negoció la opción option_shutdown_anysegwit, los bits de funcionalidad 26 y 27, así que un pago a Taproot depende de que su par lo admita. Una tercera forma llegó con la opción option_simple_close, los bits 60 y 61: OP_RETURN más una inserción de datos de 6 a 75 bytes, o la variante OP_PUSHDATA1 para 76 a 80 bytes, un techo que se debe a que un script OP_RETURN solo es estándar en Bitcoin hasta 83 bytes. Existe para cuando su parte es demasiado pequeña para merecer una salida, y entonces el monto debe ser cero, de modo que su parte se va a los mineros como comisión.
Un nodo también puede fijar de antemano su destino cuando se abre el canal, en el registro TLV upfront_shutdown_script, de tipo 0, de los mensajes open_channel y accept_channel, los bits de funcionalidad 4 y 5. Si ambos pares lo anunciaron y se indicó un script de longitud distinta de cero, un shutdown posterior que indique cualquier otra cosa debe hacer fallar la conexión. BOLT 2 es franco sobre lo que eso aporta: llama a ese compromiso previo "a weak commitment (a malevolent implementation tends to ignore specifications like this one!)" (un compromiso débil: una implementación malintencionada tiende a ignorar especificaciones como esta), que merece la pena como mejora incremental, porque cambiar el destino después requiere la cooperación de su par.
Dónde aparece
Los scripts de cierre pertenecen a quien sea dueño del canal, que no siempre es usted.
Entre las 41 billeteras reseñadas en este sitio, compare Phoenix, calificada con 4,0, que ejecuta en el teléfono un nodo Lightning real y autónomo, con Wallet of Satoshi, calificada con 2,7 y con la etiqueta de precaución por su modo con custodia. En Phoenix, los canales son de usted, así que un cierre cooperativo pone en el mensaje shutdown una dirección que usted controla. En el modo con custodia de Wallet of Satoshi, retirado de Estados Unidos y de la Unión Europea, los canales son de la empresa, los scripts indican las direcciones de esta y lo que usted tiene es un derecho y no una clave.
El segundo lugar donde aparece es un cierre que falla sin hacer ruido. Los nodos antiguos todavía pueden enviar scripts de cierre que no son SegWit, y BOLT 2 señala que una transacción de cierre cuya salida no SegWit esté por debajo de 546 satoshis, algo posible cuando el campo dust_limit_satoshis se estableció más bajo, probablemente nunca llegará a los mineros. No hay fondos en riesgo, pero hay que forzar el cierre del canal en lugar de liquidarlo. Con la opción option_simple_close, un nuevo mensaje closing_complete anula el anterior, así que pueden revisarse tanto la comisión como el script de bloqueo, salvo que la variante anticipada haya congelado el destino al abrir el canal.
Script de cierre frente a cierre forzado
Un script de cierre decide adónde llega el dinero solo en un cierre cooperativo.
Un cierre forzado se salta la negociación: usted publica la transacción de compromiso más reciente, y sus salidas pagan a claves derivadas de los puntos base (basepoints) intercambiados al abrir el canal, no a una dirección que usted haya designado. El script que configuró con cuidado no tiene ningún efecto en la única vía de salida que no necesita el permiso de su par. Configúrelo para el cierre que tiene previsto y conserve un respaldo de canales para el que no.