Dans ce tutoriel nous allons montrer comment déployer un contrat intelligent sur la plateforme Ethereum. Nous créerons ce contrat sur la chaîne de blocs test d’Ethereum appelée Ropsten. Ainsi vous n’aurez pas besoin de dépenser de l’ether pour déployer et utiliser votre contrat puisque nous utiliserons des ethers tests qui n’ont pas de valeurs.
Ce tutoriel est directement inspiré du livre Mastering Ethereum de Andreas Antonopoulos et Gavin Wood. Si vous souhaitez en apprendre davantage sur la plateforme Ethereum (et que vous avez des connaissances de base en programmation) ce livre est vivement recommandé. Pour ce tutoriel, nous allons utiliser le portefeuille MetaMask afin de pouvoir dialoguer avec la chaîne de blocs Ethereum. Pour rédiger et déployer notre contrat, nous allons utiliser le site web Remix.
Étapes 1 : Obtenir de l’ether sur Ropsten avec MetaMask
MetaMask est un portefeuille Ethereum qui fonctionne comme un plugin dans votre navigateur internet. Pour l’utiliser, vous aurez besoin de l’un des navigateurs internet suivants : Google Chrome, Opera, Brave Browser ou Firefox. Pour ce tutoriel, nous utiliserons Google Chrome. Pour télécharger MetaMask, vous pouvez utiliser le lien suivant : https://chrome.google.com/webstore/detail/metamask/. Une fois MetaMask lancé, cliquez sur "Démarrer". Il vous sera ensuite demandé si vous êtes nouveaux sur MetaMask. Cliquez sur "Oui, passons à la configuration !".
Vous pouvez ensuite choisir de partager vos données ou non avec MetaMask. Une fois cette décision faite, vous devrez ensuite choisir un mot de passe.
Une phrase secrète composée de 12 mots vous sera alors donnée. Il faudra la recopier. Si vous souhaitez, par la suite, utiliser ce portefeuille pour entreposer de l’ether, il sera préférable de recopier ces mots sur une feuille de papier et non sur votre ordinateur pour plus de sécurité.
Il vous sera ensuite demandé de recopier cette phrase.
Et voilà, vous avez terminé l’initialisation de votre portefeuille.
Nous allons maintenant voir comment obtenir de l’ether sur Ropsten, la chaîne de blocs test d’Ethereum. Cet ether est utilisé pour déployer des contrats intelligents sur le réseau de test et n’a pas de valeur.
Dans un premier temps, passons sur Ropsten. Pour cela, cliquez sur "Réseau principal Ethereum" en haut à droite et choisissez "Réseau de test Ropsten".
Cela devrait désormais être affiché en haut à gauche dans votre MetaMask. Cliquez ensuite sur "Déposer" et choisissez "Obtenir des Ether" avec le Faucet Testnet.
Cliquez ensuite sur "request 1 ether from faucet".
Vous devriez alors voir le champ transactions, plus bas, se remplir.
Si vous avez un problème pour récupérer de l’ether, vous pouvez utiliser les liens suivants pour récupérer 0,5 ETH test par lien (ne fonctionne qu’une seule fois): lien1 , lien2 et lien3. Il faudra rentrer l’adresse de votre portefeuille.
Vous avez ainsi obtenu de l’ether pour le réseau Ropsten!
Étape 2 : Rédiger un contrat intelligent sur Remix
Dans cette partie, nous allons rédiger un contrat intelligent sur lequel il sera possible de déposer de l’ether puis de le retirer. Ce type de contrat est similaire à ce que vous avez utilisé dans la partie précédente pour obtenir 1 ether.
Dans un premier temps, aller sur le site Remix : https://remix.ethereum.org
Cliquez sur l’icône "+" en haut à gauche pour créer un nouveau contrat et nommer le Faucet.sol.
Ensuite, copier-coller le programme suivant (tiré du livre Mastering Ethereum) que nous expliquerons par la suite :
// Our first contract is a faucet!
contract Faucet {
// Accept any incoming amount
receive () external payable {}
// Give out ether to anyone who asks
function withdraw(uint withdraw_amount) public {
// Limit withdrawal amount
require(withdraw_amount <= 100000000000000000);
// Send the amount to the address that requested it
msg.sender.transfer(withdraw_amount);
}
}
Vous pouvez vérifier que le code fonctionne (qu’il se compile) en cliquant sur "Solidity compiler" sur la barre latérale de gauche.
Vérifiez que le langage est bien Solidity puis cliquez sur "Compile Faucet.sol". Il est possible que vous voyiez un message d’avertissement orange, ce n’est pas grave. Si vous avez des problèmes pour compiler le code (message rouge), utilisez la version 0.6.4 ou inférieure. (La version 0.6.4 est la dernière version au moment de l’écriture de ce tutoriel.)
Détaillons maintenant ce que fait ce contrat.
Le but de ce contrat est de pouvoir envoyer de l’ether dessus puis de pouvoir le retirer en appelant une fonction tout en limitant le retrait maximum à 0,1ETH par transaction.
Dans un premier temps, il faut savoir que chaque ligne qui est précédée d'un "//" (les lignes en vertes) est un commentaire. Elles permettent seulement à une personne qui lit le code de mieux le comprendre. Les commentaires ne sont pas compilés par l’ordinateur.
Ce contrat est initialisé lors de la 2ème ligne par la commande "contract Faucet{". Faucet, ici, est le nom que nous donnons à notre contrat. Le contrat se termine à la ligne 15, lorsque la parenthèse "}" est refermée.
Dans ce contrat, il y a deux fonctions : la fonction "receive" (ligne 4) qui permet de déposer de l’ether sur le contrat est la fonction "withdraw" (lignes 7 à 14) qui permet d’en retirer.
Commençons par la fonction que nous avons appelée "withdraw". Cette fonction prend pour variable en entrée un nombre entier (unit) appelé "withdraw_amount" qui représentera le montant à retirer en Wei, (la plus petite unité d’ether, l’équivalent du satoshi pour le Bitcoin, 1Wei=0,000000000000000000001 =10^-18ETH). Cette fonction est également spécifiée étant "public". Cela veut dire qu’elle peut être appelée par un utilisateur, un contrat et même par une fonction de son propre contrat.
À la ligne 10, nous vérifions que la somme demandée pour le retrait est inférieure à 0,1ETH (soit 100000000000000000 Wei). Si ce n’est pas le cas, le programme sera stoppé. Sinon, il continuera normalement.
La ligne 13 permet d’envoyer l’ether demandé à la personne qui appelle la fonction. "msg" représente le message associé à la transaction de l’utilisateur qui lancé la transaction (qui a appelé une fonction du contrat).".sender" permet de trouver l’adresse Ethereum de cet utilisateur dans le message. Et "transfer" est une fonction Solidity qui permet d’envoyer une certaine somme d’ether à cette adresse. Ici, cette somme est représentée par "withdraw_amount".
La fonction receive à la ligne 4 est une fonction Solidity qui permet au contrat de recevoir de l’ether. Cette fonction est ainsi "payable". Une fonction qui ne possède pas la caractéristique "payable" ne pourra pas recevoir de l’ether et rejettera le paiement. Elle est également "external" ce qui veut dire qu’elle ne peut être appelée que par un utilisateur ou un autre contrat. Pas par une fonction de son propre contrat.
Ce contrat est très simple et pourrait être amélioré de bien des manières, mais il est maintenant temps de le déployer.
Étape 3 : Déployer un contrat intelligent sur la chaîne de blocs
Pour déployer ce contrat, cliquez dans un premier temps sur "deploy & run transactions" sur la barre latérale de gauche. Vérifiez ensuite que votre environnement est bien "Injected Web3" puis cliquez sur "Deploy".
Cela ouvrira MetaMask qui vous demandera de confirmer la transaction.
Après quelques secondes d’attente (temps nécessaire pour qu’un bloc contenant votre contrat soit validé par un mineur), votre contrat est déployé sur la chaîne de blocs!
Pour utiliser ce contrat, nous allons, dans un premier temps, lui envoyer de l’ether. Pour cela, copiez l’adresse Ethereum du contrat en cliquant sur le clipboard.
Ensuite, allez dans MetaMask et effectuez une transaction en cliquant sur "Envoyer". Collez l’adresse du contrat et indiquez un montant de 0.5 ETH. Vérifiez bien que vous êtes toujours sur le réseau de test Ropsten puis envoyez la transaction au contrat.
La transaction devrait prendre quelques secondes à se valider et vous aurez déposé de l’ether sur le contrat!
Pour retirer les ethers, retournez sur Remix.
En bas à gauche, dans le contrat que vous avez déployé, vous verrez qu’il est possible d’appeler la fonction "withdraw" en rentrant comme paramètre, la somme de Wei que vous voulez retirer.
Cliquez d’abord sur la petite flèche (pour faire apparaitre le bouton "transact") et entrez par exemple "100000000000000000" (avec les guillemets). Ensuite, cliquez sur "transact". Ceci ouvrira MetaMask qui vous demandera de confirmer la transaction.
Une fois cela fait et après la validation du bloc, vous recevrez 0,1ETH !
Vous pouvez appeler ce contrat plusieurs fois pour récupérer la totalité de l’ether qu’il y a dessus. Vous constaterez cependant que, une fois le contrat vidé de son ether, vous aurez un peu moins de votre ether initial. Ce qui a disparu a été dépensé en frais pour les mineurs pour déployer votre contrat puis à chaque fois que vous avez appelé une de ses fonctions.
Ainsi, nous avons vu dans ce tutoriel comment déployer un contrat sur Remix avec l’aide du portefeuille MetaMask. Nous avons également vu comment dialoguer simplement avec ce contrat en lui envoyant de l’ether puis en le retirant avec une de ses fonctions. Bien sûr, il est possible d’ajouter de nombreuses autres fonctionnalités à ce contrat. La possibilité de création est infinie!