Aller au contenu principal
Script

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_MUL dé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

← Retour au glossaire complet

Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.