Glossaire / Référence pour développeurs
Bitcoin Script
Aussi appelé Script.
- Qu'est-ce que Bitcoin Script ?
- Bitcoin Script est le petit langage à pile que porte chaque sortie de bitcoin, qui fixe les conditions à remplir avant que ces bitcoins puissent être dépensés à nouveau.
Les bitcoins ne sont pas envoyés à des personnes. Ils sont verrouillés derrière un court programme, et les dépenser signifie fournir les données qui font que le programme se termine avec une valeur vraie au sommet de la pile. Le langage n'a ni boucles ni récursion, et un script hérité s'arrête à 10 000 octets et 201 opérations, de sorte qu'un validateur sait toujours que le travail prendra fin. C'est pourquoi le bitcoin n'a jamais connu de contrat qui s'emballe.
Comment cela fonctionne
Bitcoin Script est une machine à pile qui lit de gauche à droite et ne fait rien d'autre.
Les poussées de données vont sur une pile ; les opérations retirent leurs arguments de cette pile et y replacent leurs résultats. Il n'y a pas de variables, pas de sauts en arrière et aucun moyen de lire quoi que ce soit en dehors de la transaction en cours de validation. Un script réussit lorsque l'exécution se termine sans erreur et laisse une valeur vraie au sommet.
Deux morceaux se rencontrent au moment de la dépense. La sortie dépensée porte le verrou, appelé script de clé publique. L'entrée qui la dépense porte la preuve, appelée script de signature pour les sorties plus anciennes ou témoin pour les sorties segwit. Ils s'exécutent en séquence avec la pile conservée entre eux, jamais concaténés en un seul programme, une séparation introduite très tôt une fois devenu évident qu'un dépenseur capable d'injecter des opérateurs du côté du verrou pouvait réécrire les conditions.
Le script le plus courant de l'histoire du bitcoin mérite d'être lu en entier. Une sortie pay-to-public-key-hash contient OP_DUP, OP_HASH160, un hash de 20 octets, OP_EQUALVERIFY et OP_CHECKSIG. Le dépenseur fournit une signature et une clé publique. L'exécution pousse les deux, duplique la clé publique, hache la copie sur 20 octets, pousse le hash attendu, compare les deux et abandonne s'ils diffèrent, puis vérifie la signature par rapport à une sérialisation de la transaction elle-même. Six étapes, et toute la sécurité d'une adresse héritée repose sur elles.
Les limites sont délibérées et précises. Un script hérité ou P2SH ne peut pas dépasser 10 000 octets ni 201 opérations de non-poussée. Aucun élément individuel de la pile ne peut dépasser 520 octets. La pile ne peut pas contenir plus de 1 000 éléments. Un OP_CHECKMULTISIG ne peut pas nommer plus de 20 clés publiques. Chaque plafond existe pour que le coût de validation d'un bloc reste borné quoi que n'importe qui écrive.
Le langage s'est étendu deux fois, en donnant un sens réel à des codes sans opération réservés. Le BIP65 a défini OP_CHECKLOCKTIMEVERIFY en décembre 2015, permettant à une sortie de refuser de bouger avant une heure ou une hauteur donnée. Le BIP112 a fait de même pour OP_CHECKSEQUENCEVERIFY, actif à partir du bloc 419 328 en juillet 2016, ajoutant des verrous temporels relatifs mesurés depuis le moment où les bitcoins ont été confirmés. Ces deux opcodes sont la raison pour laquelle les canaux Lightning, le séquestre avec échéance et les schémas de succession à verrou temporel peuvent exister.
Pourquoi cela compte quand vous achetez du bitcoin
L'adresse vers laquelle vous retirez est un type de script, et ce choix se retrouve sur vos frais suivants.
Dépenser une entrée héritée pay-to-public-key-hash coûte environ 148 octets virtuels. Dépenser une entrée segwit native coûte environ 68, parce que la remise sur les témoins introduite par le BIP141 facture les données de témoin à un quart du tarif, et qu'une dépense taproot par chemin de clé est plus petite encore. À un tarif de 20 sat/vB, cet écart représente la majeure partie du coût d'un petit retrait, répété chaque fois que vous déplacez des bitcoins. Lorsqu'une plateforme d'échange vous laisse choisir le format d'adresse vers lequel vous retirez, choisir le format moderne est une remise permanente.
Script est aussi ce qu'est réellement un coffre multisig. Un arrangement 2-sur-3 est un script nommant trois clés publiques et exigeant deux signatures, et la question de savoir si un appareil donné peut en afficher et en signer un honnêtement est traitée directement dans nos avis sur les portefeuilles matériels. Il en va de même pour tout plan de succession bâti sur un verrou temporel : les bitcoins ne sont récupérables que si quelqu'un possède encore le script, et c'est pourquoi les descripteurs de sortie, la recette en texte clair pour le reconstruire, doivent figurer dans votre sauvegarde aux côtés de la phrase de récupération.
Un avertissement pratique. Lorsqu'une plateforme refuse d'envoyer vers une adresse que vous avez collée, la cause est presque toujours que son code de retrait ne peut pas construire ce type de script, et non que votre adresse est fausse. Testez tout format d'adresse inconnu avec un petit montant avant de déplacer un solde auquel vous tenez.
Le bug de 184 milliards de bitcoins et les opcodes que Satoshi a désactivés
Le 15 août 2010, le bloc 74 638 contenait une transaction qui créait 184 467 440 737,09551616 bitcoins, répartis en deux sorties d'environ 92,2 milliards chacune.
La vérification que les sorties d'une transaction ne dépassaient pas ses entrées utilisait une arithmétique signée à largeur fixe, et des sorties assez grandes pour faire déborder cette arithmétique se totalisaient en un nombre négatif, de sorte que le test passait. Un client corrigé est apparu en environ cinq heures, et la chaîne honnête a dépassé la mauvaise à la hauteur 74 691. Ces bitcoins n'ont jamais existé sur la chaîne que tout le monde utilise.
Cet épisode, avec une famille de bugs apparentés dans les opérations sur les chaînes de caractères et l'arithmétique, explique pourquoi quinze opcodes sont définitivement désactivés : OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT et OP_RSHIFT. Une transaction dont le script contient ne serait-ce qu'un d'entre eux est invalide, exécuté ou non. La désactivation était un instrument brutal appliqué sous pression, et en défaire une partie est un travail en cours : le BIP347 propose de rétablir OP_CAT dans le tapscript, où les limites plus récentes le rendent bien plus difficile à détourner.
Bitcoin Script vs tapscript
Le tapscript est Bitcoin Script avec le règlement redessiné, et il ne s'applique qu'à l'intérieur d'une dépense taproot par chemin de script. Le BIP342 a supprimé à la fois le plafond de taille de script de 10 000 octets et le plafond de 201 opérations, désactivé OP_CHECKMULTISIG et OP_CHECKMULTISIGVERIFY, et ajouté OP_CHECKSIGADD à leur place pour que les politiques multisignature puissent être vérifiées par lots. Les vérifications de signature sont mesurées plutôt que comptées : chaque entrée reçoit un budget de 50 plus la taille sérialisée de son témoin, et chaque vérification de signature exécutée en consomme 50. Même machine à pile, comptabilité différente.
Bitcoin Script vs un script de clé publique
Bitcoin Script est le langage ; un script de clé publique est un programme écrit dans ce langage. Une sortie contient un script de clé publique, qui est le verrou. L'entrée qui la dépense contient un script de signature ou un témoin, qui est la clé. Les deux sont du Bitcoin Script, et appeler l'un ou l'autre simplement « le script » est la source de confusion la plus courante lorsqu'on lit une transaction brute, parce que les deux moitiés sont évaluées séparément et qu'une seule d'entre elles était engagée au moment de la réception des bitcoins.