Glossaire / Lightning et couche 2
HTLC poussière
- Qu'est-ce qu'un HTLC poussière ?
- Un HTLC poussière est un paiement Lightning trop petit pour obtenir sa propre sortie dans la transaction d'engagement, si bien qu'une fermeture forcée le remet aux mineurs plutôt qu'à l'un ou l'autre des partenaires du canal.
Les canaux Lightning refusent de créer une sortie pour tout paiement en cours valant moins que la limite de poussière plus ses frais de sauvetage, et ce montant devient des frais de minage. Avec une limite de poussière de 546 satoshis et un taux de frais de 5 000 par kilo-unité de poids, tout ce qui est sous 3 861 satoshis est écarté. L'argent n'est perdu que si le canal se ferme de force pendant que ce paiement est encore en cours.
Comment cela fonctionne
Un HTLC poussière résulte d'une arithmétique et non d'un jugement : la limite de poussière choisie par le propriétaire du canal, plus ce que coûterait la réclamation du paiement on-chain.
Le BOLT 3 qualifie de trimmed la sortie écartée. Pour un paiement que vous proposez, le canal vérifie le montant moins les frais d'expiration du HTLC ; pour un paiement que vous recevez, le montant moins les frais de succès du HTLC. Ces deux transactions pèsent 663 et 703 unités de poids sur un canal sans ancres, donc à un feerate_per_kw de 5 000 elles coûtent 3 315 et 3 515 satoshis. Face à une limite de poussière de 546 satoshis, le seuil des paiements offerts s'établit à 3 861 satoshis et celui des paiements reçus à 4 061.
L'exemple détaillé du BOLT 3 montre la perte. Quatre paiements sont en cours à ce taux de frais : des HTLC offerts de 5 000 et 1 000 satoshis, des HTLC reçus de 7 000 et 800. Le 5 000 et le 7 000 obtiennent chacun une sortie. Le 1 000 et le 800 sont écartés, et les frais de la transaction d'engagement passent d'une base de 5 340 satoshis à 7 140. Ces 1 800 satoshis supplémentaires correspondent exactement aux deux paiements disparus, versés à qui mine la fermeture.
Chaque partie choisit son propre dust_limit_satoshis, de sorte que les deux transactions d'engagement d'un même canal peuvent diverger sur les paiements considérés comme poussière. Le BOLT 2 oblige un nœud à faire échouer le canal si son pair propose une valeur inférieure à 354 satoshis, et lui permet de refuser une valeur qu'il juge trop élevée, car un pair doté d'une limite haute peut publier un engagement rempli de paiements écartés.
Les canaux à ancres ont changé l'arithmétique. Sous option_anchors ou zero_fee_commitments, les transactions HTLC de second niveau ne portent aucun frais, donc elles cessent d'alimenter le calcul et le seuil se réduit à la seule limite de poussière. Le BOLT 3 demande aux nœuds d'élever délibérément le dust_limit_satoshis dans ce cas, car une sortie qui dépasse la limite sans pouvoir être balayée aux taux de frais réels ne fait que polluer l'ensemble des UTXO.
Le BOLT 2 borne aussi le total plutôt que chaque paiement. Au-delà du max_dust_htlc_exposure_msat d'un nœud, lui-même affaire de politique, le nœud devrait faire échouer un HTLC entrant une fois engagé et ne pas révéler la préimage, transformant une perte possible en un échec net.
Où cela se voit
Les HTLC poussière apparaissent dans le modèle de conservation d'un portefeuille plutôt que dans son interface, et les 41 avis de portefeuilles publiés ici se divisent nettement sur ce point.
Phoenix fait tourner un véritable nœud Lightning en auto-conservation sur votre téléphone, donc ses canaux sont les vôtres et cette exposition aussi ; ACINQ facture 0,4 % plus 4 satoshis pour envoyer, et chacun de ces envois est un HTLC que l'écartement peut atteindre. Le volet Lightning de BlueWallet est un compte sur un serveur LNDHub, donc l'exploitant détient les canaux : vous ne portez jamais un paiement écarté, et vous portez cet exploitant à la place.
L'écartement réapparaît au moment de la fermeture. Le BOLT 2 n'autorise la négociation de fermeture que lorsqu'il ne reste plus aucun HTLC dans l'une ou l'autre transaction d'engagement, HTLC poussière compris, si bien qu'un paiement de 300 satoshis qu'aucun observateur on-chain ne peut voir maintient encore ouverte une fermeture coopérative.
HTLC poussière vs limite de poussière
La limite de poussière est un nombre qu'un nœud choisit ; un HTLC poussière est un paiement qui a perdu une comparaison face à ce nombre plus des frais.
La limite est un paramètre de canal, fixé dans open_channel et accept_channel et porté par aucun message ultérieur. L'écartement est un résultat qui évolue : sans ancres, le seuil suit le feerate_per_kw, donc un même paiement de 2 500 satoshis est une sortie réelle dans une mempool calme et se trouve écarté dans une mempool chargée.
Les deux interviennent aussi à des étapes différentes. Les seuils de Bitcoin Core, 546 satoshis pour une sortie legacy et 330 pour pay-to-witness-script-hash, relèvent de la politique de relais et concernent des transactions qui existent. Un HTLC écarté n'atteint jamais ce test, car sa sortie n'est jamais écrite.