Comment programmer des contrats intelligents avec Ethereum e...
Ethereum

Comment programmer des contrats intelligents avec Ethereum et Webassembly ?

Ethereum est à l’origine de l’une des crypto-monnaies les plus populaires – et pourtant, c’est bien plus que cela. Grâce aux algorithmes, la monnaie cryptographique peut être gérée de manière totalement autonome. Mais comment fonctionnent les « contrats intelligents » et où en est-on dans cette voie ?

Comment fonctionnent les contrats intelligents dans Ethereum ?

Pour comprendre le principe des contrats intelligents dans Ethereum, il est d’abord nécessaire de faire une petite excursion dans le monde des langages de programmation. Les langages de programmation courants sont essentiellement divisés en deux groupes : les langages interprétés et les langages compilés. Dans le premier groupe, on écrit des programmes dans un langage de haut niveau, qui sont ensuite exécutés par un interprète. Deux exemples populaires sont Python et JavaScript. Les langages interprétés sont courants dans de nombreux domaines d’application (comme le web) car ils permettent de démarrer immédiatement. Ils sont également très universels et peuvent être utilisés sur différentes plates-formes sans nécessiter d’outillage supplémentaire.

À l’inverse, il existe des langages compilés, pour lesquels un compilateur convertit d’abord le texte du programme en un autre langage – souvent un code machine binaire. Ce code binaire est dépendant de la plate-forme et est exécuté directement sur un processeur. Le compilateur peut (et doit) produire un code personnalisé pour le jeu d’instructions du processeur, par exemple pour les CPU compatibles ARM ou Intel. Les représentants bien connus de ce type sont C et Rust.

Toutefois, la réalité est, comme toujours, plus complexe que ne le suggèrent ces simples catégories. Depuis quelque temps, il existe des formes hybrides, comme Java. En effet, le compilateur Java ne traduit pas directement le code Java en code machine « réel », mais dans un format intermédiaire spécial. Ce format intermédiaire, à son tour, est ensuite exécuté par un interprète – la machine virtuelle Java – sur l’architecture concrète du processeur.

Les contrats intelligents d’Ethereum fonctionnent également de manière similaire. Tous les nœuds qui valident les transactions et extraient de la nouvelle monnaie dans Ethereum contiennent une instance de la machine virtuelle Ethereum (EVM). Le Yellow Paper, la spécification technique d’Ethereum, définit en détail les instructions qui supportent l’EVM – et comment elles doivent être exécutées.

Il s’agit d’un développement propriétaire qui présente de nombreuses particularités :

  • L’interaction avec le monde extérieur n’est pas possible : toutes les décisions algorithmiques doivent résulter de la blockchain et de ses transactions.
  • L’arithmétique est basée sur des valeurs de 256 bits pour faciliter la manipulation d’adresses et de montants plus importants.
  • Des opérations spéciales telles que les fonctions de hachage sont intégrées pour augmenter les performances.
  • Toutes les instructions se voient attribuer une fonction de coût (carburant), qui correspond approximativement au temps d’exécution nécessaire et à la quantité de mémoire requise. Le terme metering est couramment utilisé en anglais.
  • Programmation sur l’EVM

Comme pour l’écosystème Java, il existe plusieurs langages de programmation pour lesquels des compilateurs EVM sont disponibles. Le langage le plus courant est Solidity, qui rappelle superficiellement (syntaxiquement) JavaScript. À la fin de l’année 2020, la documentation d’Ethereum répertorie deux langues supplémentaires : Vyper, qui est basé sur Python, et Yul Plus, un développement complètement indépendant.

Ce que tous ces langages ont en commun, c’est qu’ils sont spécifiques à un domaine, car, contrairement aux langages polyvalents, ils occupent une niche avec des caractéristiques particulières et, en particulier, un moteur d’exécution spécial : l’EVM. Bien entendu, ces langages spécifiques à un domaine (DSL) sont fondamentalement une bonne idée pour réduire la complexité des applications.

Mais dans le cas de l’EVM, cela semble avoir peu de sens. Après tout, elle peut – indépendamment de l’absence de possibilités d’interaction avec le monde extérieur à la blockchain – exécuter des algorithmes arbitraires, elle est donc (pour faire simple) complète à la manière de Turing.

Pourquoi ne pas utiliser un langage et un environnement d’exécution existants ?

Si nécessaire, il faudrait alors supprimer des fonctionnalités, mais on pourrait s’appuyer sur une plus longue expérience, des outils plus stables et – ce qui est beaucoup plus important – une base plus large de programmeurs. En effet, il est de notoriété publique qu’aujourd’hui, la popularité d’un langage de programmation n’est pas seulement déterminée par le fait que l’on peut y programmer de manière particulièrement concise, sûre du point de vue des types ou dynamique, mais aussi par la facilité avec laquelle on peut accéder aux nombreuses bibliothèques et paquets existants. Ce changement d’époque est particulièrement illustré par JavaScript, qui est souvent critiqué pour sa sémantique grossière, mais qui doit être considéré comme le langage de programmation le plus populaire au plus tard depuis le millionième paquet NPM.

Webassembly, un langage intermédiaire universel

Les personnes à l’origine de la spécification Ethereum sont arrivées à la conclusion que certains problèmes peuvent être résolus en abandonnant le développement personnalisé au profit d’un langage universel. Comme c’est pratique qu’un développement soit en cours sur le web pour établir une alternative au grand chien JavaScript : Webassembly (WASM). Il s’agit à la fois d’un langage intermédiaire universel et d’un format binaire, associés à une spécification pour les interprètes. Comme son nom l’indique, cette norme ouverte a été conçue à l’origine pour le web. Entre-temps, d’autres domaines d’application (par exemple les applications pour smartphones) ont été examinés.

Le développement de WASM est piloté par des géants du secteur tels que Microsoft, Google et Apple. Le langage se caractérise par le fait qu’il a été conçu dès le départ pour la portabilité. Ceci est reconnaissable au fait que de nombreux langages de programmation existants tels que Rust, C++ ou Go peuvent déjà compiler pour l’assemblage web.

Comments are off this post!