Glossaire / Confidentialité et sécurité
Double dépense
Aussi appelé Double spend, Double spending.
- Qu'est-ce qu'une double dépense ?
- Une double dépense est une tentative de faire servir le même bitcoin à payer deux personnes différentes, en obtenant qu'une seconde transaction dépensant les mêmes bitcoins soit confirmée à la place de la première.
L'argent numérique est copiable par nature, et empêcher la copie est le problème que le bitcoin a été conçu pour résoudre. Chaque bitcoin est une sortie qui ne peut être consommée qu'une seule fois, et le registre tranche les litiges en enfouissant une version sous des blocs : après six confirmations, environ une heure, l'annuler revient à dépasser en puissance de calcul tout le réseau. Tant qu'un paiement n'est pas confirmé, traitez-le comme une promesse plutôt que comme de l'argent reçu.
Comment cela fonctionne
Dépenser du bitcoin consiste à consommer des sorties précises, chacune identifiée par la transaction qui l'a créée et par sa position dans cette transaction. Les nœuds complets conservent un ensemble de toutes les sorties non dépensées, et la validation est une simple recherche : si la sortie que nomme votre transaction ne figure pas dans cet ensemble, la transaction est invalide et est rejetée, quelle que soit la qualité de sa signature.
Cela rend une double dépense confirmée impossible par construction. Les cas intéressants se produisent tous avant la confirmation, et il y en a trois.
Le plus courant est le remplacement. Deux transactions qui dépensent la même sortie sont en conflit, et une seule peut survivre. Les nœuds acceptent celle qui arrive en premier et ignorent normalement la seconde, mais ils relaieront un remplacement qui paie des frais plus élevés. Depuis Bitcoin Core 28,0, publié en octobre 2024, le réglage -mempoolfullrbf est activé par défaut, ce qui signifie qu'un nœud relaiera une transaction conflictuelle à frais plus élevés, que l'originale ait demandé ou non à être remplaçable. Tout ce qui n'est pas confirmé est susceptible d'être remplacé.
Le deuxième est une course. L'attaquant diffuse une transaction au nœud du commerçant et une transaction conflictuelle au reste du réseau au même moment, en pariant que la version qui le paie lui-même atteindra les mineurs en premier. Aucune prime de frais n'est nécessaire, seulement une meilleure connectivité.
Le troisième est une réorganisation, qui exige une majorité de puissance de calcul et est traitée à la rubrique attaque des 51 %. C'est la seule méthode capable d'annuler un paiement déjà inscrit dans un bloc.
Le code du bitcoin lui-même s'est trompé sur ce point exactement une fois en public. CVE-2018-17144, divulgué en septembre 2018, était un bug qui permettait à une transaction de dépenser deux fois la même entrée sans faire planter le nœud qui la vérifiait. Bitcoin Core 0.16.3 a livré le correctif en quelques jours, et aucun dommage n'a touché la chaîne, mais c'est un rappel utile que la garantie est appliquée par un logiciel que des gens doivent continuer d'auditer.
Pourquoi cela compte quand vous achetez du bitcoin
Les acheteurs ne sont presque jamais victimes d'une double dépense. Lorsque vous envoyez des dollars ou des euros à une plateforme d'échange et recevez du bitcoin, c'est la plateforme qui porte le risque de règlement, ce qui explique pourquoi elle attend des confirmations avant de libérer un retrait et pourquoi les dépôts affichent un compteur de progression. Une fois les bitcoins arrivés à une adresse que vous contrôlez, personne ne peut les dépenser à nouveau, car une dépense exige votre signature.
L'exposition s'inverse dès que c'est vous qui recevez du bitcoin. Cela arrive plus souvent qu'on ne l'imagine : vendre des bitcoins dans un échange pair-à-pair, accepter du bitcoin pour un travail indépendant, tenir une boutique qui accepte des paiements. Dans tous les cas, l'erreur consiste à remettre des marchandises, des espèces ou un virement bancaire contre une transaction non confirmée. Attendez au moins un bloc, et pour des montants plus importants attendez-en plusieurs.
Il existe aussi tout un genre d'arnaques bâties sur cette expression. Des vendeurs sur des applications de messagerie et des sites vidéo proposent des « logiciels de double dépense », des « flash BTC » ou des outils censés générer des bitcoins dépensables contre rémunération. Rien de ce qu'ils vendent ne fonctionne, car la transaction invalide est rejetée par chaque nœud du réseau ; le produit, c'est la somme que vous avez payée. Notre guide de sécurité couvre la famille de fraudes à laquelle cela appartient.
Lightning change la forme du problème plutôt que de le supprimer. Les paiements se règlent en quelques secondes sur le solde d'un canal, si bien qu'un commerçant n'a pas besoin d'attendre des blocs, et la question de la double dépense se déplace vers le point de savoir si un partenaire de canal tente de diffuser un ancien état, ce que les tours de guet existent pour sanctionner.
Remplacer un paiement non confirmé, étape par étape
Remplacer un paiement non confirmé est la version bon marché de l'attaque, et il vaut la peine de la dérouler avec de vrais chiffres.
Alice achète un ordinateur portable et paie 0,01 BTC. Son portefeuille construit une transaction SegWit à une entrée et deux sorties d'environ 141 octets virtuels et y applique 3 sat/vB, soit des frais de 423 satoshis. Le terminal de la boutique affiche le paiement comme reçu et l'ordinateur portable franchit la porte.
Avant qu'un bloc n'arrive, Alice diffuse une seconde transaction qui dépense la même entrée, cette fois en envoyant les bitcoins à sa propre adresse, avec des frais de 20 sat/vB, soit 2 820 satoshis. Les mineurs prennent la version qui vaut plus pour eux. Quand le bloc arrive, le paiement de la boutique a disparu de la mempool et ne sera jamais confirmé. Alice a dépensé 2 397 satoshis de plus, bien moins d'un dollar à la plupart des prix, et a gardé à la fois l'ordinateur portable et les bitcoins.
Rien dans cette séquence n'est exotique, et aucune puissance de calcul n'est intervenue. La défense ne coûte rien non plus : attendez un bloc, environ dix minutes en moyenne, et la fenêtre de remplacement se referme.
Double dépense vs replace-by-fee
Le replace-by-fee est le même mécanisme utilisé honnêtement. Quand votre propre paiement est bloqué, vous le rediffusez avec des frais plus élevés au même destinataire, et le réseau remplace volontiers l'ancienne version. Une double dépense utilise cette mécanique pour changer qui est payé. La politique de relais ne peut pas distinguer les deux, car la différence est une intention exprimée dans les sorties, ce qui explique pourquoi les commerçants qui acceptent des paiements non confirmés supposent désormais que chacun d'eux est remplaçable.
Double dépense vs malléabilité des transactions
La malléabilité modifie l'identifiant d'une transaction sans changer ce qu'elle paie. Les bitcoins arrivent toujours au destinataire prévu ; seul le txid que vous suiviez devient obsolète, ce qui a historiquement cassé la comptabilité des plateformes d'échange et le système de retrait de Mt. Gox en février 2014. SegWit, activé en août 2017, a supprimé la malléabilité par des tiers en déplaçant les signatures hors des données hachées dans le txid. Une transaction malléée est un problème de tenue de comptes ; une double dépense est un paiement qui s'évapore.