Glossaire / Référence pour développeurs
Script de signature
Aussi appelé scriptSig, Script de déverrouillage.
- Qu'est-ce qu'un script de signature ?
- Un script de signature est l'ensemble des données de déverrouillage qu'une entrée transporte pour satisfaire le script de clé publique de la sortie qu'elle dépense, et sur les entrées SegWit modernes il est vide.
Chaque entrée d'une transaction pointe vers une sortie antérieure et doit prouver qu'elle est autorisée à la dépenser. Bitcoin Core donne à ce champ le nom de scriptSig ; sur une entrée héritée pay-to-public-key-hash, il contient une signature de 71 ou 72 octets et une clé publique de 33 octets, soit environ 107 octets. Depuis SegWit, cette preuve se trouve généralement ailleurs, ce qui explique en grande partie qu'un retrait bech32 vous coûte moins cher.
Comment cela fonctionne
Le script de signature s'exécute en premier et laisse ses résultats sur la pile pour que le script de la sortie les consomme. Les deux ne s'exécutent pas comme un seul programme joint : ils sont exécutés à la suite, la pile étant transmise de l'un à l'autre, une séparation introduite en 2010 après que la conception d'origine s'est révélée exploitable.
La politique de relais exige que ce champ ne contienne rien d'autre que des poussées de données. Aucun conditionnel, aucun calcul arithmétique, aucun opcode qui effectue un travail. Cette restriction existe parce que la partie qui dépense contrôle entièrement ces octets, et laisser un attaquant exécuter de la logique à l'entrée rouvre des problèmes que le réseau a clos depuis longtemps. Pay-to-script-hash fait de cette règle une exigence de consensus plutôt qu'une préférence, puisque le script de rachat doit arriver comme la dernière poussée simple.
Sa taille dépend entièrement de ce qu'il déverrouille. Une entrée héritée à clé unique transporte une signature et une clé. Une entrée SegWit imbriquée transporte exactement 23 octets, une seule poussée du programme témoin de 22 octets, et pousse tout le reste dans le témoin. Une entrée native bech32 ou bech32m ne transporte rien du tout : le champ sérialisé est un seul octet indiquant une longueur nulle.
Il existe une entrée dont le script de signature ne prouve rien. L'unique entrée d'une transaction coinbase n'a aucune sortie antérieure à déverrouiller, le champ est donc réaffecté comme espace libre entre 2 et 100 octets, et depuis le BIP-34 il doit commencer par la hauteur du bloc. Les mineurs y ont inscrit des messages, des votes et des plaisanteries depuis 2009.
Où le voit-on
Décodez n'importe quelle transaction et chaque entrée affiche un objet scriptSig avec une vue assembleur et une vue hexadécimale. Sur une entrée native SegWit ou Taproot, les deux sont des chaînes vides tandis qu'un champ témoin distinct contient les données, et cette asymétrie visuelle est le moyen le plus rapide de voir d'un coup d'œil quel format d'adresse utilisait une ancienne transaction.
Cela explique aussi un épisode historique souvent mal interprété. Parce que le scriptSig était couvert par l'identifiant de transaction, un tiers pouvait réencoder une signature sans l'invalider et modifier l'identifiant d'une transaction déjà diffusée. Mt. Gox a suspendu les retraits en février 2014 et a imputé cela précisément à ce comportement, bien que l'analyse universitaire ultérieure de la chaîne ait constaté que le volume de transactions altérées était bien trop faible pour expliquer les bitcoins manquants. SegWit a mis fin au débat en août 2017 en sortant entièrement les données de déverrouillage du calcul de l'identifiant.
Script de signature vs données témoin
Un script de signature et des données témoin transportent tous deux le même type de preuve, et SegWit a transféré cette tâche de l'un à l'autre sans changer ce que signifie une signature. Les différences qui comptent pour vous sont le prix et la permanence. Les octets témoin sont facturés à une unité de poids chacun tandis que les octets de script de signature coûtent quatre, de sorte qu'une dépense identique à clé unique représente environ 148 octets virtuels lorsque la preuve voyage dans le scriptSig et environ 68 lorsqu'elle voyage dans le témoin. Les données témoin se situent aussi en dehors de l'identifiant de transaction, une dépense ne peut donc pas voir son identifiant modifié en cours de route. Une entrée héritée utilise encore l'ancien champ, ce qui explique que des bitcoins stationnés sur une adresse commençant par 1 coûtent discrètement plus cher à déplacer chaque fois que vous les déplacez.