Glossaire / Référence pour développeurs
Script de clé publique
Aussi appelé scriptPubKey, Script de verrouillage, Pubkey script.
- Qu'est-ce que le script de clé publique ?
- Le script de clé publique est le court fragment de Bitcoin Script attaché à chaque sortie de transaction, qui énonce les conditions à remplir avant que les bitcoins de cette sortie puissent à nouveau être déplacés.
Les bitcoins ne sont pas détenus dans une adresse ; ils se trouvent dans des sorties, chacune gardée par un script de clé publique. Bitcoin Core nomme ce champ scriptPubKey, et pour une sortie moderne ordinaire il mesure 22 ou 34 octets. Quand vous donnez une adresse à quelqu'un, vous lui remettez la recette du script de clé publique que son portefeuille écrira.
Comment cela fonctionne
Chaque sortie d'une transaction sérialisée est trois choses à la suite : huit octets de valeur en satoshis, un préfixe de longueur, et le script de clé publique lui-même. Rien dans la sortie ne nomme un destinataire. Le script est le destinataire, et une adresse n'est qu'un encodage avec somme de contrôle de la poignée d'octets qu'il contient.
Cinq modèles représentent la quasi-totalité de ce qui se trouve aujourd'hui sur la chaîne. Un verrou legacy pay-to-public-key-hash fait 25 octets et nomme quatre opcodes autour d'un hash de 20 octets. Un verrou pay-to-script-hash fait 23 octets et se termine par OP_EQUAL. Le SegWit natif est volontairement plus simple en comparaison : un octet de version suivi d'un seul push, 22 octets pour une clé unique et 34 octets pour un hash de script, sans aucune logique dans la sortie. Taproot fait aussi 34 octets, un octet de version et une clé de 32 octets.
La politique de relais reconnaît cette courte liste et refuse de transmettre tout le reste, ce qui explique pourquoi vous ne pouvez pas inventer votre propre format de sortie et espérer qu'un portefeuille le paie. Le consensus est ici plus permissif que la politique, mais l'effet pratique est que les cinq modèles constituent tout le menu.
Le nom est un fossile. Dans les toutes premières transactions, le script contenait réellement une clé publique : la sortie coinbase du bloc de genèse fait 67 octets et contient une clé non compressée de 65 octets suivie de OP_CHECKSIG, et vous pouvez le lire dans le code source de Bitcoin Core lui-même. Payer un hash plutôt qu'une clé est devenu la norme en 2011, et aujourd'hui la plupart des scripts de clé publique ne contiennent aucune clé publique, seulement un engagement envers l'une d'elles.
Où le voit-on
Demandez à n'importe quel nœud de décoder une transaction brute et chaque sortie porte un objet scriptPubKey avec quatre champs : l'assembly lisible par un humain, le hex brut, la chaîne de type, et l'adresse à laquelle ce type correspond. Les explorateurs de blocs montrent la même chose, souvent renommée script de verrouillage ou script de sortie.
C'est aussi là que réside la configuration en lecture seule d'un portefeuille. Importer une adresse revient à indiquer à votre logiciel quels scripts de clé publique parcourir sur la chaîne, ce qui explique pourquoi un descripteur, une définition qui génère toute la famille de scripts qu'une clé peut produire, a remplacé l'import adresse par adresse dans les outils sérieux.
La compétence de lecture pratique est courte. Si le script commence par 0 et contient 20 octets, quelqu'un le dépensera avec une signature et une entrée peu coûteuse. S'il contient 32 octets, il y a derrière un contrat que vous ne pouvez pas voir. S'il commence par 1 et contient 32 octets, c'est du Taproot et il peut s'agir d'une clé unique ou de tout un arbre de conditions sous le même visage.
Script de clé publique vs script de signature
Le script de clé publique pose la question et le script de signature tente d'y répondre, et ils sont écrits par des personnes différentes à des moments différents. Celui qui vous envoie de l'argent écrit le script de clé publique, à partir de l'adresse que vous lui avez donnée, et paie pour ses octets. Vous écrivez le script de signature plus tard, au moment de dépenser, et payez vous-même pour ces octets. C'est pourquoi envoyer vers une adresse Taproot coûte un peu plus cher à l'expéditeur qu'envoyer vers une adresse legacy, tout en vous faisant économiser nettement plus lorsque vous déplacez finalement les bitcoins. Les deux scripts s'exécutent aussi séparément plutôt que comme un seul programme joint, un changement apporté en 2010 après que l'exécution combinée d'origine s'est révélée exploitable.