Clé publique compressée
Une clé publique compressée stocke uniquement la coordonnée x et un préfixe indiquant la parité de y. Elle fait 33 octets au lieu de 65. Standard depuis 2014, elle réduit la taille des transactions. Toutes les clés modernes sont compressées.
Le contexte historique
Aux premiers jours de Bitcoin, les clés publiques étaient stockées au format non compressé : préfixe 0x04 suivi des deux coordonnées x et y de 32 octets chacune, soit 65 octets au total. C'est le format SEC1 standard. Mais Bitcoin n'a pas besoin de stocker y : à partir de x et de la courbe secp256k1, il n'y a que deux valeurs possibles pour y (positive ou négative modulo p).
Principe de compression
| Élément | Valeur |
|---------|--------|
| x | 32 octets (coordonnée abscisse) |
| Préfixe | 1 octet |
| → 0x02 | y est pair |
| → 0x03 | y est impair |
| Total | 33 octets |
Avec un seul bit (la parité de y), on retrouve y unique à partir de x via l'équation de la courbe y² = x³ + 7. L'économie est de 32 octets par clé, soit ~50 % de taille.
Gains réels en transaction
Une signature ECDSA sur Bitcoin inclut la clé publique. Une transaction P2PKH classique « payée à l'adresse » consomme ~110 vBytes avec clé compressée vs ~140 vBytes en non compressé. Sur une blockchain limitée par MB par bloc, cela permet plus de transactions par bloc et réduit les frais de chaque transaction.
| Type d'adresse | Pubkey embarquée | Taille | |----------------|-------------------|--------| | 1... (legacy non compressé) | 65 octets | + | | 1... (legacy compressé) | 33 octets | − 32 | | bc1q... (SegWit) | 33 octets | + segwit discount | | bc1p... (Taproot) | 32 octets (x-only) | − 33 % vs SegWit |
Adoption et standardisation
Les clés compressées existent depuis 2009 (le format est standard SEC1) mais le wallet de Satoshi utilisait du non compressé. Bitcoin Core 0.6 (mars 2012) introduit le support, et Bitcoin Core 0.7 (sept 2012) fait des clés compressées le défaut pour les nouvelles adresses. Depuis 2014, l'écosystème entier les utilise. Les wallets qui ne supportent que des clés non compressées sont aujourd'hui de pures curiosités.
Calcul de y à partir de x
# Pseudocode y_squared = (x**3 + 7) mod p y = modular_sqrt(y_squared, p) if y is even: use y if prefix == 0x02 else use p - y else: use y if prefix == 0x03 else use p - y
Le calcul de la racine carrée modulaire utilise l'algorithme Tonelli-Shanks, mais comme p ≡ 3 mod 4 pour secp256k1, on peut prendre y = y_squared^((p+1)/4) mod p directement.
Taproot va plus loin : x-only
Taproot (BIP-340/341, activé en novembre 2021) introduit le format x-only : on ne stocke même plus le bit de parité, on suppose y pair par convention. La clé fait alors 32 octets exactement, et la signature Schnorr accompagnante 64 octets. C'est l'étape suivante de la compression, qui économise encore un octet partout dans le protocole.
À retenir
Les clés publiques compressées sont l'optimisation invisible qui a doublé l'efficacité de Bitcoin en 2012. Avec Taproot et les pubkeys x-only, on a presque atteint le minimum théorique. Quand vous lisez une clé moderne commençant par 02 ou 03, vous savez désormais ce que ce préfixe signifie.
Termes lies
- Clé publiqueLa clé publique est dérivée de la clé privée par multiplication scalaire sur la courbe secp256k1. Elle peut être partagée sans risque pour recevoir des fonds. À partir d'elle, on calcule l'adresse Bitcoin. Elle ne révèle jamais la clé privée correspondante.
- secp256k1secp256k1 est la courbe elliptique spécifique utilisée par Bitcoin. Elle est définie sur un corps fini de 256 bits et offre une excellente sécurité (~128 bits). Elle a été préférée à secp256r1 (NIST P-256) car ses paramètres ne sont pas générés par un acteur étatique. Toutes les clés Bitcoin vivent sur cette courbe.
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.