Glossario / Lightning e layer 2
Script di chiusura
- Che cos'è uno script di chiusura?
- Uno script di chiusura è l'indirizzo on-chain su cui viene pagato il tuo saldo Lightning quando un canale si chiude in modo cooperativo, indicato nel messaggio shutdown di BOLT 2 come scriptpubkey grezzo.
Ogni lato di un canale in chiusura indica la propria destinazione, e la transazione di chiusura paga entrambi lì. BOLT 2 assegna a quel messaggio il tipo 38 e accetta solo script con versione witness 0, a meno che i peer abbiano negoziato i feature bit 26 e 27. Chi riporta fondi Lightning nel cold storage dovrebbe controllare quella destinazione prima di chiudere, non dopo.
Come funziona
Uno script di chiusura viaggia dentro un messaggio BOLT 2 di tipo 38, che porta l'id del canale, una lunghezza di due byte e poi i byte dello script stessi.
Può inviare quel messaggio l'uno o l'altro peer, e una volta che non ci sono aggiornamenti in sospeso l'altro deve rispondere con un proprio shutdown. Da quel momento il canale è in chiusura: nessun update_add_htlc può seguire uno shutdown, e un nodo dovrebbe rifiutarsi di inoltrare qualsiasi HTLC che arrivi dopo. Può essere inviato prima di channel_ready, quindi un canale la cui transazione di finanziamento è ancora in conferma può essere abbandonato presto.
La specifica è stretta su cosa può essere lo script. Due forme sono sempre legali: OP_0 più un push di 20 byte, un output pay to witness public key hash, oppure OP_0 più un push di 32 byte, pay to witness script hash. Le versioni witness dalla 1 alla 16, seguite da un push da 2 a 40 byte, sono legali solo dove è stata negoziata option_shutdown_anysegwit, i feature bit 26 e 27, quindi un pagamento Taproot dipende dal fatto che il tuo peer lo gestisca. Una terza forma è arrivata con option_simple_close, bit 60 e 61: OP_RETURN più un push da 6 a 75 byte, oppure la variante OP_PUSHDATA1 per 76-80 byte, con il limite dato dal fatto che uno script OP_RETURN è standard su Bitcoin solo fino a 83 byte. Esiste dove la tua quota è troppo piccola per valere un output, e in quel caso l'importo deve essere zero, così va ai miner come commissione.
Un nodo può anche fissare la propria destinazione all'apertura del canale, nel record TLV upfront_shutdown_script, tipo 0, di open_channel e accept_channel, feature bit 4 e 5. Se entrambi i peer l'hanno annunciato ed è stato indicato uno script di lunghezza diversa da zero, un successivo shutdown che indichi qualcos'altro deve far fallire la connessione. BOLT 2 è franco su ciò che questo garantisce: definisce quel preimpegno "a weak commitment (a malevolent implementation tends to ignore specifications like this one!)" (un impegno debole: un'implementazione malevola tende a ignorare specifiche come questa), che vale come miglioramento incrementale, perché cambiare la destinazione dopo richiede la collaborazione del tuo peer.
Dove lo vedi
Gli script di chiusura appartengono a chi possiede il canale, che non sempre sei tu.
Tra i 41 wallet recensiti qui, confronta Phoenix, valutato 4,0, che esegue sullo smartphone un vero nodo Lightning autonomo, con Wallet of Satoshi, valutato 2,7 e segnalato con cautela per la sua modalità custodiale. I canali di Phoenix sono tuoi, quindi una chiusura cooperativa mette nel messaggio shutdown un indirizzo di cui disponi tu. Nella modalità custodiale di Wallet of Satoshi, ritirato dagli Stati Uniti e dall'Unione europea, i canali sono dell'azienda, gli script indicano i suoi indirizzi, e ciò che detieni è un credito, non una chiave.
Il secondo posto in cui emerge è una chiusura che fallisce in silenzio. I nodi vecchi possono ancora inviare script di chiusura non segwit, e BOLT 2 osserva che una transazione di chiusura il cui output non segwit sia sotto i 546 satoshi, possibile quando dust_limit_satoshis è stato impostato più basso, probabilmente non arriverà mai ai miner. Nessun fondo è a rischio, ma il canale va chiuso forzatamente invece che regolato. Con option_simple_close un nuovo closing_complete prevale sul precedente, quindi sia la commissione sia lo script di output possono essere rivisti, a meno che la variante anticipata abbia congelato la destinazione all'apertura del canale.
Script di chiusura vs chiusura forzata
Uno script di chiusura decide dove arrivano i soldi solo in una chiusura cooperativa.
Una chiusura forzata salta la negoziazione: pubblichi la transazione di impegno più recente, e i suoi output pagano chiavi derivate dai basepoint scambiati all'apertura del canale, non un indirizzo che hai indicato tu. Lo script che hai impostato con cura non ha alcun effetto sull'unica via d'uscita che non richiede il permesso del tuo peer. Impostalo per la chiusura che intendi fare, e conserva un backup dei canali per quella che non intendi fare.