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.