Aller au contenu
buybitcoinsmart

Glossaire / Protocole et mises à jour

OP_CAT

Qu'est-ce qu'OP_CAT ?
OP_CAT joint les deux éléments du sommet de la pile de script en un seul, une opération que Satoshi a désactivée en 2010 et que le BIP-347 propose de rétablir dans tapscript.

Spécifié dans BIP-347.

La concaténation semble anodine et ne l'est pas. Avec elle, un script peut reconstituer le hachage de signature d'une transaction à partir d'éléments poussés sur la pile, par blocs de 520 octets au maximum, puis vérifier ce hachage au moyen d'une vérification de signature ordinaire. C'est ainsi qu'un opcode désactivé parce qu'il était dangereux est devenu le point le plus discuté de la liste des covenants.

Comment cela fonctionne

Statut : désactivé depuis août 2010, lorsqu'une série d'opcodes de chaînes et d'arithmétique a été désactivée lors d'un nettoyage défensif du moteur de script. Le BIP-347 propose de le réactiver dans tapscript uniquement. OP_CAT n'est pas actif sur le mainnet.

L'opération elle-même tient en une ligne : retirer deux éléments, pousser leurs octets concaténés bout à bout. La raison pour laquelle elle était dangereuse en 2010 est que rien ne limitait la taille qu'un élément de pile pouvait atteindre. Concaténer un élément avec lui-même le double, si bien qu'une courte boucle de push et de jointures pouvait faire passer quelques octets à des gigaoctets et emporter la mémoire du nœud. Le moteur moderne impose une limite stricte de 520 octets à tout élément de pile, donc le BIP-347 fait simplement échouer l'opération lorsque le résultat la dépasserait, et l'ancienne attaque disparaît.

Une particularité de numérotation rend cette renaissance inhabituellement propre. OP_CAT est l'opcode 126. Lorsque le BIP-342 a défini tapscript, il a déclaré les opcodes 126 à 129, entre autres, comme OP_SUCCESS : en rencontrer un fait réussir le script sur-le-champ. Les anciens nœuds acceptent donc déjà tout tapscript contenant l'octet 126 sans l'exécuter. Le redéfinir pour effectuer une concaténation ne fait que restreindre ce que ces nœuds auraient autorisé, ce qui fait de ce changement un soft fork plutôt qu'une scission de chaîne.

Ce que la concaténation permet est hors de proportion avec sa taille. Un script capable de construire des chaînes d'octets peut vérifier une preuve de Merkle, contrôler une signature Lamport ou Winternitz construite à partir de hachages plutôt que de courbes elliptiques, et forcer une signature à utiliser un nonce fixe afin que l'équation de signature elle-même expose la transaction de dépense au script. C'est cette dernière astuce qui fait d'OP_CAT un outil de covenant général sans aucun opcode propre aux covenants.

Où le rencontre-t-on

OP_CAT ne s'exécute pas du tout sur bitcoin. Les endroits où il s'exécute sont les chaînes latérales et les réseaux de test qui ont copié le moteur de script de bitcoin puis annulé la décision de 2010.

Elements, et donc Liquid, a l'opcode activé, ce qui explique que la plupart des démonstrations de covenants publiées soient écrites pour Liquid plutôt que pour bitcoin. Les signets personnalisés portant les règles du BIP-347 sont l'autre terrain, et ils existent pour que les développeurs puissent construire la chose avant de demander à quiconque de modifier le consensus.

Pour qui achète ou détient des bitcoins, le contenu pratique est bref : rien dans votre portefeuille, vos adresses ou vos sauvegardes ne change si OP_CAT s'active ou s'il ne s'active jamais. Il vaut la peine de connaître ce nom parce qu'il se trouve au centre d'un réel désaccord sur le degré de programmabilité que bitcoin devrait avoir, et parce que les propositions d'ajouter des signatures fondées sur des hachages pour un avenir avec des ordinateurs quantiques passent généralement par lui.

Questions fréquentes

Pourquoi OP_CAT a-t-il été désactivé au départ ?

Parce que rien ne limitait la taille qu'un élément de pile pouvait atteindre. Joindre un élément à lui-même de façon répétée double sa taille à chaque fois, ce qui pouvait épuiser la mémoire d'un nœud. La limite actuelle de 520 octets par élément supprime ce risque.

La réactivation d'OP_CAT exige-t-elle un hard fork ?

Non. Dans tapscript, le numéro d'opcode est déjà traité comme OP_SUCCESS, donc les anciens nœuds acceptent les scripts qui le contiennent. Lui donner un comportement réel ne fait que restreindre ce qu'ils autorisent déjà, ce qui en fait un soft fork.

À lire ensuite

Termes associés

Plus de termes : Protocole et mises à jour

Lire cette page en anglais