Pas à pas : créer un Smart Contract pour la blockchain Etherium

On dit que les cryptomonnaies pourraient rendre service aux non bancarisés, du coups pour des premiers pas sur la blockchain j'ai implémente en Smart Contract pour Daret, un prêt solidaire qui se base sur un principe simple : chaque participant paye une somme fixe chaque mois, et, à tour de rôle, chacun parmi les participants reçois la somme totale collectée pendant le mois.

Entrée sur la blockchain Etherium:

Pour utiliser une cryptomonnaie on doit installer une application Wallet (porte monnaie électronique). Dans ce Wallet on génère une adresse (sorte de numero de compte) qui pourra recevoir et envoyer de l'"argent". C'est à la fin comme le E-Banking de votre banque: on a des comptes, un solde, on peut réaliser des transferts … sauf qu'il n'y a pas de banque derrière.

 

Enfin, le "compte" (adresse) Etherium n'est pas disponible en EUR ou en MAD mais en une "devise spéciale" : l'ETH (ether). Pour l'alimenter il faudra donc échanger de la monnaie locale contre de l'ETH. A priori ça se fait bien sur des Marketplace sur internet mais je regarderai ça quand j'en serai là. 

Daret sur Etherium

Pour mettre en place notre Daret on va supposer que chaque participant a installé un Wallet et a donc une adresse avec quelques ETH. Il faut alors écrire un Smart Contract qui recevra chaque mois les contributions de chacun et transférera la somme à la bonne personne selon l'ordre défini.

Vous avez dit Smart Contract  ?

Avec première vue avec un oeuil de POO, j'ai l'impression que créer un Smart Contrat revient à définir une classe (avec attributs et methodes donc) et l'instancier "dans" la blockchain. A la différence d'un "new" qui instancie en mémoire est que une instance de cette classe sur la blockchain ne peut plus être contrôlée par personne : Elle "vit" sa vie sur la blockchain, et les seules interactions possibles sont les appels de methode et la lecture de ses attributs publics. On ne peut même pas la mettre à jour, la detruire ou en faire quoi que ce soit.

Cela se fait dans un langage spécial appelé Solidity. Voila mon Smart Contract Daret :

(Source récupérable sur mon github : https://github.com/omarbenhamid/pret-daret-sur-etherium/blob/2e7baa232463491cb12fb37a28ec19579404a357/daret.sol)

Je ne vais pas commenter plus, les adeptes de POO reonnaîtront la structure de classe à ceci près que ça s'appelle "contract" et non classe.

Utiliser le Smart Contract 

Pour le faire professionnellement, il y a tout un SDK pour compiler, tester et instancier (déployer) ce Smart Contract sur la blockchain, mais pour les premier pas, ce tutoriel très intéressant m'a fait découvrir : Remix, L'IDE 100% en ligne d'Etherium ou j'ai pu en quelques clics tester mon Smart Contract.

Donc sur https://remix.ethereum.org/

  1. J'ai cliqué sur le petit "plus" pour créer daret.sol

  2. Mis le contenu du Smart Contract dans la fenêtre centrale. 

  3. Choisi la version (0.4.25 pour moi).

Ensuite, c'est extrêmement simple d'"instancier" (ie. Deployer) ce contrat :

  1. J'ai cliqué sur l'onglet "run"

  2. Un champs me demande uint256_mensulaiteEther (ce qui correspond au paramètre de mon constructeur) j'ai donc choisi 2 ether par mois comme contribution par participant.

  3. J'ai enfin cliqué Deploy.

Quasi immédiatement, un bloc est apparu en bas de la page me permettant d'appeler les méthodes du contrat et d'en consulter les attributs.

 

Première interaction avec le Smart Contract

Avant d'utiliser notre Smart Contract notons 3 choses :

  1. On est en train d'utiliser l'environnement de test JavaScript VM : le smart contract ne va pas vraiment sur une blockchain, c'est juste une simulation. Remix offre d'autres choix qui devrais certainement me permettre de déployer ailleurs … on verra.

  2. Remix offre dans cet environnement des "comptes" de test : le numéro commançant par 0xca3… est l'adresse (en quelque sorte votre IBAN sur la blockchain). Chaque compte compte au départ 100 ether.

  3. Bonne nouvelle, cliquer sur le petit (+) permet d'ajouter autant de comptes que vous voulez pour vos tests. Si vous voulez tester avec 4 participants par exemple, vous pourrez créer 4 comptes.

On va maintenant tenter une inscription. Vous verrez dans le compte de la "methode" inscription() qu'il est exigé que "msg.value == mensualite", "msg.value" est la quantité d'ETH que l'utilisateur a envoyer au contrat en appelant la methode. On exige en effet qu'à l'inscription le participant paye le premier mois.

J'ai donc tenté de m'inscrire :

  1. J'ai choisi un compte.

  2. Saisi une valeur de 2 (et bien choisi l'unité ether).

  3. Puis cliqué sur "inscription"

Visiblement, ça a marché ! j'ai eu une coche verte dans les logs 

Quand il y a une erreur, c'est plutôt la croix rouge qui apparaît.

Pour contrôler que je me suis bien inscrit, j'ai aussi lu la cellule 0 du tableau "particpants" :

  1. J'ai donc cliqué sur "participants"

  2. Saisi un index (0 par exemple pour lire le premier du tableau)

  3. Cliqué sur "call"

Et l'adresse retournée correspond bien à l'adresse qui s'est inscrite.

Je ne vais pas détailler la suite, mais globalement j'ai :

  1. Appelé inscription() 4 fois avec 4 adresses différentes.

  2. Cliqué sur executerMoisCourrent() : le premier participant a reçu la somme collectée.

  3. Applé payer() en envoyant 2 ETH par participant, puis executerMoisCourrent() : le second participant a reçu 8 ETH …

  4. J'ai bien testé aussi : si un participant ne paye pas, executerMoisCourrent() échoue.

Une note sur le gas

Vous noterez qu'à chaque fois que vous faite une transaction le compte actif perd quelques pouillèmes d'ETH, c'est le coût que vont recevoir les ordinateurs connectés à la blockchain qui vont exécuter le code de l'appel demandé et valider la transaction (une sorte de coût de hosting). Ce temps de calcul est comptabilisé en "gas" et chaque unité de "gas" coute quelques wei (un wei est un milliardième de milliardième d'ETH).

Pour finir ?

J'ai aussi tout de même découvert que, quand executerMoisCourent() échoue le Smart Contract n'explique jamais pourquoi, il faut probablement ajouter une méthode pour expliquer l'échec, lister les impayés …. Bien entendu, tout lecteur de ce post est appelé à forker et améliorer ce contrat sur github : https://github.com/omarbenhamid/pret-daret-sur-etherium

La suite serait de réellement déployer sur un testnet (une blockchain de test), puis de développer une DApp : une appli conviviale qui permet d'utiliser ce contrat.

Mais au bout du compte, la question reste ouverte : Croyez-vous vraiment que la blockchain peut servir aux non-bancarisés ?