Aller au contenu
buybitcoinsmart

Glossaire / Référence pour développeurs

Opcode

Aussi appelé Opcode de poussée de données, Opcode sans poussée de données.

Qu'est-ce qu'un opcode ?
Un opcode est un octet unique du langage Bitcoin Script qui indique à un nœud de validation quoi faire ensuite : soit empiler des données, soit effectuer une opération sur ce qui se trouve déjà dans la pile.

Bitcoin Script dispose d'un vocabulaire fixe de 256 valeurs d'octet possibles, réparties entre les opcodes qui poussent des données littérales et les opcodes qui agissent sur les données déjà poussées. Un script hérité peut exécuter au plus 201 opcodes agissants et ne peut pas dépasser 10 000 octets. Pour quiconque achète du bitcoin, ce petit vocabulaire explique pourquoi un portefeuille peut annoncer des frais avant de diffuser une transaction, et pourquoi le bitcoin n'offre aucune surface à des bugs de contrat qui s'emballent.

Comment cela fonctionne

Un nœud de validation lit un script un octet à la fois et recherche chaque octet dans une table fixe. Les valeurs 0x01 à 0x4b ne sont pas des instructions du tout : chacune dit que les N octets suivants sont des données littérales et appartiennent à la pile, ce qui explique qu'une clé publique compressée de 33 octets apparaisse dans un script sous la forme 0x21 suivi de la clé elle-même. Trois autres codes de poussée, OP_PUSHDATA1, OP_PUSHDATA2 et OP_PUSHDATA4, couvrent les éléments plus longs, et les valeurs 0x51 à 0x60 poussent les petits entiers 1 à 16 qui apparaissent dans les décomptes de quorum.

Tout ce qui est au-dessus de 0x60 effectue un travail plutôt que de porter des données, et ce sont ces opcodes que le bitcoin compte. Un script antérieur à Taproot peut en contenir au plus 201, ne détenir aucun élément de pile supérieur à 520 octets, ne pas garder plus de 1 000 éléments sur ses piles et ne pas dépasser 10 000 octets au total. Ces quatre chiffres proviennent de script.h dans Bitcoin Core, et les quatre sont des règles de consensus et non des préférences qu'un opérateur de nœud peut assouplir.

Quinze opcodes figurent dans la table mais sont morts. OP_CAT, OP_MUL, OP_LSHIFT et douze autres ont été désactivés en 2010 après un bug de plantage, et un script qui en contient un seul échoue, même dans une branche qui ne s'exécute jamais. Aucun n'a jamais été réactivé. Cette seule décision est la principale raison pour laquelle le langage de script du bitcoin est plus étroit que le mot « programmable » ne le laisse attendre.

Tapscript a réécrit la comptabilité des dépenses Taproot. Le BIP-342, actif depuis le bloc 709 632 en novembre 2021, a supprimé à la fois le plafond de 201 instructions et le plafond de taille de 10 000 octets, et les a remplacés par un budget de signatures : la transaction doit porter 50 unités de poids pour chaque signature que le script vérifie. Il a aussi transformé un bloc de valeurs d'octet non définies en codes OP_SUCCESS, de sorte qu'un script qui en contient un est valide sans être exécuté du tout. C'est une marge délibérée laissée pour de futures mises à niveau.

Pourquoi cela compte quand vous achetez du bitcoin

Les opcodes déterminent ce que coûte votre retrait. Une sortie héritée énonce quatre instructions actives autour d'un hachage de 20 octets en 25 octets ; l'équivalent natif SegWit est un octet de version et une poussée, soit 22 octets ; une sortie Taproot en fait 34. Parce que SegWit a déplacé le côté déverrouillage dans le witness à un quart du poids, dépenser une sortie bech32 prend environ 68 octets virtuels contre environ 148 pour la version héritée du même paiement. Choisir bech32 ou bech32m au moment du retrait, partout où la plateforme d'échange le propose, est à peu près la décision la moins coûteuse de ce glossaire.

Les opcodes déterminent aussi ce que votre appareil de signature peut réellement prendre en charge. Un portefeuille matériel qui ne reconnaît que les modèles standard à clé unique ne peut pas cosigner un coffre à verrouillage temporel ni une politique inhabituelle, donc si la planification successorale ou le multisig figure quelque part dans vos projets, vérifiez la prise en charge des scripts dans les avis avant d'acheter l'appareil plutôt qu'après que les bitcoins y sont déjà.

Cette étroitesse est une propriété de sécurité, pas une insuffisance. Il n'y a pas de boucles, aucun moyen de lire une autre transaction, et aucun état qui persiste entre les dépenses, de sorte que le mode de défaillance qui a vidé des milliards de dollars sur des chaînes programmables, un contrat se comportant correctement sur des entrées que son auteur n'a jamais envisagées, n'a nulle part où se produire. Les pertes en bitcoin viennent des plateformes d'échange, de l'hameçonnage et des sauvegardes perdues, pas d'un moteur de script qui se déclenche mal.

Exemple concret : le jour où OP_NOP2 est devenu contraignant

OP_NOP2 était l'octet 0xb1 et ne faisait absolument rien, l'un des dix no-ops numérotés laissés dans la table pour un usage ultérieur. Le BIP-65 lui a donné une tâche : confirmer que le locktime de la transaction est passé, et faire échouer le script sinon. L'application a commencé au bloc 388 381 le 14 décembre 2015, et l'opcode s'appelle depuis OP_CHECKLOCKTIMEVERIFY.

L'astuce est que les anciens logiciels voyaient toujours un octet qui ne fait rien, donc ils acceptaient toujours les nouvelles transactions comme valides. Seuls les nœuds mis à niveau appliquaient le verrouillage temporel. C'est cette asymétrie qui rend un soft fork doux, et la même voie a transformé OP_NOP3 en OP_CHECKSEQUENCEVERIFY au bloc 419 328 en juillet 2016. Huit emplacements de no-op réservés restent, ce qui représente l'essentiel de la marge de mise à niveau restante du bitcoin sous les règles antérieures à Taproot et une grande part de la raison pour laquelle tant d'attention de conception s'est déplacée vers les valeurs OP_SUCCESS créées par Tapscript.

Opcode vs Bitcoin Script

Bitcoin Script est le langage et un opcode est un mot de son vocabulaire. La distinction compte quand vous lisez des affirmations sur ce que le bitcoin peut ou ne peut pas faire, parce que presque toute proposition sérieuse de la dernière décennie a été une proposition de définir un nouvel opcode, pas de changer le langage qui l'entoure. OP_CHECKTEMPLATEVERIFY, OP_CAT et OP_CHECKSIGADD sont chacun un seul octet avec une seule tâche, et les débats publics sur les covenants ou les coffres sont des débats sur la question de savoir si un octet précis doit être autorisé à signifier quelque chose. La pile, les limites et l'absence de boucles restent exactement tels quels quand un nouvel opcode arrive.

À ne pas confondre avec

Questions fréquentes

Le bitcoin peut-il exécuter des contrats intelligents comme Ethereum ?

Non, et c'est voulu. Bitcoin Script n'a ni boucles, ni stockage persistant entre les transactions, et quinze de ses opcodes arithmétiques et de chaîne de caractères sont désactivés depuis 2010, si bien qu'un script ne peut répondre que oui ou non à une condition de dépense fixe.

Faut-il comprendre les opcodes pour acheter ou conserver du bitcoin ?

Non. Les portefeuilles assemblent les scripts à votre place. Les opcodes ne deviennent utiles à connaître que lorsque vous choisissez un format d'adresse au moment du retrait ou que vous mettez en place une configuration multisig, car ces deux décisions changent les opcodes exécutés et le coût de la dépense en frais.

Comment le bitcoin ajoute-t-il un nouvel opcode sans diviser la chaîne ?

En redéfinissant un octet que les anciens nœuds ignorent déjà. OP_NOP2 et OP_NOP3 sont ainsi devenus les deux opcodes de verrouillage temporel en 2015 et 2016, et Tapscript a réservé un nouveau bloc de valeurs OP_SUCCESS en 2021 dans le même but.

À lire ensuite

Termes associés

Plus de termes : Référence pour développeurs

Lire cette page en anglais