Auteur : SJORS PROVOOST

Source : https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/

Une adresse Bitcoin ne fait pas partie de la blockchain Bitcoin, mais est un jeton que le logiciel Bitcoin (portefeuille) utilise pour communiquer où envoyer les Bitcoins : soit vers une certaine clé publique (P2PK), soit vers un hachage d'une clé publique (P2PKH). , un hachage d'un script (P2SH), un hachage d'une clé publique SegWit (P2WPKH) ou un hachage d'un script SegWit (P2WSH). L'adresse contient également des métadonnées sur son type.

(Note du traducteur : les types d'adresses de Bitcoin continueront d'augmenter avec la mise à niveau du réseau Bitcoin et la standardisation des méthodes de script. En fait, les types d'adresses mentionnés ci-dessus, à l'exception de P2PK et P2PKH, sont apparus avec la version initiale de Bitcoin. , le reste est venu plus tard. Désormais, en raison de la mise à niveau Taproot activée en 2021, Bitcoin a un autre type d'adresse "P2TR").

Les adresses Bitcoin utilisent un système de numérotation unique pour exprimer les méthodes de paiement ci-dessus. Cet article présentera chacun de ces différents systèmes de numérotation et fournira une analyse approfondie des avantages des adresses Bitcoin en général et des adresses bech32. De plus, nous expliquerons d'où vient la vulnérabilité (menace moindre) contenue dans la première version des adresses bech32 et comment elle a été résolue. Enfin, nous avons évoqué l’impact de l’informatique quantique.

- Cet article est extrait de mon nouveau livre "Bitcoin : Unfinished Research" -

Contexte historique

Lorsque vous envoyez du Bitcoin à quelqu’un, vous créez essentiellement une transaction avec plusieurs entrées et au moins une sortie. Les résultats précisent qui peut les dépenser grâce à des contraintes intégrées (légalement appelées charges, qui limitent le transfert de propriété d'un actif).

Le fardeau le plus insignifiant est de permettre à quiconque de dépenser les bitcoins. Ce n’est pas une bonne idée car le Bitcoin sera rapidement volé. Par conséquent, au début du développement de Bitcoin, la grande majorité des Bitcoins sur la blockchain ne pouvaient utiliser que deux contraintes : Pay-to-Public-Key (P2PK) ou Pay-to-Public-Key-Hash (P2PKH). Le premier peut être compris comme « Seuls ceux qui détiennent la clé privée correspondant à la clé publique pour dépenser le Bitcoin ».

À cette époque, nous pouvions également envoyer du Bitcoin à l'adresse IP du destinataire, mais cette fonctionnalité a été abandonnée en 2012. Pour l'utiliser, vous devez vous connecter à l'adresse IP du bénéficiaire, demander la clé publique au bénéficiaire, et le bénéficiaire vous donnera la clé publique1. Votre portefeuille créera alors des Bitcoins avec le script P2PK.

Ce flux de travail semblerait étrange aujourd'hui2, mais il correspondait au modèle courant des applications peer-to-peer comme Napster et Kazaa à l'époque, qui consistait à se connecter directement à d'autres personnes et à télécharger des éléments à partir d'elles. De nos jours, vous ne connaissez probablement pas l'adresse IP de votre ami, et s'il utilise un appareil mobile, son adresse IP peut même changer tout le temps. Bien que vous puissiez demander à votre nœud Bitcoin de se connecter spécifiquement au nœud de votre ami, en général, il ne se connectera qu'à des nœuds aléatoires, voir le chapitre 2.

La méthode de transaction la plus courante est similaire au virement bancaire. Le destinataire vous donne une adresse et vous envoyez des bitcoins à cette adresse, tout comme vous enverriez de l'argent sur un compte bancaire. Au départ, nous utilisions tous P2PKH comme adresse (la signification de P2PKH est expliquée ci-dessous).

De cette manière, la transaction n'est pas envoyée directement au bénéficiaire, mais est diffusée via tous les nœuds du réseau, et est finalement découverte par le nœud minier et regroupée dans un bloc. Il est possible que le nœud de votre contrepartie ait vu la transaction provenant d'un nœud homologue ou ait reçu le bloc dans lequel la transaction a lieu.

La troisième méthode de transaction est le minage, qui consiste à vous envoyer les récompenses en bloc obtenues grâce au minage. Initialement, le logiciel Bitcoin contenait un logiciel de minage intégré. Ainsi, dès que vous téléchargez le logiciel Bitcoin, votre logiciel Bitcoin commencera à miner puis enverra les Bitcoins sur votre portefeuille, il n'est pas nécessaire d'échanger des adresses dans ce cas. Ces Bitcoins utilisent tous P2PK comme contrainte 3.

Quelle est l'adresse?

Les adresses sont un moyen pratique d’indiquer quel script doit être intégré à la blockchain. Comme nous l’avons indiqué plus haut, le but du script est d’imposer des restrictions sur les Bitcoins et de permettre uniquement au destinataire de les dépenser4. L'adresse elle-même n'existe pas sur la blockchain et l'adresse ne contient même pas de script complet.

Parmi les deux types de scripts les plus utilisés dans le passé, les adresses ne sont utilisées que pour Pay-to-Public-Key-Hash (P2PKH). Lorsqu'un portefeuille voit une telle adresse, il génère un script qui demande à la personne qui y dépense les bitcoins de détenir la clé publique correspondante pour ce hachage (le script lui-même est fourni au chapitre 10). Seul le hachage est rendu public et la clé publique reste secrète jusqu'à ce que le destinataire dépense les bitcoins.

Les adresses P2PKH commencent par le chiffre 1, suivi du hachage de la clé publique. L'adresse est codée en base58, comme indiqué dans l'exemple suivant :

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

Qu'est-ce que le système de base ?

Pour comprendre base58, nous devons d’abord comprendre les principes de base du système de base.

Prenez la base 10 par exemple, considérez-la comme vos 10 doigts. Ainsi, si vous vouliez exprimer le nombre 115 (1, 1, 5), vous feriez trois gestes avec les deux mains correspondant à 1, 1, 5. Depuis que les humains ont inventé les tablettes d’argile et le papier, vous pouvez également écrire ces chiffres avec un stylo, ce qui est bien plus pratique que d’utiliser vos doigts. Par conséquent, base10 est un système décimal qui utilise 10 symboles différents, utilisant diverses combinaisons de ces 10 symboles pour exprimer n'importe quel nombre (entier).

Au-delà de cela, il existe de nombreux systèmes de base différents. Par exemple, les anciens Babyloniens utilisaient la base60. Pour lire le code machine, nous utilisons généralement l'hexadécimal, également appelé base16 - en utilisant les 16 caractères chiffres 0 à 9 et les lettres A à F. Pendant ce temps, dans les ordinateurs, la base2 (un système de nombres binaires) est privilégiée car les transistors n'ont que deux états : activé et désactivé. Cela signifie que tout se fait avec seulement deux nombres, 0 et 1, et que vous pouvez les utiliser pour représenter n'importe quel nombre.

Satoshi Nakamoto a introduit le système base58, qui utilise 58 symboles différents : les chiffres de 0 à 9 et la plupart des lettres minuscules et majuscules de l'alphabet. Cependant, certaines lettres et chiffres qui sont facilement confondus et mal identifiés par les utilisateurs ne sont pas inclus - par exemple, le chiffre 0 et le O majuscule, ainsi que le I majuscule et le l minuscule.

Avez-vous déjà vu le code source d'une pièce jointe à un e-mail ? Un tas de chiffres étranges. Il s'agit de base64, et base58 est né sur la base de bas64. Cependant, base64 contient des caractères tels que le trait de soulignement, le signe plus, le signe égal et la barre oblique. base58 supprime ces caractères, ce qui facilite l'inspection visuelle et peut être appliqué efficacement aux URL.

Base58 et paiement au hachage de clé publique

Qu’est-ce que cela a à voir avec P2PKH ? Les adresses P2PKH commencent par 1, suivi du hachage de clé publique codé en base58.

Il s’agit des informations que vous devez envoyer à quelqu’un d’autre lorsque vous souhaitez recevoir du Bitcoin de sa part. Vous pouvez également leur envoyer simplement 0x005 et la clé publique. Peut-être qu'ils réussiront à traduire 0x00, mais probablement pas.

En théorie, vous pourriez envoyer à quelqu'un d'autre un script Bitcoin représenté en hexadécimal (le format utilisé sur la blockchain) car les scripts Bitcoin sont des messages binaires. Sur la blockchain, un script Bitcoin comme celui-ci signifierait : « Si cette personne dispose du bon hachage de clé publique et de la clé publique qui lui correspond, vous pouvez dépenser ce Bitcoin si vous souhaitez approfondir le fonctionnement du script Bitcoin. au chapitre 10.

Bien qu’il existe un grand nombre de représentations parmi lesquelles choisir, les gens choisissent généralement des formats d’adresse standardisés. Cela explique pourquoi toutes les adresses Bitcoin traditionnelles commencent par 1 et ont toutes à peu près la même longueur.

En plus d’être utilisé pour envoyer des adresses Bitcoin, base58 peut également être utilisé pour transmettre des clés privées. Dans ce cas, le symbole principal est 5 (représentant 128 comme octet de version), suivi de la clé privée.

Dans le passé, les utilisateurs utilisaient des portefeuilles en papier pouvant être imprimés. S'ils sont générés de manière sécurisée sans portes dérobées, alors le papier comporte une chaîne commençant par "1" d'un côté et une chaîne commençant par "5" de l'autre côté, avec la note que seules les adresses Bitcoin peuvent être présentées, la clé privée doit ne soit pas partagé.

Il existe également des adresses commençant par « 3 », ce qui signifie que les Bitcoins sont verrouillés dans le hachage du script, et non dans le hachage de la clé publique. Nous présenterons Pay to Script Hash (P2SH) au chapitre 10. Ces adresses sont généralement des adresses multisig, mais peuvent également être des adresses SegWit6.

Bien que les adresses base58 fonctionnent bien, des améliorations sont possibles. Nous avons donc bech32.

bech32 apparaît

En mars 2017, Pieter Wuille parlait d'un nouveau format d'adresse, bech32. Bech32 est utilisé depuis l'activation réussie de SegWit. Comme son nom l'indique, bech32 est un système base32. Autrement dit, vous pouvez utiliser presque toutes les lettres et tous les chiffres, à l'exception de quelques-uns qui peuvent prêter à confusion.

Vidéo explicative : https://youtu.be/NqiN9VFE4CU

La plus grande différence entre bech32 et base58 est que les lettres majuscules et minuscules ne sont pas mélangées. Chaque lettre n’apparaîtra qu’une seule fois (soit entièrement en majuscules, soit entièrement en minuscules), elle sera donc beaucoup plus facile à lire. Le mappage précis entre chaque lettre ou chiffre et sa valeur correspondante est fixe, mais plutôt arbitraire : Q signifie simplement 0, P signifie simplement 1, sans aucune signification profonde derrière cela.

- table de mappage bech32. Par exemple, q signifie 0 et 3 signifie 17 (1+16) -

Une adresse bech327 se compose de deux parties séparées par "1", par exemple bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

La première moitié est intentionnellement lisible, par exemple « bc » (pour Bitcoin) ou « Inbc » (Lightning Network on Bitcoin). Les valeurs représentées par des lettres telles que « b » et « c » n'ont aucune signification. Ils n'existent que pour que les gens les reconnaissent : "Compris, si l'adresse commence par 'bc', elle fait référence à Bitcoin comme crypto-monnaie. Cependant, le portefeuille vérifiera si ces valeurs existent à titre de contrôle de crédibilité, et ces valeurs." ​​sont également inclus dans la somme de contrôle.

"1" n'est qu'un caractère délimiteur et ne représente aucune valeur. Si vous regardez la table de mappage pour bech32, vous verrez que "1" n'est pas inclus, ce qui signifie "ignorer".

La seconde moitié commence par le numéro de version de SegWit. La version 0 est représentée par Q(bc1q…) (voir chapitre 3). La version 1 est ce que nous appelons Taproot (voir la partie 4 de ce livre), représentée par "P" (bc1p...). Dans le cas de la version 0 de SegWit, le numéro de version sera suivi de 20 ou 32 octets, représentant respectivement le hachage de clé publique ou le hachage de script. La différence de longueur est due au fait que SegWit utilise le hachage SHA256 du script (32 octets) plutôt que le hachage RIPEMD160 du script (20 octets).

En base58, le hachage du script a la même longueur que le hachage de la clé publique. Mais dans SegWit, les longueurs des deux sont différentes. Ainsi, en regardant simplement la longueur de l'adresse, vous pouvez immédiatement savoir si vous payez un script ou un hachage de clé publique. Incidemment, Taproot élimine cette différence de longueur, améliorant ainsi encore la confidentialité.

Par conséquent, bench32 se caractérise par l'utilisation de seulement 32 caractères pour la seconde moitié de l'adresse, et par ailleurs, il n'est pas très différent de base58. Consultez cette fonctionnalité et vous saurez : "Aha, c'est une adresse P2PKH." Dans ce cas, Pay-to-Witness-Public-Key-Hash (P2WPKH), où "Witness" fait référence à SegWit , mais l'idée principale reste le même : les personnes et les ordinateurs peuvent identifier le type d'adresse sur la base d'un court préfixe suivi du hachage d'une clé publique ou d'un script.

Jeu de fléchettes en 32 dimensions

Mais la simplicité n’est pas le seul avantage. Un autre avantage est la correction des erreurs, au moins la détection des erreurs.

Si vous entrez une mauvaise adresse, le pire qui puisse arriver est que vous envoyiez Bitcoin vers la mauvaise clé publique. Lorsque le destinataire tente de dépenser du Bitcoin, il constatera que le hachage de sa clé publique ne correspond pas aux exigences de la blockchain car l'expéditeur a déjà saisi une mauvaise adresse. Ce Bitcoin ne sera jamais récupéré.

Heureusement, l'adresse base58 a une somme de contrôle à la fin. De cette façon, si vous entrez une mauvaise adresse, la vérification de la somme de contrôle à la fin de l’adresse échouera. Votre portefeuille vous alertera et refusera d’envoyer la transaction (la blockchain ne vous protégera pas, mais votre portefeuille le fera). Cependant, si vous n'avez vraiment pas de chance, il est possible d'obtenir la somme de contrôle correcte même si vous faites une erreur.

Bech32 est conçu pour éviter de telles coïncidences extrêmes. De plus, Bech32 vous indique non seulement si vous avez commis une erreur, mais également où vous l'avez commise. La méthode spécifique consiste à prendre tous les octets de l'adresse et à les hacher à l'aide d'une formule mathématique complexe. Même si vous faites 4 erreurs, Bech32 saura toujours où vous avez commis l'erreur et quelle est la valeur réelle. Si vous faites plus de 4 erreurs, Bech32 ne peut rien faire.

Illustrons par une analogie : vous dessinez un ensemble de cercles qui ne se chevauchent pas sur un mur. La cible de chaque cercle représente une valeur correcte, tandis que les autres points du cercle représentent une erreur de saisie. Si vous êtes un joueur de fléchettes expérimenté, la plupart du temps vous toucherez la cible, ce qui signifie que vous perdrez la bonne valeur. Si vous manquez légèrement la cible, mais que vous tombez toujours à l'intérieur du cercle, cela signifie que la valeur que vous avez saisie est légèrement erronée. La vérification des erreurs consiste à savoir que vous avez raté la cible. La correction consiste à déplacer la fléchette vers la cible la plus proche.

L'idée ici est que vous souhaitiez rendre le cercle aussi large que possible pour accueillir les joueurs de fléchettes les plus imprudents, mais vous ne voulez pas perdre trop d'espace. De même, nous ne voulons pas qu’une adresse Bitcoin comporte des centaines de caractères. C’est le problème d’optimisation préféré des mathématiciens.

Contrairement à un mur 2D, bech32 est comme un mur 32D avec une hypersphère 32D. Lorsque vous entrez votre adresse, il y a une légère déviation quelque part dans cet espace à 32 dimensions, mais peu importe à quoi cela ressemble, vous êtes toujours à l’intérieur de cette hypersphère. Dans ce cas, votre portefeuille sait ce qui ne va pas et peut efficacement empêcher la perte de Bitcoins causée par un envoi à une mauvaise adresse8.

vulnérabilité bech32

En 2019, les gens ont découvert que si le dernier caractère d'une adresse bech32 est P et que vous entrez accidentellement un ou plusieurs Q plus tard, la vérification de la somme de contrôle réussira toujours et vous ne recevrez pas d'invite d'erreur de saisie. Votre logiciel de portefeuille pensera que l’adresse a été saisie correctement, ce qui vous permettra d’envoyer le Bitcoin à la mauvaise adresse, ce qui rendra le Bitcoin inutilisable, comme nous l’avons expliqué ci-dessus.

La bonne nouvelle est que bech32 ne fonctionne qu'avec SegWit et que les adresses SegWit ont une limite de longueur : elles ne peuvent faire que 20 ou 32 octets. Heureusement, si vous entrez un Q supplémentaire après une adresse de 20 ou 32 octets, l'adresse que vous entrez ne sera pas valide car elle dépasse la limite de longueur. Votre portefeuille remarquera ce problème et refusera d'envoyer les bitcoins. Il a été initialement envisagé d'introduire une limite de longueur d'adresse similaire pour Taproot, mais la solution mentionnée ci-dessous élimine ce besoin. La longueur d’adresse flexible nous aidera à améliorer Taproot à l’avenir.

bech32m est né

Pour corriger les vulnérabilités de bech32, un nouveau standard appelé bech32m a été proposé9. bech32m est en fait un changement très simple : un nombre supplémentaire est ajouté à la formule de somme de contrôle bech32 pour garantir que tout caractère supplémentaire générera une somme de contrôle invalide.

Cette nouvelle norme s'applique uniquement aux adresses Taproot et aux adresses futures. Rien ne change pour les adresses SegWit, car elles sont déjà protégées par une limite de longueur de 20 ou 32 octets. Au moment de la rédaction de cet article, la plupart des logiciels de portefeuille prennent en charge la nouvelle norme bech32m.

Qu’est-ce qui m’a poussé à me débarrasser de mon anxiété et à tomber amoureux de l’informatique quantique ?

Par ailleurs, Pay-to-Public-Key-Hash (P2PKH) est considéré comme plus résistant aux attaques quantiques car vous n'avez pas besoin de révéler votre clé publique. L’inconvénient était que les hachages prenaient plus de place – mais ce n’était pas un problème à l’époque car les blocs étaient loin d’être pleins.

De nombreuses personnes craignent que les ordinateurs quantiques ne finissent par compromettre la sécurité de la cryptographie Bitcoin, donnant ainsi aux pirates quantiques la possibilité de voler des Bitcoins. S’ils parviennent à voler des millions de Bitcoins, cela pourrait même provoquer un krach boursier.

Le problème est que malgré l’adoption généralisée de P2PKH, les clés publiques de 5 à 10 millions de ces Bitcoins ont été rendues publiques. Ironiquement, avec autant de Bitcoins vulnérables aux pirates quantiques, il ne sert à rien d’essayer de protéger les Bitcoins restants de cette manière. Même si vos Bitcoins ne seront pas volés parce que vous utilisez P2PKH, ils deviendront inévitablement sans valeur en raison de l'effondrement des prix.

Le physicien Stepan Snigirev et le mathématicien Andrew Poelstra expliquent le potentiel des attaques quantiques à avoir des conséquences dévastatrices à court terme et les contre-mesures possibles dans deux épisodes du podcast intitulé What Bitcoin Did.

L'espace de bloc devient désormais très rare, donc ne pas avoir à stocker les hachages de clés publiques dans un espace de bloc précieux permet aux utilisateurs d'économiser de l'argent. C’est pourquoi dans le nouveau soft fork Taproot (voir partie 4 de ce livre), l’adresse Bitcoin redevient P2PK10. Veuillez noter que l'utilisation des adresses Taproot n'est pas obligatoire, donc si vous n'êtes pas d'accord avec le raisonnement ci-dessus, vous pouvez choisir de ne pas utiliser Taproot.

note de bas de page

1. Pour satisfaire la curiosité des passionnés d'« archéologie » du code : le nœud expéditeur aura une boîte de dialogue d'interface utilisateur demandant le montant du transfert et l'adresse IP. La fonction StartTransfer() crée une transaction de chèque en blanc dans laquelle l'ordre de contrôle sur le nœud destinataire insère un script P2PK (en tant que scriptPubKey). OnReply2() insère ensuite le montant, signe la transaction, renvoie la transaction au destinataire et la diffuse. code source. ↩

2. Et ce n'est pas sûr, Satoshi Nakamoto l'a également admis. ↩

3. Pourquoi la version initialement publiée par Satoshi Nakamoto prenait-elle en charge à la fois P2PK et P2PKH ? Nous ne savons pas exactement pourquoi. Le mode de paiement P2PK n’est en réalité utilisé que pour payer les adresses IP et verser des récompenses en bloc aux mineurs. Ni l’un ni l’autre ne nécessite une interaction humaine. Dans les scénarios impliquant une interaction humaine, les utilisateurs utilisent P2PKH. L'adresse utilisée fait référence à P2PKH et non à P2PK. Les systèmes automatisés n'ont pas besoin du concept d'adresses car ils peuvent également gérer des scripts. Il n'est donc pas nécessaire de recourir à des concepts tels que les adresses P2PK. ↩

4. Jusqu’à présent, le scénario ressemblait à celui d’un compte bancaire. Comme nous l'apprendrons au chapitre 10, les scripts font bien plus que simplement conserver de l'argent pour le propriétaire. ↩

5. Une paire de nombres hexadécimaux préfixés par 0x est généralement utilisée pour représenter un octet, qui peut représenter 16 × 16 = 256 valeurs différentes. Par conséquent, 0x00 représente un octet et sa valeur est 0. ↩

6. Comme expliqué au chapitre 3, SegWit utilise généralement des adresses bech32. Cependant, il a fallu beaucoup de temps avant que tous les portefeuilles et échanges prennent en charge les paiements vers les adresses bech32. Pour continuer à tirer parti de certains des avantages de SegWit, nous introduisons un type d'adresse qui ressemble à un P2SH classique du point de vue de l'expéditeur, mais qui possède la magie de SegWit derrière lui. Ce type d'adresse est appelé adresse P2SH-P2WPKH. ↩

7.bech32 proposé par BIP173. ↩

8. Les premiers portefeuilles Ethereum n’utilisaient pas la détection d’erreurs car leurs normes d’adresse manquaient de sommes de contrôle. Bien que l'EIP55 ait introduit les sommes de contrôle en 2016, tous les portefeuilles n'effectuent pas la détection des erreurs. Même en 2017, les gens perdaient encore de l’éther en raison d’une mauvaise adresse. ↩

9.bech32m proposé par BIP 350. ↩

10. Voir les notes du BIP 341 pour des raisons spécifiques. ↩