SIGHASH_ALL
SIGHASH_ALL est le flag par défaut : la signature couvre tous les inputs et outputs. Garantit l'intégrité maximale. Standard pour 99 % des transactions.
Définition
SIGHASH_ALL est le flag de signature par défaut dans Bitcoin. Il indique que la signature s'engage sur tous les inputs et tous les outputs de la transaction. Modifier n'importe quoi dans la transaction (un montant, une adresse, un input ajouté) invalide la signature. C'est la garantie la plus stricte possible et le choix retenu pour 99 % des transactions du réseau.
Mécanique
Lors de la signature, le wallet calcule un hash spécial appelé "sighash". Pour SIGHASH_ALL :
- Sérialiser tous les inputs (sans leurs signatures).
- Sérialiser tous les outputs.
- Sérialiser le scriptPubKey de l'input en cours de signature.
- Calculer SHA256(SHA256(le tout)).
- Signer ce hash avec ECDSA ou Schnorr.
À la validation, le nœud refait le même calcul. Toute modification reproduit un sighash différent, donc la signature ne vérifie plus.
Encodage du flag
Le flag est encodé sur 1 octet, ajouté à la fin de la signature DER (ou directement après la signature Schnorr pour Taproot).
| Valeur | Constante | |--------|-----------| | 0x01 | SIGHASH_ALL | | 0x02 | SIGHASH_NONE | | 0x03 | SIGHASH_SINGLE | | 0x80 | SIGHASH_ANYONECANPAY (flag combinable) |
SIGHASH_ALL est la valeur 0x01, et c'est aussi la valeur implicite pour Taproot key-path (où l'absence d'octet signifie ALL).
Autres flags
| Flag | Couvre | Cas d'usage | |------|--------|--------------| | SIGHASH_ALL | Tous inputs + tous outputs | Transaction normale | | SIGHASH_NONE | Tous inputs, aucun output | "Je signe tant que je dépense, peu m'importe la destination" | | SIGHASH_SINGLE | Tous inputs, output au même index | Atomic swaps simples, contributions partielles | | ANYONECANPAY (combinable) | Seulement cet input | Crowdfunding | | SIGHASH_DEFAULT (Taproot) | Équivalent à ALL implicite | Default Taproot | | SIGHASH_ANYPREVOUT (APO) | Pas d'input précis | Eltoo Lightning |
Pourquoi le défaut
SIGHASH_ALL est le défaut parce qu'il :
- Protège contre la malléabilité maximale : aucune modification post-signature n'est possible.
- Est simple à raisonner : "ma signature autorise exactement cette transaction, rien d'autre".
- Évite les bugs : les autres flags ont des subtilités (SINGLE bug, NONE risque).
- Compose bien avec multisig : tous les signataires s'engagent sur la même chose.
Le piège SIGHASH_SINGLE
SIGHASH_SINGLE a historiquement souffert d'un bug : si on signe un input à un index supérieur au nombre d'outputs, le hash signé est 0x01...01 (uint256 valant 1), ce qui peut être exploité. La leçon : ne pas inventer des flags rares sans raison forte.
SegWit et Taproot
Avec SegWit (BIP-143) et Taproot (BIP-341), le calcul du sighash a été repensé pour :
- Performance : pré-calculer des midstate hashes réutilisables (O(n) au lieu de O(n²)).
- Sécurité : commit explicitement aux montants des inputs (prevent fee sniping).
- Extensibilité : nouveaux flags (DEFAULT, ANYPREVOUT) possibles sans soft fork majeur.
À retenir
SIGHASH_ALL est le contrat de signature le plus strict de Bitcoin : "je signe cette transaction et seulement celle-là". Sa simplicité en fait le défaut universel, et son omniprésence garantit que la moindre modification d'une tx signée invalide la signature et la rend rejetée par le réseau.
Termes lies
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.