S’il y a bien un sujet qui passionne toujours autant les esprits depuis sa sortie, c’est bien la Blockchain et les cryptomonnaies. De projet punk pour fuir la société à buzzword favori des traders, la Blockchain a traversé un océan depuis sa création. Depuis sa création, les technos ont évolué et laissé place à tout un tas d’outils permettant de créer soi-même son projet utilisant la Blockchain. Un des outils principaux s’appelle Solidity.

Solidity a été créé en 2014 et permet de créer des smartcontracts sur la blockchain, notamment sur Ethereum. Si ces termes ne vous parlent pas, je vous laisse lire des documentations dessus. Cet article n’a pas pour vocation de vous expliquer la Blockchain. Ici nous allons parler programmation, nous allons apprendre à développer en Solidity.

Les bases d’un contract

Tout d’abord avant de parler lignes de code, nous allons parler un peu plus précisément de comment fonctionne un contract.

Tout d’abord, vous allez créer un ou plusieurs fichiers Solidity contenant le code que vous comptez mettre en ligne (un peu comme différents components d’une API). Vous allez ensuite devoir les compiler et les mettre en ligne sur une adresse de la Blockchain, un peu comme un Wallet. Mais au lieu de ne contenir que des tokens, cette adresse contiendra en plus votre contract. C’est depuis cette adresse que vous pourrez appeler votre contract, que ce soit depuis une interface front ou depuis un autre contract.

La seule différence majeure avec une API classique (et pas des moindres je dois dire), c’est qu’un contract ne peut pas être mis à jour (en vrai globalement si, mais non, enfin on en reparlera). Ce qui veut dire que vous devez être sûrs de vous avant de déployer votre contract. Sans ça, vous devrez migrer toute votre plateforme et vos tokens vers un nouveau contrat à jour.

Structure d’un contrat

Un contrat pourra être composé de différentes parties dont beaucoup vous paraîtront familières, mais d’autres spécifiques à Solidity. Décomposons ensemble ces éléments:

Les variables

Ça normalement, vous avez ! Tout comme n’importe quel langage de programmation (sauf le Brainfuck), vous pourrez déclarer des variables. Ces variables auront un type et un niveau d’accessibilité (public, internal ou private).

Les fonctions

Idem, ça devrait vous parler. Tout comme dans d’autres langages, en Solidity vous pourrez déclarer une fonction, ses paramètres et leurs types, la valeur retournée et l’accessibilité. À ceci près que nous en avons ici deux nouvelles: external et internal. External permet de faire des fonctions s’appellent uniquement depuis l’extérieur du contract. Internal permet de faire des fonctions qui s’appellent uniquement dans le contract et les contrats qui en héritent.

Les events

Les events vont être des fonctions spécifiques que vous pouvez appeler à tout moment dans l’exécution de votre code afin de prévenir votre interface front qu’une action a eu lieu. C’est de cette façon que vous pourrez ensuite mettre à jour votre UI afin d’en prévenir votre utilisateur. Ils se déclarent de la manière suivante:

event SendMsg(address indexed sender, string message);

Notez qu’ici vous n’avez pas de corps de fonction à écrire étant donné qu’il ne s’agit pas réellement d’une fonction. Vous devez simplement déclarer son nom et ses paramètres. Pour l’appeler ensuite, rien de plus simple:

function sendAMessage() public {
   emit SendMsg(msg.sender, "Hello World!");
}

J’en profite pour vous présenter une autre particularité de Solidity: la variable « msg » que vous retrouverez dans toutes fonction.

La variable msg

Ce qu’il faut savoir c’est que votre contract ne vit pas. Il dort et attend que quelqu’un ait besoin de lui, un peu comme pour du serverless. Ce qui implique donc que si une fonction est exécutée, c’est forcément qu’elle a été appelée par quelque chose. Et ce quelque chose est stocké avec d’autres valeurs dans une variable que vous retrouverez dans toutes vos fonctions: la variable msg.

C’est donc en utilisant la syntaxe « msg.sender » comme dans l’exemple ci-dessus que vous pourrez récupérer l’adresse de ce qui a appelé votre fonction (qu’il s’agisse d’un humain ou d’un autre contract). Mais la variable msg va également contenir d’autres valeurs:

  • msg.data: contient toutes les valeurs envoyées dans la transaction (un peu comme le body d’une request en POST
  • msg.gas: retourne le gas encore disponible
  • msg.value: retourne la quantité de cryptomonnaie envoyée dans la transaction (on verra plus tard comment faire des « fonctions payantes »)

Voilà pour un premier tour d’horizon de la structure de Solidity. Bien sûr nous n’avons pas vu la partie essentielle: la syntaxe du contract en lui-même. Mais patience: dès le prochain article nous allons entrer dans le vif du sujet et commencer à rédiger notre propre contract.