Un OP_CODE ou Operation Code, est un code ou une instruction primitive qui nous permet de programmer des opérations au sein d'une blockchain telle que Bitcoin. En effet, grâce à l'ensemble de ces codes, nous pouvons créer des structures de programmation avancées ou des contrats intelligents qui sont ensuite lus et exécutés par les nœuds d'un réseau blockchain.
LLes instructions et indications utilisées en informatique pour la programmation d'équipements informatiques et de machines virtuelles sont appelées OP_CODE (code opération) o opcodes.
Ces codes indiquent les opérations ou fonctions qui doivent être effectuées et exécutées par le matériel ou le logiciel. Dans le cas du matériel, la forme du OP_CODE sera définie en fonction du type de architecture d'ensemble d'opérations (ISA) de l'ordinateur. C'est-à-dire selon les instructions dont dispose le dispositif pour l'interprétation et l'exécution des codes d'opération. Dans le cas des logiciels, les OP_CODE sont créés avec un type d'ISA, ou architecture d'opérations, spécialement conçu pour être interprété par le machine virtuelle ou l'interpréteur d'octets.
Les codes d'opération permettent à un programme informatique d'émettre une commande à l'ordinateur et à l'ordinateur de l'interpréter et de l'exécuter.
Comment fonctionne un OP_CODE?
Pour que les machines, équipements et ordinateurs reçoivent et exécutent une commande spécifique, il est nécessaire d'émettre des instructions dans une langue qu'ils peuvent comprendre. Par conséquent, ces instructions sont écrites dans un langage de programmation qui contient opcodes ou il est finalement traduit en une série d'opcodes.
Ces codes sont écrits dans une langue que nous connaissons généralement, comme l'anglais, et sont ensuite traduits par un programme de compilation ou de traduction pour que les machines le comprennent dans leur langage binaire. Autrement dit, les instructions mnémotechniques écrites dans notre langage pour l'interprétation de nous, humains, ont leur équivalent en langage binaire afin que les machines puissent les interpréter facilement. Et ainsi pouvoir agir sur l'instruction reçue et l'exécuter correctement.
Exemple d'un OP_CODE
Un bon exemple de OP_CODE peut être vu dans l'image suivante:
On y voit des OP_CODES appartenant aux instructions capables d'exécuter un processeur ou Processeur ordinateur (spécifiquement x86 d'Intel). Comme vous pouvez le voir, il est quelque peu cryptique à lire et peut difficilement être programmé en l'utilisant (bien que certains développements soient faits dans ce type de langage en raison de sa rapidité).
La situation dans le monde de la crypto n'est pas très différente et en Bitcoin par exemple, nous pouvons voir quelque chose comme ceci:
C'est certes tout aussi cryptique, mais cette simple déclaration équivaut à une transaction en Bitcoin. Si vous souhaitez en savoir plus, vous pouvez lire notre article dédié à Script Bitcoin où nous expliquons en profondeur ce que font exactement ces instructions.
Types d'opcodes dans le script Bitcoin
Les OP_CODES pour le script Bitcoin, ils peuvent être classés en fonction de la fonction et des indications qu'ils exécuteront dans le système. Par exemple, ces codes peuvent être utilisés pour supprimer, ajouter, déplacer ou faire pivoter des éléments sur la pile, analyser et effectuer des opérations arithmétiques, valider ou invalider des transactions, parmi de nombreuses autres fonctions.
Ci-dessous, nous présenterons une liste des codes d'opération classés selon leur type et leurs fonctions. Cependant, il est important de noter que cette liste n'est ni concluante ni radicale, car il existe de nombreux opcodes dans le script Bitcoin et seuls certains d'entre eux sont mentionnés ici.
Codes d'intégration
OP_0 = 0x00 y OP_FAUX = OP_0: les deux codes pousser ou ils ajoutent un élément ou un tableau d'octets vide à la pile. Aucun des deux ne doit être confondu avec NO_OP
OP_PUSHDATA1 = 0x4c, OP_PUSHDATA2 = 0x4d y OP_PUSHDATA4 = 0x4e: Dans le premier code, le octet suivant contient le nombre d'octets à pousser sur la pile. Dans le deuxième code, le 2 octets suivants contiennent le nombre d'octets qui seront insérés dans la pile, tandis que dans le troisième se trouvent les 4 octets suivants ceux qui contiennent le nombre d'octets à ajouter à la pile. Dans ces codes, le processus d'ajout des octets se fera au format boutiste.
OP_NÉGATIF = 0x4f y OP_VRAI = OP_1: Dans ce cas, le nombre négatif -1 est poussé sur la pile, tandis que dans OP_TRUE le nombre positif 1 est poussé sur la pile.
Codes de contrôle
OP_NOP = 0x61: ce code n'exécute aucune opération, mais il est utilisé dans les cas où un espace doit être rempli dans le programme.
OP_IF = 0x63 y OP_NOTIF = 0x64: les deux codes sont utilisés pour exécuter les déclarations. Dans le premier code, ils sont exécutés si la valeur de pile supérieure aucune c'est faux; dans le deuxième code, ils sont exécutés si les valeurs de la pile supérieure si c'est faux. Ainsi, dans les deux cas, la valeur de pile supérieure est supprimée.
OP_ELSE = 0x67: utilisé pour affirmer ou nier des déclarations. Dans le cas où les deux codes précédents ont été exécutés (OP_IF et OP_NOTIF) les déclarations sont refusées. En cas de aucune ont été exécutés, les déclarations sont confirmées.
OP_ENDIF = 0x68: utilisé pour terminer un bloc, car sans cela, les transactions ne seraient pas valides. Un code OP_ENDIF sans code OP_IF ci-dessus ne sera pas valide non plus.
OP_RETOUR = 0x6a- Utilisé pour marquer une sortie de transaction comme invalide.
Codes d'application et opérations de pile
OP_TOALTSTACK = 0x6b y OP_FROMALTSTACK = 0x6c: Le premier code est utilisé pour déplacer l'entrée vers le haut de la pile alternative et la retirer de la pile principale. Le deuxième code exécute le processus inverse; déplace l'entrée vers le haut de la pile principale et la supprime de la pile alternative.
OP_DROP = 0x75 y OP_DUP = 0x76: être habitué supprimer un élément de la pile supérieure et à dupliquer un élément de la pile supérieure, respectivement.
Codes de fonction d'épissure
TAILLE_OP = 0x82: Ce code pousse la longueur de la chaîne à partir de l'élément supérieur de la pile, sans la casser.
Les codes OP_SUBSTR = 0x7f, OP_GAUCHE = 0X80 y OP_RIGHT = 0x81 ont été désactivés. Ils étaient habitués à:
- Devolver une section dans une chaîne.
- Garder seulement les caractères restants à partir d'un point spécifique d'une chaîne, et
- Garder seuls les caractères restants à droite d'un point spécifique d'une chaîne, respectivement.
Codes pour les opérations numériques
OP_1ADD = 0x8b y OP_1SUB = 0x8c: sont utilisés pour ajouter (sumar) ou supprimer (soustraire) 1 à l'entrée respectivement.
OP_2MUL = 0x8j y OP_1DIV = 0x8e: ils étaient habitués à multiplicar o diviser par 2 entrées respectivement, mais les deux ont été désactivés.
OP_ABS = 0x90 y OP_NEGATE = 0x8f: sont utilisés pour inverser le signe de l'entrée, c'est-à-dire pour rendre l'entrée respectivement positive ou négative.
OP_MIN = 0xa3 y OP_MAX = 0xa4: ces codes sont utilisés pour renvoyer le valeur inférieure de a et b, ou le cas échéant pour retourner le plus grande valeur de a et b respectivement.
Codes d'encodage et de cryptage
OP_RIPEMD160 = 0xa6: il est utilisé pour encoder l'entrée avec l'algorithme RIPEMD-160, afin d'obtenir des hachages plus courts mais tout aussi sécurisés pour la création d'adresses.
OP_SHA1 = 0xa7: Il est utilisé pour coder l'entrée avec l'algorithme SHA-1, qui est utilisé pour calculer et obtenir une valeur de contrôle unique pour toutes les entrées ne dépassant pas 264 - 1 bit.
OP_SHA256 = 0xa8: utilisé pour encoder l'entrée avec l'algorithme SHA-256.
OP_HASH160 = 0xa9: utilisé pour encoder l'entrée 2 fois. Le premier encodage via l'algorithme SHA-256 et le second avec l'algorithme RIPEMD-160
OP_HASH256 = 0xa: utilisé pour encoder l'entrée 2 fois via l'algorithme SHA-256.
OP_CHECKMULTISIG = 0xae: il est utilisé pour faire une comparaison entre la première signature avec chaque clé publique jusqu'à ce qu'une correspondance soit trouvée ECDSA. Ensuite, il répète le processus avec la deuxième signature et les clés publiques suivantes et ainsi de suite jusqu'à ce que toutes les signatures aient été vérifiées.
Codes de verrouillage horaire
OP_CHECKLOCKTIMEVERIFY = 0xb1: ce code marque comme aucune entrée valide si l'élément supérieur de la pile est supérieur au champ défini comme nLockTime, qui représente la condition à remplir. L'application de ce code comporte plusieurs implications qui rendent également l'entrée invalide. Par exemple, si la pile est vide ou si son élément supérieur est négatif, entre autres.
OP_CHECKSEQUENCESSVERIFY = 0xb2: également utilisé pour marquer l'entrée comme aucune valide si le temps de verrouillage est différent ou supérieur à la valeur de l'élément supérieur de la pile.
Chacun de ces OP_CODE remplit une fonction bien définie, et la disposition conjointe de ces OP_CODE est ce qui permet à Bitcoin de fonctionner comme il le fait. Cependant, les OP_CODE ne sont pas uniques à Bitcoin. Ethereum par exemple a également son propre registre OP_CODE qui vous permet de saisir des instructions dans votre Machine virtuelle Ethereum, et de là effectuer toutes les opérations de ce blockchain. Cela va des transactions les plus simples aux opérations complexes des contrats intelligents de cette plate-forme. Il en va de même pour le reste de crypto-monnaies qui ont également leurs OP_CODES ou des outils similaires pour leur fonctionnement.
D'où l'importance d'elles, non seulement de les connaître mais de les développer pour étendre les fonctionnalités des crypto-monnaies et des écosystèmes qu'elles contiennent.
OP_CODES sur d'autres blockchains
Quand on entend que les crypto-monnaies ont la capacité d'être programmées, la vérité est que nous disons que les blockchains et leurs jetons peuvent être manipulés grâce à OP_CODES. Certes, la première chose se fait entendre beaucoup plus simple, mais la réalité technique est la suivante: les OP_CODES sont dans toutes les blockchains et ce sont eux qui nous permettent de programmer les transactions et autres fonctionnalités de la même.
Mais à quel point ces OP_CODES peuvent-ils être grands et avancés sur d'autres blockchains par rapport à Bitcoin? La réponse est simple: il n'y a pas de limites, seulement l'imagination des développeurs.
Pour nous donner un bon exemple clair, regardons Ethereum. Dans Ethreum, nous voyons une blockchain composée de trois éléments, le jeton Ether, le concept de gaz ou coût de fonctionnement et la machine virtuelle Ethereum. Vu individuellement, ils ne semblent pas liés, mais la vérité est qu'ils sont étroitement intégrés, et une telle intégration dépend de la relation créée par les OP_CODES dans Ethereum.
Ainsi, chaque fois que nous effectuons une transaction dans Ethereum, nous programmons l'opération avec OP_CODES. Cette opération va nous permettre de gérer Ether et le paiement de l'opération se fera avec GAS, mais toute cette programmation est lue et exécutée par la machine virtuelle Ethereum. Ainsi, nous savons clairement comment ces trois éléments communiquent et comment les OP_CODES jouent un rôle important dans le fonctionnement du réseau.
La même chose peut être observée dans les réseaux tels que Litecoin (qui utilise un équivalent à Bitcoin Script), Tiret, EOS, Bitcoin Cash (Il utilise également un équivalent modifié de Bitcoin Script) et la même chose peut être observée avec le reste des crypto-monnaies. Bref, les OP_CODES ne sont pas seulement en Bitcoin, ils sont une partie essentielle des crypto-monnaies et des blockchains où vous êtes, ils font la vie.