Qu’est-ce que la double dépense ?

Les doubles dépenses constituent un problème potentiel dans un système de paiement numérique où les mêmes fonds sont envoyés à deux destinataires en même temps. Sans contre-mesures adéquates, un protocole qui ne résout pas le problème est fondamentalement compromis : les utilisateurs n’ont aucun moyen de vérifier que les fonds qu’ils ont reçus n’ont pas déjà été dépensés ailleurs.

Lorsqu’il s’agit de monnaie numérique, il est primordial de garantir que des unités spécifiques ne peuvent pas être dupliquées. Le système tout entier serait mis à mal si Alice pouvait recevoir 10 unités, les copier-coller 10 fois et se retrouver en possession de 100 unités. De même, un tel système ne peut pas fonctionner si elle peut envoyer simultanément les mêmes 10 unités à Bob et Carol. Ainsi, pour que la monnaie numérique fonctionne, des mécanismes doivent être mis en place pour empêcher ce comportement.


Comment éviter les doubles dépenses ?

L'approche centralisée

La voie centralisée est considérablement plus facile à mettre en œuvre que les alternatives décentralisées. Cela implique généralement qu'un seul superviseur gère le système et contrôle l'émission et la distribution des unités. Un bon exemple de solution centralisée au problème des doubles dépenses est celui de l’eCash de David Chaum.

Pour fournir aux utilisateurs un actif numérique imitant l'argent liquide (capable d'échange anonyme et peer-to-peer), une banque peut utiliser des signatures aveugles – comme l'a détaillé le cryptographe David Chaum dans son article de 1982 Blind Signatures for Untraceable Payments.

Dans un tel contexte, si un utilisateur (appelons-le Dan) souhaite recevoir 100 $ en espèces numériques, il doit d’abord en informer la banque. À condition qu'il ait le solde sur son compte, il générera alors un nombre aléatoire (ou plusieurs, pour les plus petites coupures). Supposons qu’il produise cinq nombres, chacun se voyant attribuer une valeur de 20 $. Pour empêcher la banque de suivre des unités spécifiques, Dan masque les nombres aléatoires en ajoutant un facteur aveugle à chacun d'eux.

Il remet ensuite ces données à la banque, qui débite son compte de 100 $ et signe des messages certifiant que chacune des cinq informations est échangeable contre 20 $. Dan peut désormais dépenser les fonds émis par la banque. Il se rend au restaurant d'Erin et achète un repas qui lui coûte 40 $.

Dan peut supprimer le facteur aveuglant pour exposer le numéro aléatoire associé à chaque « facture » numérique, qui sert d'identifiant unique pour chaque unité (un peu comme un numéro de série). Il en révèle deux à Erin, qui doit maintenant les échanger immédiatement auprès de la banque pour empêcher Dan de les dépenser chez un autre commerçant. La banque vérifiera que les signatures sont valides et si tout semble correct, elle créditera le compte d’Erin de 40 $.

Les billets utilisés sont désormais pour l'essentiel brûlés, et d'autres doivent être émis si Erin souhaite dépenser son nouveau solde de la même manière.

La configuration Chaumian eCash peut être utile pour les transferts privés. Mais sa résilience échoue parce que la banque est un point central de défaillance. Un billet émis ne vaut rien en soi, car sa valeur dépend uniquement de la volonté de la banque de l’échanger contre des dollars. Les clients sont à la merci de la banque et doivent compter sur sa bonne volonté pour que l’argent fonctionne. C’est précisément le problème auquel la cryptomonnaie vise à remédier.


L'approche décentralisée

Il est plus difficile de garantir que les fonds ne peuvent pas être dépensés deux fois dans un écosystème sans superviseur. Des participants tout aussi puissants doivent se coordonner autour d’un ensemble de règles qui préviennent la fraude et incitent tous les utilisateurs à agir honnêtement.

La plus grande innovation présentée dans le livre blanc Bitcoin était une solution au problème de la double dépense. Bien que cela ne soit pas référencé en tant que tel, Satoshi a proposé la structure de données désormais largement connue sous le nom de blockchain.

Une blockchain n’est en réalité qu’une base de données dotée de propriétés uniques. Les participants au réseau (appelés nœuds) exécutent un logiciel spécialisé qui leur permet de synchroniser leur copie de la base de données avec leurs pairs. Le résultat est que l’ensemble du réseau peut auditer l’historique des transactions remontant au bloc Genesis. En rendant la blockchain visible publiquement, il est facile de détecter et de prévenir les activités frauduleuses, telles que les transactions qui tentent de doubler les dépenses.

Lorsqu’un utilisateur diffuse une transaction, celle-ci n’est pas immédiatement ajoutée à la blockchain : elle doit d’abord être incluse dans un bloc via le minage. En tant que tel, le destinataire ne doit considérer la transaction comme valide qu’après l’ajout de son bloc à la chaîne. Sinon, ils risquent de perdre les fonds, car l’expéditeur pourrait dépenser les mêmes pièces ailleurs.

Une fois la transaction confirmée, les pièces ne peuvent pas être dépensées deux fois, car la propriété est attribuée à un nouvel utilisateur – et l’ensemble du réseau peut le vérifier. C'est pour cette raison que beaucoup recommandent d'attendre plusieurs confirmations avant d'accepter un paiement comme valide. Chaque bloc suivant augmente considérablement la quantité d'effort requis pour modifier ou réécrire la chaîne (ce qui peut se produire lors d'une attaque à 51 %).

Revenons sur le scénario du restaurant. Dan retourne au restaurant et remarque cette fois un autocollant Bitcoin Accepted Here sur la fenêtre. Il a apprécié le repas qu'il a pris la dernière fois, alors il le commande à nouveau. Cela lui coûte 0,005 BTC.

Erin lui présente une adresse publique à laquelle il doit envoyer les fonds. Dan diffuse la transaction, qui est essentiellement un message signé indiquant que les 0,005 BTC qui étaient en possession de Dan sont désormais en possession d'Erin. Sans entrer dans trop de détails, toute personne présentée avec la transaction signée par Dan peut vérifier qu’il était bien en possession des pièces et qu’il avait donc le pouvoir de les envoyer.

Comme mentionné, cependant, la transaction n'est valide que si elle est incluse dans un bloc confirmé. Accepter des transactions non confirmées revient à accepter les 40 $ en eCash de l’exemple précédent, sans les encaisser immédiatement auprès de la banque – cela permet à l’expéditeur de les dépenser ailleurs. Il est donc recommandé à Erin d’attendre au moins 6 confirmations de blocage (environ une heure) avant d’accepter le paiement de Dan.


Double dépense en Bitcoin

Bitcoin est soigneusement conçu pour empêcher les attaques à double dépense, du moins lorsque le protocole est utilisé comme prévu. Autrement dit, si les individus attendent que les transactions soient confirmées dans un bloc, il n’existe pas de moyen simple pour l’expéditeur de l’annuler. Pour ce faire, ils devraient « inverser » la blockchain, ce qui nécessite une quantité irréaliste de puissance de hachage.

Cependant, il existe une poignée d’attaques de double dépense visant les parties qui acceptent des transactions non confirmées. Pour les achats de faible valeur, par exemple, un commerçant ne souhaitera peut-être pas attendre que les transactions soient incluses dans un bloc. Un fast-food très fréquenté ne peut probablement pas se permettre de rester les bras croisés pendant que le réseau traite chaque achat. Ainsi, si une entreprise autorise les paiements « instantanés », elle s’expose à des dépenses doubles. Quelqu'un peut commander un hamburger, le payer, puis envoyer immédiatement les mêmes fonds à sa propre adresse. Avec des frais plus élevés, cette nouvelle transaction sera probablement confirmée en premier, et invalidera donc la précédente.

Il existe trois méthodes populaires pour effectuer une double dépense :

  • Attaques à 51 % : lorsqu'une seule entité ou organisation parvient à contrôler plus de 50 % du taux de hachage, ce qui lui permet d'exclure ou de modifier l'ordre des transactions. Une telle attaque est très improbable sur Bitcoin, mais s’est produite sur d’autres réseaux.

  • Attaques raciales : deux transactions contradictoires sont diffusées successivement, en utilisant les mêmes fonds – mais une seule transaction est confirmée. Le but de l'attaquant est d'invalider le paiement en validant uniquement la transaction qui lui profite (par exemple, en envoyant les mêmes fonds à une adresse qu'il contrôle). Les attaques de course exigent que le destinataire accepte une transaction non confirmée comme paiement.

  • Attaques Finney : un attaquant pré-mine une transaction dans un bloc sans la diffuser immédiatement sur le réseau. Au lieu de cela, il dépense les mêmes pièces dans une autre transaction et diffuse ensuite son bloc précédemment extrait, ce qui peut invalider le paiement. Les attaques Finney nécessitent une séquence spécifique d’événements et dépendent également de l’acceptation par le destinataire de transactions non confirmées.

Comme nous pouvons le constater, un commerçant qui attend les confirmations de blocage réduira considérablement les risques d’être victime de doubles dépenses.


Pensées finales

Une double dépense permet à un utilisateur de jouer avec un système de paiement électronique pour obtenir un gain financier, en utilisant les mêmes fonds plus d'une fois. Traditionnellement, le manque de solutions adéquates au problème a fait obstacle aux progrès dans ce domaine.

Heureusement, l’utilisation de signatures aveugles offrait une solution intéressante pour les systèmes financiers centralisés. Plus tard, la création de mécanismes de preuve de travail et de la technologie blockchain a donné naissance au Bitcoin en tant que forme puissante d’argent décentralisé – qui, à son tour, a inspiré des milliers d’autres projets de crypto-monnaie.