Glossaire / Adresses et clés
Bech32m
- Qu'est-ce que Bech32m ?
- Bech32m corrige un défaut de bech32 en modifiant une constante dans la somme de contrôle, et toute adresse Taproot commençant par bc1p l'utilise à la place de l'encodage d'origine.
Spécifié dans BIP-350.
Le défaut est étroit mais réel. Chaque fois qu'une chaîne bech32 se termine par le caractère « p », l'insertion ou la suppression d'un nombre quelconque de caractères « q » juste avant cette dernière lettre laisse la somme de contrôle valide, de sorte qu'une adresse altérée peut passer la vérification. Le BIP-350 ferme la faille en combinant 0x2bc830a3 dans la somme de contrôle là où bech32 combinait la valeur 1.
Comment cela fonctionne
Bech32m est bech32 avec un nombre changé. L'encodeur développe le préfixe lisible par l'humain, ajoute les données, applique le même polynôme BCH au résultat, et ne diffère qu'à la dernière étape, où la sortie est combinée avec 0x2bc830a3 plutôt qu'avec 1. Tout ce qu'un lecteur peut voir reste identique : le même alphabet de 32 caractères, le même séparateur « 1 », les mêmes six caractères de somme de contrôle, le même plafond de 90 caractères.
Changer la constante n'est pas un effet secondaire. C'est le mécanisme. Parce que les deux schémas divergent, une chaîne bech32m échoue au test de somme de contrôle bech32 et une chaîne bech32 échoue à celui de bech32m, si bien que les anciens logiciels rejettent d'emblée les nouvelles adresses au lieu de les comprendre à moitié. Le BIP-350 décrit cela comme une rupture de compatibilité délibérée, préférée à une correction silencieuse de bech32 sur place.
La ligne de partage est la version de témoin. La version de témoin 0, c'est-à-dire les adresses bc1q pour les clés seules et les scripts, conserve bech32. Les versions de témoin 1 à 16 utilisent bech32m. Seule la version 1 est définie aujourd'hui, comme Taproot, donc en pratique bech32m signifie bc1p. La règle a été écrite pour couvrir des versions qui n'existent pas encore, et c'est pourquoi un portefeuille correct vérifie le numéro de version plutôt que le préfixe de l'adresse.
Où le voir
Une adresse de réception bc1p est en bech32m, longue de 62 caractères, et encode une clé de 32 octets. Sur les réseaux de test, les mêmes sorties apparaissent en tb1p. Les sorties Taproot sont devenues dépensables au bloc 709 632 le 14 novembre 2021, point à partir duquel les adresses bech32m ont commencé à porter de la valeur réelle sur le réseau principal.
Bitcoin Core a implémenté le BIP-350 dans la version 22.0, et à partir de cette version, chaque appel de procédure distante qui prend une adresse exige bech32m pour la version de témoin 1 et au-delà. La version 23.0 est allée plus loin : les portefeuilles à descripteurs nouvellement créés reçoivent automatiquement un descripteur tr(), de sorte qu'ils distribuent des adresses bc1p sans qu'on le leur demande.
Les frictions pratiques apparaissent à l'écran de retrait. Certaines plateformes refusent encore les destinations bc1p parce que leur validateur d'adresses comprend bech32 mais pas la constante plus récente. Votre portefeuille n'a alors rien d'anormal, et une adresse bc1q issue de la même phrase de récupération fait arriver les bitcoins dans le même portefeuille.
Bech32m vs P2TR
Bech32m est un encodage et P2TR un type de sortie, et ils coïncident aujourd'hui uniquement par un hasard du calendrier. Bech32m indique comment écrire sous forme de texte tout programme de témoin de version 1 ou supérieure. P2TR indique ce que signifie un programme de version 1 : une clé publique ajustée de 32 octets, dépensable par une signature Schnorr ou par la révélation d'un script. Toute adresse bech32m en circulation encode une sortie P2TR, mais cela cesse d'être vrai dès que la version de témoin 2 est attribuée à quoi que ce soit, puisque ces adresses seraient elles aussi en bech32m sans être Taproot.