Qu'est-ce que la double dépense ?
La double dépense est un problème potentiel dans un système d'argent numérique où les mêmes fonds sont envoyés à deux destinataires en même temps. En l'absence de contre-mesures adéquates, un protocole qui ne résout pas le problème est fondamentalement voué à l'échec. 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 d'argent numérique, il est primordial de s'assurer que des unités spécifiques ne peuvent pas être dupliquées. L'ensemble du système serait compromis 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 les mêmes 10 unités à Bob et Carol simultanément. Pour que l'argent numérique fonctionne, il doit y avoir des mécanismes en place pour empêcher ce comportement.
Comment éviter la double dépense ?
L'approche centralisée
L'approche centralisée est considérablement plus facile à mettre en œuvre que les alternatives décentralisées. Cela implique généralement un superviseur qui gère le système et contrôle l'émission et la distribution des unités. Un bon exemple d'une solution centralisée au problème des dépenses doubles est celui de l'eCash de David Chaum.
Dans un tel contexte, si un utilisateur (appelons-le Dan) souhaite recevoir 100 dollars en argent numérique, il doit d'abord en informer la banque. S'il possède le solde de son compte, il générera alors un numéro aléatoire (ou plusieurs, pour les petites dénominations). Supposons qu'il produise cinq numéros, à qui l'on attribue une valeur de 20 $ chacun. Pour empêcher la banque de repérer des unités spécifiques, Dan brouille les numéros aléatoires en ajoutant un facteur d'aveuglement à chacun d'entre eux.
Il remet ensuite ces données à la banque, qui débite son compte de 100 dollars et signe des messages certifiant que chacune des cinq pièces est échangeable contre 20 dollars. Dan peut maintenant 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 d'aveuglement pour exposer le numéro aléatoire associé à chaque « billet » d'argent 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 dollars.
Les billets utilisés sont maintenant essentiellement inutiles, et d'autres doivent être émis si Erin souhaite dépenser son nouveau solde de la même manière.
Le système eCash de Chaumian pourrait être utile pour les transferts privés. Mais il échoue sur le plan de la résilience, car la banque est un point central de défaillance. Un billet émis ne vaut rien en soi, car sa valeur provient 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 son bon vouloir pour que l'argent fonctionne. C'est précisément le problème auquel les cryptomonnaies veulent remédier.
L'approche décentralisée
Il est plus difficile de s'assurer que les fonds ne peuvent pas être dépensés deux fois dans un écosystème sans superviseur. Des participants de même pouvoir doivent se coordonner autour d'un ensemble de règles qui empêchent la fraude et incitent tous les utilisateurs à agir honnêtement.
Reprenons le scénario du restaurant. Dan retourne au restaurant, et cette fois, un autocollant Bitcoin acceptés est présent sur la fenêtre. Il a apprécié le repas qu'il a pris la dernière fois, alors il le commande à nouveau. Ça lui coûte 0,005 BTC.
Comme mentionné, cependant, la transaction n'est valide que si elle est incluse dans un bloc qui est confirmé. Accepter des transactions non confirmées, c'est un peu comme accepter les 40 dollars en eCash de l'exemple précédent, sans les encaisser immédiatement auprès de la banque ce qui permet à l'expéditeur de les dépenser ailleurs en attendant. Il est donc recommandé qu'Erin attende au moins 6 confirmations de bloc (environ une heure) avant d'accepter le paiement de Dan.
La double dépense et le Bitcoin
Le Bitcoin est soigneusement conçu pour empêcher les attaques par double dépense, du moins lorsque le protocole est utilisé comme prévu. Autrement dit, si des personnes attendent que les transactions soient confirmées dans un bloc, il n'y a pas de moyen simple pour l'expéditeur de les annuler. Pour ce faire, ils devraient « inverser » la blockchain, ce qui nécessite une quantité irréaliste de puissance de hachage.
Toutefois, une poignée d'attaques à double dépense visent des parties qui acceptent des transactions non confirmées. Pour les achats de faible valeur, par exemple, un commerçant peut ne pas vouloir attendre que les transactions soient incluses dans un bloc. Un fast-food très fréquenté ne peut probablement pas se permettre d'attendre que le réseau traite chaque achat. Ainsi, si une entreprise permet des paiements « instantanés », elle s'ouvre à des double dépenses. 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 risque d'être confirmée en premier, et donc d'invalider la précédente.
Il existe trois méthodes populaires pour effectuer une double dépense :
- Les 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 le Bitcoin, mais s'est produite sur d'autres réseaux.
- Attaques de course : deux transactions en conflit sont diffusées en succession, en utilisant les mêmes fonds, mais une seule transaction est confirmée. L'objectif de l'attaquant est d'invalider le paiement en validant uniquement la transaction qui lui est bénéfique (par exemple, en envoyant les mêmes fonds à une adresse qu'il contrôle). Les attaques de course obligent le destinataire à accepter 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 uniquement son bloc précédemment miné, ce qui peut invalider le paiement. Les attaques Finney requièrent une séquence spécifique d'événements et sont également soumises à l'acceptation par le destinataire des transactions non confirmées.
Comme nous pouvons le voir, un marchand qui attend les confirmations de bloc réduira considérablement les risques de devenir victime de double dépenses.
Pour conclure
La double dépense permet à un utilisateur de manipuler un système d'argent électronique à ses propres fins, en utilisant les mêmes fonds plus d'une fois. Traditionnellement, un manque de solutions adéquates au problème a empêché de nouveaux progrès.