Glossaire / Lightning et couche 2
Script d'arrêt
- Qu'est-ce qu'un script d'arrêt ?
- Un script d'arrêt est l'adresse on-chain vers laquelle votre solde Lightning est versé lorsqu'un canal se ferme de façon coopérative, nommée dans le message d'arrêt du BOLT 2 sous forme de scriptpubkey brut.
Chaque partie d'un canal en cours de fermeture nomme sa propre destination, et la transaction de fermeture paie les deux à leurs destinations respectives. Le BOLT 2 donne à ce type de message le numéro 38 et n'accepte que les scripts de version témoin 0, sauf si les pairs ont négocié les bits de fonctionnalité 26 et 27. Quiconque ramène des fonds Lightning vers un stockage à froid devrait vérifier cette destination avant la fermeture, pas après.
Comment cela fonctionne
Un script d'arrêt circule dans un message BOLT 2 de type 38, qui porte l'identifiant du canal, une longueur de deux octets, puis les octets du script eux-mêmes.
L'un ou l'autre des pairs peut envoyer ce message, et dès qu'aucune mise à jour n'est en attente, l'autre doit répondre par un arrêt de son côté. À partir de là, le canal se dénoue : aucun update_add_htlc ne peut suivre un arrêt, et un nœud devrait refuser d'acheminer tout HTLC qui arrive ensuite. Il peut être envoyé avant channel_ready, de sorte qu'un canal dont la transaction de financement est encore en cours de confirmation peut être abandonné tôt.
La spécification est restrictive sur ce que le script peut être. Deux formes sont toujours légales : OP_0 et un push de 20 octets, une sortie pay to witness public key hash, ou OP_0 et un push de 32 octets, pay to witness script hash. Les versions témoin 1 à 16, suivies d'un push de 2 à 40 octets, ne sont légales que là où l'option option_shutdown_anysegwit a été négociée, les bits de fonctionnalité 26 et 27, de sorte qu'un paiement Taproot dépend du fait que votre pair le prend en charge. Une troisième forme est venue avec option_simple_close, les bits 60 et 61 : OP_RETURN plus un push de 6 à 75 octets, ou la variante OP_PUSHDATA1 pour 76 à 80 octets, le plafond étant qu'un script OP_RETURN n'est standard sur Bitcoin que jusqu'à 83 octets. Elle existe lorsque votre part est trop petite pour valoir une sortie, et le montant doit alors être nul, de sorte qu'il va aux mineurs sous forme de frais.
Un nœud peut aussi fixer sa destination à l'ouverture du canal, dans l'enregistrement TLV upfront_shutdown_script, de type 0, de open_channel et accept_channel, les bits de fonctionnalité 4 et 5. Si les deux pairs l'ont annoncé et qu'un script de longueur non nulle a été fourni, un arrêt ultérieur nommant autre chose doit faire échouer la connexion. Le BOLT 2 est franc sur ce que cela apporte : il qualifie cet engagement préalable de "a weak commitment (a malevolent implementation tends to ignore specifications like this one !)", ce qui représente une amélioration incrémentale, car changer la destination par la suite exige la coopération de votre pair.
Où vous le voyez
Les scripts d'arrêt appartiennent à qui possède le canal, ce qui n'est pas toujours vous.
Parmi les 41 portefeuilles passés en revue ici, comparez Phoenix, noté 4,0, qui exécute un véritable nœud Lightning autonome sur le téléphone, avec Wallet of Satoshi, noté 2,7 et signalé comme appelant à la prudence pour son mode de conservation. Les canaux de Phoenix sont les vôtres, de sorte qu'une fermeture coopérative inscrit une adresse que vous contrôlez dans le message d'arrêt. Dans le mode de conservation de Wallet of Satoshi, qui s'est retiré des États-Unis et de l'Union européenne, les canaux sont ceux de l'entreprise, les scripts nomment ses adresses, et ce que vous détenez est une créance plutôt qu'une clé.
Le second endroit où il apparaît est une fermeture qui échoue en silence. Les anciens nœuds peuvent encore envoyer des scripts d'arrêt non segwit, et le BOLT 2 note qu'une transaction de fermeture dont la sortie non segwit est inférieure à 546 satoshis, ce qui est possible lorsque dust_limit_satoshis a été fixé plus bas, n'atteindra probablement jamais les mineurs. Aucun fonds n'est menacé, mais le canal doit être fermé de force au lieu d'être réglé. Avec option_simple_close, un nouveau closing_complete remplace le précédent, de sorte que les frais et le script de sortie peuvent tous deux être révisés, sauf si la variante upfront a figé la destination à l'ouverture du canal.
Script d'arrêt vs fermeture forcée
Un script d'arrêt ne décide où va l'argent que lors d'une fermeture coopérative.
Une fermeture forcée saute la négociation : vous publiez la dernière transaction d'engagement, et ses sorties paient des clés dérivées des points de base échangés à l'ouverture du canal, et non une adresse que vous avez désignée. Le script que vous avez défini avec soin n'a aucun effet sur la seule sortie qui ne nécessite aucune permission de votre pair. Fixez-le pour la fermeture que vous prévoyez, et conservez une sauvegarde de canal pour celle que vous ne prévoyez pas.