Tutorial développement Solidity avec Remix

0

[!]Ce tutoriel a été mis à jour en décembre 2018 pour prendre en compte les dernières évolutions de Solidity.

 

Ce tutoriel est une introduction au développement avec le langage Solidity (qui pour rappel sert à créer des smart contract sur la blockchain Ethereum) sur l’environnement de développement intégré (IDE) REMIX.

Remix est un IDE qui est accessible par navigateur à l’adresse suivante https://remix.ethereum.org (le tout premier chargement peut prendre quelques secondes selon la vitesse de votre connexion)

Remix est très pratique et très pertinent pour apprendre à coder sur Solidity pour plusieurs raisons :
– On y accède juste par navigateur et il n’y a rien à installer
– On dispose automatiquement des dernières versions de Solidity
– Il y a un débugueur intégré
– Il permet de compiler et d’exécuter les smart contracts instantanément, dans toutes sortes de blockchains, c’est à dire qu’on peut déployer dans la vrai blockchain Ethereum un smart contract directement depuis Remix, mais il peut aussi se connecter à la blockchain de test (qui s’appelle Ropsten), ou à une blockchain locale comme Ganache. Il est donc très souple et flexible. Pour l’apprentissage, il y a même une VM Javascript qui permet de simuler une blockchain pour faire des tests, avec directement des adresses Ethereum qui on chacun de l’ETHER.

La somme d’outils à installer (node, git, ide etc) peut être repoussante pour débuter à développer des smart contracts, Solidity règle ce problème puisqu’il suffit de se rendre sur une URL pour démarrer sur un environnement réel et non pas dégradé comme c’est parfois le cas sur les outils en ligne.

L’interface Remix pour solidity

Vous y retrouverez principalement :
1 : La barre d’outils de gestion des fichiers (pour créer un fichier, en charger un, et même accéder à un dossier local avec vos fichiers solidity)
2 : Le navigateur de fichiers ou vous retrouverez la liste des fichiers .sol (l’extension officielle pour Solidity)
3 : Le code ! c’est la qu’on bosse !
4 : La console ou toutes les transactions et actions du contrat sont affichées
5 : La barre d’outils pour compiler, débuguer, se connecter à la bockchain, entrer des variables et plein d’autres choses que nous détaillerons au fur et à mesure de leurs utilisations.

De base, Solidity vous affiche un contrat Ballot.sol, nous en reparlerons plus tard mais allons voir quelques bases indispensables à maîtriser avant, vous pouvez l’ignorer pour l’instant.

Notre premier Smart Contract sur Solidity

Nous allons créer une application de messagerie qui permet de laisser un message dans la blockchain, dans une première version elle sera ouverte à tous, chacun pourra donc modifier le message, nous l’améliorerons ensuite pour définir un unique propriétaire qui pourra modifier le message affiché.
Nous apprendrons aussi à utiliser etherscan.io, qui permet de retrouver tout l’historique d’un contrat à partir de son adresse. Rappelons que la blockchain est un immense registre distribué, il sera impossible de supprimer notre message lorsqu’il y sera inscrit, on pourra en écrire un nouveau qui remplacera l’ancien, mais l’ancien sera toujours consultable dans l’historique des transactions.

Pour démarrer, cliquer sur le + de la barre d’outils en haut à gauche, puis appeler notre nouveau fichier message.sol , et ajoutez le code suivant :

pragma solidity ^0.5.0;
contract Message {

}


Tout contrat démarre ainsi, on commence par indiquer la version du compiler avec pragma solidity ^0.5.0; puis on déclare le contrat comme on le ferait pour une classe dans un autre langage.

Solidity étant un langage à typage statique, on déclare nos variables en début de contrat, il y en à qu’une ici qu’une à ajouter (celle qui va contenir le message) :

string public lemessage;


On déclare sa visibilité public, il existe 4 types de visibilités (pour les variables et fonctions) sur Solidity:

  1. external : La variable peut être appelée par d’autres contrats ou transactions, mais pas à l’intérieur d’un contrat, ce qui oblige à utiliser ‘this.message’ au lieu de ‘message’ par exemple. C’est recommandé uniquement pour une fonction qui reçoit de gros volumes de données (tableau multidiffusion par exemple)
  2. public : une variable publique classique avec on un ‘getter’ automatique
  3. internal : L’appel ne peut se faire que par le contrat ou un contrat hérité
  4. private : uniquement sur le contrat (pas d’héritage)

Ensuite, on déclare notre constructeur, dans Solidity, il suffit d’appeler une fonction avec le même nom que le contrat (mise à jour du 18/12/18, le constructeur ne peut plus porter le nom du contrat, il faut remplacer par constructor() ). Il faut bien réfléchir à cette fonction car elle ne peut être appelée qu’une seule fois à la création du contrat. Ici, notre fonction prendre un unique paramètre avec le messsage original :

    constructor(string _messageoriginal) public {

        lemessage = _messageoriginal;

    }

Il nous faut ensuite une fonction qui permet de remplacer le message par un nouveau (le ‘setter’), nous l’appellerons ‘definirMessage’ :

    function definirMessage(string memory _nouveaumessage) public{

    lemessage = _nouveaumessage;

    }

Enfin, il nous faut une fonction pour voir le message, que nous appellerons simplement ‘voirMessage’ :

    function voirMessage() public view returns (string memory ){  

        return lemessage;

    }


Une fonction peut être déclaré comme ‘view’ si elle ne modifie pas la blockchain, et comme ‘pure’ si elle ne lit ni ne modifie rien.

Notre contrat est complet et doit ressembler maintenant à ceci :

pragma solidity ^0.5;

contract Message {

    string public lemessage;

    constructor(string memory  _messageoriginal) public {

        lemessage = _messageoriginal;

    }

    function definirMessage(string memory  _nouveaumessage) public{

    lemessage = _nouveaumessage;

    }

    function voirMessage() public view returns (string memory){  

        return lemessage;

    }

}

C’est terminé, il vous suffit maintenant de cliquer sur ‘start to compile’ en haut à droite dans l’onglet ‘compile’ pour compiler le smart contract. Ensuite, cliquer sur ‘run’, et choisissez l’environnement ‘Javascript VM’.
Un peu plus bas, juste à gauche de ‘Create’, entrer le premier message de l’application qui sera inclut dans le constructeur, n’oubliez pas de mettre les guillemets autours, comme à chaque fois que vous mettrez quelques choses dans Remix (à part les chiffres pour les integer), c’est simplement du au fait que nous sommes en javascript.

Maintenant que tout est prêt, cliquez sur ‘Create’ pour déployer le smart contract dans la blockchain, vous devriez voir ceci :

Vous pouvez maintenant interagir grâce aux différents boutons en bas de la colonne de droite :
– Le bouton bleu voirMessage affichera dans la console la variable ‘lemessage’
– Le bouton ‘lemessage‘ affichera logiquement le message (grâce au getter automatique de solidity)
– le bouton ‘definirMessage‘ appellera notre fonction du même nom pour remplacer le message du contrat (n’oubliez pas les guillements)

Si vous regardez la console, vous verrez pour chaque transaction 2 boutons ‘détails’ et ‘debug’.
Le bouton détail donnera des informations les adresses de l’expéditeur et du récepteur de la transaction, mais également le coût en gaz de celle ci.
Le bouton débug lancera le débogueur détaillé avec toutes les étapes, les habitués de Visual Studio s’y retrouveront rapidement.

Si vous regardez le détail de la transaction Message.definirMessage, vous verrez… qu’on ne voit pas grand chose, même pas le nouveau message. Ce n’est pas trop gênant ici car la fonction est simple, mais s’il s’agissait de quelque chose de plus complexe, ce serait rapidement ennuyeux (le par étape a ses limites) pour les tests ou les corrections de bugs.

Nous allons donc utiliser le gestionnaire d’événement Events de Solidity qui permet de faire des callback en javascript pour l’interface d’une dApp (ici c’est Remix qui sert d’interface pour notre dApp).

Créons donc l’événement MessageModifie qui prendra le _nouveaumessage en paramètre, au début du fichier dans la déclaration des variables :

event MessageModifie(string _nouveaumessage);

Et enfin utilisons-le dans la fonction definirMesssage qui devient maintenant:

    function definirMessage(string memory _nouveaumessage) public{

    lemessage = _nouveaumessage;

    MessageModifie(_nouveaumessage);

    }

Vous pouvez à nouveau compiler le contrat et le lancer, changer le message et consulter le détail d’une transaction definirMessage, vous verrez maintenant le détail dans la partie logs :

Bravo ! C’est terminé ! Vous connaissez maintenant les grands principes de Remix pour créer un contrat, le compiler, le lancer et le tester, et utiliser le gestionnaire d’événement.

Nous verrons dans la suite comment le déployer sur la bockchain réel (de test, ou l’ETHER ne vaut rien, mais qui fonctionne exactement comme la vrai), comment analyser les transactions et suivre un contrat avec tout son historique, qui rappelons le est public !

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.