ScriptWitness
Le scriptWitness contient les données de déverrouillage des inputs SegWit. Stocké en dehors du scriptSig, il bénéficie du discount de poids. Pour P2WSH, il inclut signatures et witnessScript. Introduit par SegWit (BIP-141).
Définition
Le scriptWitness (ou simplement "witness") est la structure de données qui contient les signatures et autres preuves de dépense pour les inputs SegWit. Introduit par BIP-141 et activé en août 2017, il remplace fonctionnellement le scriptSig pour les nouveaux templates (P2WPKH, P2WSH, P2TR) tout en étant stocké séparément dans la sérialisation de la transaction.
Structure
Pour chaque input d'une transaction SegWit, on a un "witness stack" : une liste de blobs binaires.
| Template | Contenu du witness stack |
|----------|---------------------------|
| P2WPKH | [signature, pubkey] |
| P2WSH | [push1, push2, ..., witnessScript] |
| P2TR (key-path) | [signature] (1 élément, 64 octets) |
| P2TR (script-path) | [args..., script, control block] |
C'est volontairement très proche du modèle scriptSig pré-SegWit, ce qui a facilité la transition des outils.
Pourquoi cette séparation
Trois objectifs principaux :
- Corriger la malléabilité : le witness n'entre pas dans le calcul du txid, donc un tiers ne peut plus modifier les signatures pour changer le txid sans invalider la transaction.
- Activer le discount : le poids du witness compte pour 1 vWB au lieu de 4, ce qui rend les transactions SegWit moins chères en frais (effective ~75 % du poids brut).
- Permettre des upgrades futurs : la version du witness (0 pour SegWit v0, 1 pour Taproot) permet d'ajouter de nouveaux scripts sans soft fork majeur, simplement en réservant une nouvelle valeur de witness version.
Le witness program et le witnessScript
Pour P2WSH, le scriptPubKey est OP_0 <sha256(witnessScript)>. Le witnessScript lui-même est le programme complet (analogue au redeemScript de P2SH), poussé en dernier élément du witness stack lors de la dépense.
Pour P2WPKH, c'est plus simple : le hash160 dans le scriptPubKey identifie une pubkey, et le witness fournit signature + pubkey, sans witnessScript.
Taproot (SegWit v1)
Avec Taproot, le witness évolue :
- Key-path : 1 seul élément, signature Schnorr de 64 octets (ou 65 avec sighash byte). C'est la dépense la plus compacte de toute l'histoire de Bitcoin.
- Script-path : arguments + script + control block (qui contient la Merkle proof du script dans le tree).
- Annex : nouveau champ optionnel pour des extensions futures.
Discount de poids
Le poids d'une transaction se calcule comme :
weight = 3 × base_size + total_size
où base_size exclut le witness et total_size l'inclut. Cela donne au witness un facteur 1 (au lieu de 4) dans le calcul des frais : un input SegWit paye environ 4× moins cher qu'un input legacy pour la même portion "signatures".
À retenir
Le scriptWitness est l'innovation centrale de SegWit : elle résout la malléabilité, réduit les frais via le discount, et ouvre la porte aux évolutions futures comme Taproot. Comprendre sa structure, c'est comprendre 80 % de la mécanique de validation moderne de Bitcoin.
Termes lies
- SegWit (Segregated Witness)SegWit, activé en août 2017, sépare la donnée witness du reste de la transaction. Cela résout la malléabilité, augmente la capacité effective des blocs et active Lightning. Soft fork emblématique issu de la Blocksize War. Existe en V0 (P2WPKH/P2WSH) et V1 (Taproot).
- ScriptSigLe scriptSig est le script de déverrouillage fourni par l'input qui dépense une UTXO. Pour P2PKH, il contient signature et clé publique. Avec SegWit, son rôle est repris par scriptWitness. Doit produire « true » avec scriptPubKey lors de la validation.
- Weight Unit (WU)Le Weight Unit est l'unité de poids des transactions Bitcoin (1 vB = 4 WU). Un bloc fait au plus 4 000 000 WU. Permet de comptabiliser les discounts SegWit (witness comptée 1 WU/byte). Standard depuis SegWit (BIP-141).
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.