Glossaire / Nœuds et logiciels
Vérification simplifiée des paiements
Aussi appelé SPV.
- Qu'est-ce que la vérification simplifiée des paiements ?
- La vérification simplifiée des paiements vérifie qu'une transaction figure dans un bloc étayé par une preuve de travail réelle, en utilisant uniquement les en-têtes de bloc et une branche de Merkle.
Satoshi Nakamoto a décrit la méthode dans la section 8 du livre blanc de 2008, comme le moyen d'utiliser bitcoin sans exploiter un serveur. Elle est peu coûteuse parce qu'un en-tête de bloc fait 80 octets : à environ 960 000 blocs, toute la chaîne d'en-têtes représente à peu près 77 Mo, contre 759 Go pour les blocs eux-mêmes en août 2026. Elle vous apporte la preuve que des mineurs se sont engagés sur votre paiement, et absolument rien sur la légalité de ce paiement.
Comment cela fonctionne
La vérification simplifiée des paiements répond à une question avec deux éléments de preuve.
Le premier est la chaîne d'en-têtes. Chaque en-tête de bloc fait exactement 80 octets et contient le hash de l'en-tête précédent, la racine de merkle des transactions qu'il renferme, un horodatage et la cible de difficulté que le mineur devait battre. Un client télécharge uniquement les en-têtes, vérifie que chacun est lié à celui qui le précède et que chaque hash tombe bien sous la cible annoncée, et obtient une chaîne dont il peut estimer le coût en électricité. La falsifier n'est pas une question de mentir de façon convaincante : cela suppose de refaire le minage.
Le second est la branche de merkle. Les transactions d'un bloc sont hachées ensemble par paires jusqu'à ce qu'il ne reste qu'une racine, si bien que prouver qu'une transaction précise figure dans un bloc ne demande que la poignée de hash frères situés le long du chemin vers cette racine. Le nombre est logarithmique : un bloc de 4 096 transactions demande 12 hash, soit 384 octets, et doubler le bloc n'ajoute qu'un hash de plus. Votre client remonte la branche en hachant, compare le résultat avec la racine de merkle de l'en-tête auquel il se fie déjà, et la transaction est dans ce bloc ou elle n'y est pas.
Réunissez les deux et vous obtenez l'affirmation que porte la vérification simplifiée des paiements : un bloc s'est engagé sur cette transaction, et une quantité mesurable de travail s'est empilée dessus depuis.
Viennent maintenant les lacunes, car c'est la partie utile. L'inclusion n'est pas la validité. La méthode ne peut pas vous dire que les bitcoins dépensés existaient, que les signatures étaient bonnes, que le bloc a accordé au mineur la subvention correcte, ou que les mêmes bitcoins n'ont pas été dépensés dans une autre branche. Elle ne peut pas non plus prouver une négation : un serveur qui omet simplement un paiement ne laisse aucune trace. Satoshi a inscrit cette mise en garde directement dans le livre blanc, en notant que la technique est fiable tant que des nœuds honnêtes maîtrisent le réseau et que les entreprises recevant des paiements fréquents voudront de toute façon exploiter leur propre nœud.
Pourquoi cela compte quand vous achetez du bitcoin
La coche verte dans un portefeuille mobile n'est généralement pas une vérification du tout.
La plupart des portefeuilles que les gens installent après leur premier achat sur une plateforme d'échange ne construisent jamais de chaîne d'en-têtes. Ils demandent à un serveur d'entreprise combien vous possédez, impriment la réponse et l'étiquettent comme confirmée. C'est une garantie plus faible que la méthode du livre blanc, et la méthode du livre blanc est elle-même plus faible qu'un nœud. Pour de petits soldes du quotidien, cette chaîne de confiance convient, et prétendre le contraire n'aide personne. Elle cesse de convenir à partir du moment où le montant ferait mal.
La question pratique est de savoir à qui vous faites confiance et pour combien de temps. Nos avis sur les plateformes d'échange indiquent ce que chacune exige avant de libérer un retrait, et chacun de ces nombres de confirmations est un rapport du propre nœud de cette plateforme. Quand les bitcoins arrivent, le portefeuille qui vous les montre rapporte à nouveau depuis le nœud de quelqu'un d'autre. Aucune des deux parties n'est probablement en train de mentir. Toutes deux peuvent se tromper, être hors ligne ou servir une chaîne qu'on leur a fournie, et aucune ne vous le dira quand cela se produit.
Il y a aussi une dimension de confidentialité. L'étude de 2014 sur les clients à filtres de bloom a constaté que les filtres censés dissimuler les adresses qui intéressaient un portefeuille en révélaient la plupart. C'est pourquoi Bitcoin Core a désactivé cette fonction par défaut dans la version 0.19.0 en novembre 2019, et pourquoi les portefeuilles légers plus récents téléchargent des filtres compacts au lieu de téléverser des requêtes.
Ce que la vérification simplifiée des paiements aurait manqué en septembre 2018
CVE-2018-17144 est l'illustration la plus nette de la différence entre inclusion et validité dans l'histoire de bitcoin.
Une optimisation ajoutée dans Bitcoin Core 0.14.0 sautait une vérification jugée redondante, avec pour résultat que les versions touchées traitaient partiellement un bloc contenant une transaction qui dépensait deux fois la même entrée. Traitée d'une manière, elle faisait planter le nœud. Traitée d'une autre, elle permettait à un mineur de créer du bitcoin à partir de rien. Le bug a été signalé le 17 septembre 2018 et corrigé dans Bitcoin Core 0.16.3 le lendemain. Personne ne l'a exploité sur le réseau en production.
Imaginez que quelqu'un l'ait fait. Un mineur produit un bloc qui gonfle l'offre, avec un en-tête portant une preuve de travail entièrement authentique et un arbre de merkle parfaitement correct. Un nœud complet à jour analyse le bloc, trouve l'entrée en double, le rejette et déconnecte le pair qui l'a envoyé. Un client qui effectue une vérification simplifiée des paiements contrôle l'en-tête, contrôle la branche et rapporte le paiement contenu dans ce bloc comme confirmé, parce que chaque élément de preuve dont il dispose est valide. Il n'a pas accès à l'entrée dépensée, donc la question ne se pose jamais.
C'est tout le compromis. La vérification simplifiée des paiements hérite ses règles de celui qui mine. Un nœud, non.
Vérification simplifiée des paiements vs Neutrino
La vérification simplifiée des paiements et Neutrino permettent toutes deux à un portefeuille de fonctionner sans la chaîne complète, et elles orientent le filtrage dans des directions opposées. L'approche classique sous BIP37 envoie vos centres d'intérêt à un pair : vous téléversez un filtre, le pair cherche pour vous, et il apprend à peu près quelles adresses vous possédez. Neutrino, l'implémentation des BIP157 et BIP158 utilisée par la plupart des portefeuilles Lightning mobiles, fait publier au nœud un filtre compact par bloc pour tout le monde ; votre portefeuille télécharge les filtres, les teste en privé et ne demande que les blocs qui correspondent. La vérification que vous effectuez ensuite est la même arithmétique de merkle et d'en-têtes. Ce qui change, c'est que personne en face n'apprend ce que vous cherchiez.