Machine virtuelle Ethereum (EVM)
La machine virtuelle Ethereum (EVM) est un environnement virtuel décentralisé qui exécute du code de manière cohérente et sécurisée sur tous les nœuds Ethereum. Les nœuds exécutent l'EVM pour exécuter des contrats intelligents, en utilisant du « gaz » pour mesurer l'effort de calcul requis pour les opérations, garantissant ainsi une allocation efficace des ressources et la sécurité du réseau.
Prérequis
Une certaine familiarité avec la terminologie courante en informatique, telle que les octets (opens in a new tab), la mémoire (opens in a new tab) et une pile (opens in a new tab), est nécessaire pour comprendre l'EVM. Il serait également utile d'être à l'aise avec les concepts de cryptographie et de chaîne de blocs tels que les fonctions de hash (opens in a new tab) et l'arbre de Merkle (opens in a new tab).
Du registre à la machine à états
L'analogie d'un « registre distribué » est souvent utilisée pour décrire les chaînes de blocs comme Bitcoin, qui permettent une cryptomonnaie décentralisée en utilisant des outils fondamentaux de cryptographie. Le registre conserve un historique d'activité qui doit respecter un ensemble de règles régissant ce que quelqu'un peut et ne peut pas faire pour modifier le registre. Par exemple, une adresse Bitcoin ne peut pas dépenser plus de Bitcoin qu'elle n'en a reçu précédemment. Ces règles sous-tendent toutes les transactions sur Bitcoin et de nombreuses autres chaînes de blocs.
Bien qu'Ethereum possède sa propre cryptomonnaie native (l'ether) qui suit presque exactement les mêmes règles intuitives, il permet également une fonction beaucoup plus puissante : les contrats intelligents. Pour cette fonctionnalité plus complexe, une analogie plus sophistiquée est requise. Au lieu d'un registre distribué, Ethereum est une machine à états (opens in a new tab) distribuée. L'état d'Ethereum est une vaste structure de données qui contient non seulement tous les comptes et soldes, mais aussi un état de la machine, qui peut changer de bloc en bloc selon un ensemble de règles prédéfinies, et qui peut exécuter du code machine arbitraire. Les règles spécifiques de changement d'état de bloc en bloc sont définies par l'EVM.
Schéma adapté de Ethereum EVM illustrated (opens in a new tab)
La fonction de transition d'état d'Ethereum
L'EVM se comporte comme le ferait une fonction mathématique : étant donné une entrée, elle produit une sortie déterministe. Il est donc très utile de décrire plus formelnellement Ethereum comme ayant une fonction de transition d'état :
Y(S, T)= S'
Étant donné un ancien état valide (S) et un nouvel ensemble de transactions valides (T), la fonction de transition d'état d'Ethereum Y(S, T) produit un nouvel état de sortie valide S'
État
Dans le contexte d'Ethereum, l'état est une énorme structure de données appelée trie de Merkle Patricia modifié, qui maintient tous les comptes liés par des hashs et réductibles à un seul hash racine stocké sur la chaîne de blocs.
Transactions
Les transactions sont des instructions signées cryptographiquement provenant de comptes. Il existe deux types de transactions : celles qui aboutissent à des appels de message et celles qui aboutissent à la création de contrat.
La création de contrat aboutit à la création d'un nouveau compte de contrat contenant le bytecode compilé du contrat intelligent. Chaque fois qu'un autre compte effectue un appel de message vers ce contrat, il exécute son bytecode.
Instructions de l'EVM
L'EVM s'exécute comme une machine à pile (opens in a new tab) d'une profondeur de 1024 éléments. Chaque élément est un mot de 256 bits, ce qui a été choisi pour la facilité d'utilisation avec la cryptographie 256 bits (comme les hashs Keccak-256 ou les signatures secp256k1).
Pendant l'exécution, l'EVM maintient une mémoire transitoire (sous forme de tableau d'octets adressé par mot), qui ne persiste pas entre les transactions.
Stockage transitoire
Le stockage transitoire est un magasin clé-valeur par transaction accessible via les codes d'opération TSTORE et TLOAD. Il persiste à travers tous les appels internes au cours de la même transaction, mais est effacé à la fin de la transaction. Contrairement à la mémoire, le stockage transitoire est modélisé comme faisant partie de l'état de l'EVM plutôt que du cadre d'exécution, mais il n'est pas validé dans l'état global. Le stockage transitoire permet un partage d'état temporaire économe en gaz entre les appels internes lors d'une transaction.
Stockage
Les contrats contiennent un trie de stockage de Merkle Patricia (sous forme de tableau de mots adressable par mot), associé au compte en question et faisant partie de l'état global. Ce stockage persistant diffère du stockage transitoire, qui n'est disponible que pour la durée d'une seule transaction et ne fait pas partie du trie de stockage persistant du compte.
Codes d'opération
Le bytecode de contrat intelligent compilé s'exécute sous la forme d'un certain nombre de codes d'opération de l'EVM, qui effectuent des opérations de pile standard telles que XOR, AND, ADD, SUB, etc. L'EVM implémente également un certain nombre d'opérations de pile spécifiques à la chaîne de blocs, telles que ADDRESS, BALANCE, BLOCKHASH, etc. L'ensemble de codes d'opération comprend également TSTORE et TLOAD, qui fournissent un accès au stockage transitoire.
Schémas adaptés de Ethereum EVM illustrated (opens in a new tab)
Implémentations de l'EVM
Toutes les implémentations de l'EVM doivent respecter les spécifications décrites dans le livre jaune d'Ethereum.
Au cours des dix années d'histoire d'Ethereum, l'EVM a subi plusieurs révisions, et il existe plusieurs implémentations de l'EVM dans divers langages de programmation.
Les clients d'exécution Ethereum incluent une implémentation de l'EVM. De plus, il existe de multiples implémentations autonomes, notamment :
- Py-EVM (opens in a new tab) - Python
- evmone (opens in a new tab) - C++
- ethereumjs-vm (opens in a new tab) - JavaScript
- revm (opens in a new tab) - Rust
Complément d'information
- Livre jaune d'Ethereum (opens in a new tab)
- Jellopaper alias KEVM : Sémantique de l'EVM en K (opens in a new tab)
- Le Beigepaper (opens in a new tab)
- Codes d'opération de la machine virtuelle Ethereum (opens in a new tab)
- Référence interactive des codes d'opération de la machine virtuelle Ethereum (opens in a new tab)
- Une brève introduction dans la documentation de Solidity (opens in a new tab)
- Mastering Ethereum - La machine virtuelle Ethereum (opens in a new tab)
Sujets connexes
Tutoriels : Machine virtuelle Ethereum (EVM) / Codes d'opération sur Ethereum
- Comprendre les spécifications de l'EVM du livre jaune – Une visite guidée des spécifications formelles de l'EVM issues du livre jaune d'Ethereum.
- Rétro-ingénierie d'un contrat – Comment faire de la rétro-ingénierie sur un contrat intelligent compilé en utilisant les codes d'opération de l'EVM.