Pile (stack)
La pile est la structure LIFO sur laquelle Bitcoin Script opère. Les données et résultats y sont empilés/dépilés par les opcodes. Une exécution réussie laisse « true » au sommet. Architecture proche du Forth.
Définition
En informatique, une pile (en anglais stack) est une structure de données suivant le principe LIFO (Last In, First Out) : le dernier élément ajouté est le premier retiré. C'est l'unique structure de travail du Bitcoin Script, le langage qui exprime les conditions de dépense des UTXOs.
Cette simplicité est volontaire : un langage à pile est facile à valider, déterministe, et ne permet pas de boucles infinies par construction.
Inspiré du Forth
Bitcoin Script s'inspire directement du langage Forth, créé dans les années 1970 par Charles H. Moore. Comme Forth :
- Les données se poussent sur la pile.
- Les opérations (opcodes) consomment des données de la pile et en produisent.
- L'exécution est strictement linéaire (pas de variables nommées, pas de fonctions).
- Le programme s'écrit en notation postfixée (RPN).
Exemple : un P2PKH simple
scriptSig (donné par le dépensier) :
<signature> <pubkey>
scriptPubKey (verrou de l'output) :
OP_DUP OP_HASH160 <pubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
Exécution combinée, étape par étape :
| Étape | Opcode | État de la pile (haut à droite) |
|-------|--------|--------------------------------|
| 1 | (push sig) | [sig] |
| 2 | (push pubkey) | [sig, pubkey] |
| 3 | OP_DUP | [sig, pubkey, pubkey] |
| 4 | OP_HASH160 | [sig, pubkey, hashPubkey] |
| 5 | (push pubkeyHash) | [sig, pubkey, hashPubkey, pubkeyHash] |
| 6 | OP_EQUALVERIFY | [sig, pubkey] (vérifie l'égalité) |
| 7 | OP_CHECKSIG | [true] |
Si à la fin la pile contient true au sommet, la transaction est valide.
Règles de validité
Une exécution Bitcoin Script est valide si et seulement si :
- Aucun opcode désactivé n'est rencontré.
- Aucun dépassement de pile (max 1 000 éléments).
- Aucun élément ne dépasse 520 octets (avant Tapscript).
- À la fin, le sommet de la pile vaut true (≠ 0 et ≠ vide).
Une seconde pile : l'altstack
Bitcoin Script dispose aussi d'une pile auxiliaire appelée altstack. Elle sert à parquer temporairement des valeurs hors de la pile principale, via les opcodes OP_TOALTSTACK et OP_FROMALTSTACK. Utile pour les scripts complexes (multisig avec timelock par exemple).
Limites historiques
Le langage Script a plusieurs limites volontaires :
- Pas de boucles → impossible de bloquer un nœud.
- Pas d'opérations arithmétiques étendues (
OP_MULdésactivé). - Taille des éléments limitée.
- Pas de récursivité.
Ces restrictions garantissent qu'une transaction se valide en temps polynomial borné.
Évolutions modernes
Tapscript, introduit avec Taproot en 2021, modernise le modèle :
- Élargissement de la taille des éléments.
- Réactivation de certaines opérations arithmétiques.
- Nouvelles opcodes (
OP_CHECKSIGADD). - Préparation à d'éventuels
OP_CTV,OP_VAULT.
La pile reste l'unique structure de calcul, fidèle à l'esprit Forth.
À retenir
La pile est l'élégance brutaliste de Bitcoin Script : pas de variables, pas de fonctions, pas de mémoire évoluée. Juste une succession de pushs et pops qui décident si une transaction peut dépenser un UTXO. Cette austérité est ce qui rend la validation déterministe et la sécurité auditable.
Termes lies
- 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.
- 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.
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.