Script (Bitcoin Script)
Bitcoin Script est le langage de programmation des conditions de dépense. C'est un langage de pile, intentionnellement non-Turing-complet pour la sécurité. Il permet multisig, timelocks, contrats. Tapscript étend ses possibilités avec Taproot.
Origine
Bitcoin Script est le langage de programmation embarqué inventé par Satoshi Nakamoto pour exprimer les conditions de dépense de chaque UTXO. Présent dès le bloc genèse en janvier 2009, c'est un langage minimaliste : pas de variables, pas de boucles, juste une pile et des opcodes. Cette austérité est volontaire : elle garantit que l'exécution termine toujours en temps borné et que la validation est trivialement prouvable.
Comment ça marche
L'évaluation utilise une simple pile (stack) :
- Les éléments du scriptSig (ou witness) sont poussés sur la pile.
- Le scriptPubKey est exécuté à la suite.
- À la fin, la pile doit contenir une valeur "true" pour que la dépense soit valide.
Exemple P2PKH :
scriptSig: <signature> <pubkey>
scriptPubKey: OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG
L'évaluation duplique la pubkey, la hash, compare au hash attendu, et vérifie la signature contre cette pubkey.
Catégories d'opcodes
| Catégorie | Exemples | |-----------|----------| | Constantes | OP_0, OP_1...OP_16, OP_PUSHDATA | | Flux | OP_IF, OP_ELSE, OP_ENDIF, OP_RETURN | | Stack | OP_DUP, OP_DROP, OP_SWAP | | Bitwise | OP_EQUAL, OP_EQUALVERIFY | | Arithmétique | OP_ADD, OP_SUB, OP_MIN | | Hash | OP_SHA256, OP_HASH160, OP_HASH256 | | Signature | OP_CHECKSIG, OP_CHECKMULTISIG, OP_CHECKSIGADD | | Timelock | OP_CHECKLOCKTIMEVERIFY (CLTV), OP_CHECKSEQUENCEVERIFY (CSV) |
Plusieurs opcodes initialement présents ont été désactivés par Satoshi en 2010 (OP_CAT, OP_MUL, OP_DIV...) suite à des failles de sécurité. Leur réactivation est un sujet de débat actuel.
Pourquoi non-Turing-complet
L'absence de boucles et de récursion garantit qu'aucun script ne peut tourner indéfiniment. Cela élimine d'emblée :
- Le risque d'attaque par DoS via boucles infinies.
- Le besoin d'un système de "gas" comme Ethereum.
- Les bugs de réentrance et autres pièges des langages riches.
Le prix : une expressivité plus limitée, qui exige de la créativité pour implémenter des contrats complexes (HTLC, multisig à seuil, oracles).
Évolutions notables
- 2012 - BIP-16 : P2SH, hash de redeemScript.
- 2015 - BIP-65 : OP_CLTV (absolute timelock).
- 2016 - BIP-112 : OP_CSV (relative timelock).
- 2017 - BIP-141 : SegWit, séparation du witness.
- 2021 - BIP-341/342 : Taproot et Tapscript, Schnorr, OP_CHECKSIGADD.
À retenir
Bitcoin Script est l'antithèse délibérée d'Ethereum : un langage minimal, sûr, prévisible. Il monte en complexité par couches (P2SH, SegWit, Taproot/Tapscript), mais ne franchira jamais la frontière du Turing-complet. C'est l'un des choix de design les plus conservateurs et les plus défendus de Bitcoin.
Termes lies
- ScriptPubKeyLe scriptPubKey est le script de verrouillage d'une UTXO. Il définit les conditions à satisfaire pour la dépenser (signature, hash, etc.). Tout output Bitcoin a un scriptPubKey. C'est la pièce centrale du modèle UTXO.
- 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.
- TapscriptTapscript est le langage de script de Taproot, mis à jour pour Schnorr et plus extensible. Permet d'inscrire plusieurs scripts dans un MAST avec révélation sélective. Active OP_CHECKSIGADD, supprime OP_CHECKMULTISIG. Base technique des contrats Bitcoin modernes.
- MiniscriptMiniscript est une représentation de Bitcoin Script lisible et composable. Permet d'écrire des politiques complexes (multisig avec timelock, etc.) sûrement. Implémenté par Liana, Bitcoin Core, BDK. Démocratise les scripts avancés.
- OpcodesLes opcodes sont les opérations du langage Bitcoin Script (OP_CHECKSIG, OP_DUP, OP_HASH160...). Chaque transaction est une succession d'opcodes interprétés sur une pile. Certains sont désactivés pour des raisons de sécurité. La liste évolue lentement par soft fork.
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.