VT2022 XXX fiche

RESUME

WebAssembly, est un format d'instruction binaire basé sur une machine à pile. Cette technologie permet entre autres de compiler du code de n’importe quel langage en fichier .wasm. Ces fichiers binaires sont alors très peu coûteux en stockage, et peuvent être exécutés sur n’importe quelle architecture machine, mais également intégrés à du code JavaScript par exemple. Cela permet aux technologies du web de pouvoir exécuter du code déjà compilé, provenant d’autres langages, pouvant être plus performants pour certaines tâches. Cette technologie peut alors parfaitement s’intégrer à la blockchain, afin de coder des smart contracts plus performants. En effet, les programmes des smart contracts ont besoin de répondre à deux problématiques majeures, qui sont la taille du fichier, et la possibilité d’exécuter ces programmes sur n’importe quelle architecture machine. WebAssembly répond à ces critères, et permet d’écrire des smart contracts dans des langages performants tel que C, C++, C# ou encore Rust. Cela semble alors être une technologie révolutionnaire pour le milieu des smart contracts.

ABSTRACT

WebAssembly is a binary instruction format based on a stack machine. This technology allows, among other things, to compile code of any language into .wasm files. These binary files are then very cheap in storage, and can be executed on any machine architecture, but also integrates well with JavaScript code for example. This allows web technologies to run already compiled code from other languages, which can be more efficient for certain tasks. This technology can then be perfectly integrated with the blockchain, in order to propose more efficient smart contracts. Indeed, smart contract programs need to answer two major issues, which are the file size, and the possibility to run these programs on any machine architecture. WebAssembly meets these criteria, and allows to write smart contracts in powerful languages such as C, C++, C# or even Rust. It seems then to be a revolutionary technology for the smart contract community.

I. WEB ASSEMBLY

1.	ETAT DES TECHNOLOGIES DU WEB AVANT WEBASSEMBLY

On observe deux phases importantes dans l’évolution des technologies du web, et plus particulièrement de JavaScript. Au tout début, le langage JavaScript était exécuté via un interpréteur. Cet interpréteur permet de se passer du temps de compilation d’un fichier (par opposition au compilateur) et donc de gagner en performance. En effet, pour rappel, à l’inverse d’un compilateur qui va traduire l’ensemble du code en langage machine avant l’exécution, l’interpréteur traduit uniquement la ligne qu’il est en train d’exécuter, et exécute ainsi le programme ligne par ligne. Cependant, cette méthode a ses limites et a amené les technologies du web à évoluer, vers ce que nous allons appeler la phase 2, avec l’utilisation des compilateurs Just-In-Time (JIT). En effet, l’utilisation de l’interpréteur pose plusieurs soucis de performances. Imaginons que vous rechargiez une page web, le code devra alors être de nouveau exécuté entièrement par l’interpréteur. Alors que si nous avions compilé le code via un compilateur lors de la première itération, nous n’aurions qu’à exécuter le code précédemment compilé directement. Ce problème de réinterprétation du code peut également survenir dans les boucles, où nous pourrions simplement compiler la ligne de code qui sera exécutée plusieurs fois, plutôt que de l’interpréter à chaque tour de boucle. Oui mais, changer pour une utilisation du compilateur à la place de l’interpréteur ferait perdre en performance dans le cas où nous utilisons des pages statiques. C’est pourquoi, le compilateur JIT a été inventé pour résoudre ce problème. Comment fonctionne un compilateur JIT ? Un compilateur Just-In-Time fonctionne de la même manière qu’un interpréteur, à la différence qu’il va compiler certaines portions de code au cours de l’exécution. En effet, lors de l’exécution d’un programme il va identifier si une portion de code « chauffe » beaucoup ou non, et décider de compiler ces portions de code en fonction de leur état. On dit alors que du code chauffe s’il est interprété plusieurs fois (dans une boucle par exemple). Ainsi les portions de code qui chauffent seront compilées et stockées, afin de pouvoir exécuter directement le code compilé lors de sa prochaine exécution. De plus, afin d’optimiser la compilation, le JIT fais des hypothèses sur le code compilé, comme par exemple le type des variables. Comme vous le savez peut-être, JavaScript est un langage non typé, et peut donc contenir des structures de données avec des types non homogènes. Ainsi, le JIT va faire une hypothèse sur le type des données traités lors de la compilation. Ainsi, lors de la prochaine exécution il vérifiera si son hypothèse est juste avant d’exécuter le code compilé. Si jamais son hypothèse est fausse, il va alors faire une « désoptimisation » en supprimant le code compilé. L’exécution sera alors assurée par l’interpréteur, et peut être plus tard recompilé à nouveau suivant de nouvelles hypothèses.

2.	WEB ASSEMBLY

Avec l’arrivée du compilateur JIT, les performances du Web ont explosé, avant de de nouveau stagner (état des technologies actuelles). C’est pourquoi, les grandes entreprises telles que Google, Mozilla, Apple, Microsoft et W3C ont commencé à travailler sur une nouvelle technologie : WebAssembly, pour répondre aux nouvelles problématiques de performances. En effet, le problème que pose aujourd’hui le JIT est la grande perte de performance lors de l’étape d’optimisation du code compilé et la désoptimisation, étapes qui peuvent se répéter indéfiniment. Ainsi, l’objectif de WebAssembly est de supprimer cette étape. Pour ce faire, WebAssembly permet de générer des fichiers binaires .wasm qui peuvent être obtenus en compilant n’importe quel langage de programmation en .wasm. WebAssembly est une machine à pile, c’est-à-dire que les fichiers binaires générés ne stockent pas les registres dont sont issus les données pour effectuer les calculs. Cela permet entre autres de produire des fichiers très légers, qui sont alors rapidement transférables et peu gourmands en stockage. De plus, ces fichiers peuvent être ensuite exécutés sur n’importe quelle architecture de machine. Grâce à sa compatibilité avec toutes sortes de langages, les modules .wasm peuvent, par exemple, alors être intégrés à du code JavaScript. En quoi WebAssembly rend alors JavaScript et les autres technologies du web plus performantes ? Grâce à Web Assembly il est maintenant possible d’exécuter du code compilé, issu d’autres langages tel que C, C++, C# ou encore Rust, qui sont des langages plus optimisés pour effectuer certaines tâches. Ainsi, il nous est possible d’écrire un code en JavaScript qui utilise du code C compilé en .wasm, qui viendra remplacer les portions de code « chaudes » qui étaient précédemment compilées, optimisées, désoptimisées, et recompilées par le JIT. De plus, grâce à leurs petites tailles, les fichiers .wasm sont très peut coûteux à être importés et donc ne créent pas de latence supplémentaire.

Pour finir, on peut trouver une autre application à Web Assembly en dehors de la recherche de performances. En effet, puisqu’il est maintenant possible d’exécuter du code C, C++, C#, Rust… pour le web, il n’est plus nécessaire de réécrire du code en JavaScript si une alternative dans un autre langage existe déjà, et a déjà prouvé son efficacité. Permettant ainsi de faciliter le travail des développeurs et de mettre en place un « pont » entre les langages, au service du web.

II. SMART CONTRACTS

1.	BLOCKCHAIN & SMART CONTRACTS

« Une blockchain est une base de données décentralisée publique. » Expliquons rapidement cette phrase. Tout d’abord, afin de comprendre pourquoi nous parlons de décentralisation, il faut comprendre ce qu’est un « tier de confiance ». Un « tier de confiance » est une personne (morale ou non) qui est chargée d’assurer un service entre deux personnes. Par exemple, la banque est le tier de confiance utilisé pour une transaction monétaire, mais encore, quand vous souhaitez accéder à vos données stockées dans le cloud, vous faites appel à un tier de confiance (par exemple Amazon) qui vous assure de stocker vos informations et de vous permettre d’y accéder. Le système basé sur les tiers de confiances est ce qu’on appelle un système « centralisé ». En effet, une banque, ou une ferme de serveurs, se charge de centraliser les transactions ou le stockage des données. Ainsi, l’objectif de la décentralisation est de se passer de ces tiers de confiance. Pour ce faire, la blockchain est manipulée par des centaines de milliers de personnes, qui possèdent tous un même registre. Ensuite, afin de modifier ce registre, pour inscrire une nouvelle information, l’entièreté des personnes qui contribuent à ce registre doivent valider la modification. Le registre est alors décentralisé, puisqu’il n’est plus géré par une unique entité. De plus, quand on parle de blockchain, on parle de base de données publique. En effet, une blockchain n’est ni plus ni moins qu’un registre informatique où l’on peut stocker des informations de manière sécurisée. Ainsi, par sa propriété à être décentralisée, ce registre est public, n’importe quelle personne peut venir consulter les informations qu’il contient, le stocker et contribuer aux validations des prochaines modifications. Un smart contract ou « contrat intelligent », pour sa part, est un contrat passé entre deux entités, inscris de manière immuable dans la blockchain. Il permet de jouer le rôle des tiers de confiance dans un système centralisé. En effet, un smart contract n’est ni plus ni moins qu’un code informatique se trouvant dans une blockchain, qui fixe le cadre d’un contrat. Il définit les actions à réaliser, lorsque les conditions voulues par les parties l’ayant signé sont respectées. Ils sont aujourd’hui écrits dans des langages de programmations tel que Solidity, qui sont basés sur JavaScript. 2.	UTILISATION DE WEBASSEMBLY POUR ECRIRE DES SMART CONTRACTS

Tout d’abord, les langages tel que Solidity sont des langages pensés pour être exécutés sur la blockchain. En effet, la blockchain impose plusieurs contraintes au langage, qui ont forcé les développeurs à concevoir des langages spécifiques pour y répondre. Parmi ces contraintes, les deux plus importantes sont : -	La nécessité d’avoir un programme peu couteux en stockage. o	En effet plus les fichiers sont volumineux, plus ils sont coûteux à inscrire dans la blockchain. -	La nécessité d’avoir des programmes exécutables sur n’importe quelle machine. o	En effet, comme expliqué précédemment, la blockchain peut être stockée par n’importe quel individu. Ainsi, les programmes des smart contracts doivent pouvoir s’exécuter sur la machine de ces individus, quelle que soit leur architecture. Cependant, les langages comme Solidity répondent à ces exigences, mais font face à d’autres problèmes. En effet, ces langages sont peu performants, et surtout spécifiques à l’utilisation sur une bolckchain. Cette spécificité implique le besoin d’une main d’œuvre qualifiée dans un domaine « de niche ». C’est à ce moment que Web Assembly trouve toute son application pour les smart conrtacts. En effet, comme nous l’avons vu précédemment, les fichiers .wasm sont des fichiers peu coûteux en stockage, et exécutables sur toutes les architectures machines. WebAssembly répond ainsi aux exigences de la blockchain, mais plus encore. WebAssembly permet d’obtenir un fichier .wasm à partir d’autres langages de haut niveau. Ainsi, cela permet d’ouvrir la programmation de smart contracts à d’autres langages de programmation. Permettant alors d’avoir accès à une main œuvre qualifiée beaucoup plus grande, mais également à des langages plus performants et optimisés pour effectuer certaines tâches. WebAssembly semble donc être le futur des smart contracts et permettra sans aucun doute, comme elle le fait avec les technologies du web, d’ouvrir de nouvelles possibilités aux smart contracts.