Solidity : transférer des Ether, rendre une fonction payante

1

Une des fonctionnalités les plus intéressantes de la blockchain est de disposer d’un tiers de confiance très sécurisé pour manipuler des fonds, à des coûts très faibles et avec une réactivité très importante. Vous pouvez transférer des sommes très importantes en quelques secondes, la ou votre banque actuelle mettra plusieurs jours pour faire un virement.

Nous allons voir que Solidity permet de manipuler la monnaie liée à la blockchain Ethereum, à savoir l’Ether, dont le symbole est ETH.

Repartons de notre contrat habituel qui permet de laisser stocker un message dans la blockchain :

pragma solidity 0.5;

contract message {
      
    string lemessage;
 
    constructor() public {
    }
      
    function definirMessage(string memory _nouveaumessage) public {
       lemessage = _nouveaumessage;
    }
      
    function voirMessage() public view returns (string memory){  
        return lemessage;
    }
    
}

Nous souhaitons le modifier pour rendre la fonctionnalité de modification du message payante. 
Nous devons donc modifier la fonction definirMessage pour :
– Lui permettre de manipuler des Ether : nous devons ajouter dans sa déclaration qu’elle devient ‘payable’
– Définir un niveau de frais en ETH
– Le rendre obligatoire pour modifier le message
– Procéder au transfert d’argent 

Donner la possibilité au smart contract de manipuler des Ether

Pour qu’un contrat puisse envoyer ou recevoir des ETH, il doit obligatoirement contenir une fonction « payable ».
Par exemple un contrat tout simple maBanque pour stocker des Ether pourrait qui permet uniquement les recevoir et afficher le solde donnerai :

pragma solidity 0.5;

contract maBanque {
    function() payable external {}
    
    function afficherBalance() public view returns (uint  ){
        return address(this).balance;
    }
}

Il est totalement déconseillé d’utiliser ce contrat ainsi car il ne contient aucune fonction pour récupérer les ETH, qui seraient ainsi ‘coincé’ sur la blockchain.

Pour revenir à notre contrat, nous allons simplement lui ajouté le mot clé payable dans sa déclaration, qui devient alors :

function definirMessage(string memory _nouveaumessage) public payable

Définir un niveau de frais

Pour que notre contrat nous fasse gagner de l’argent, la fonctionnalité de modification du message devient payante, et pour cela nous devons lui indiquer le niveau de frais souhaité. Il sera fixé arbitrairement pour l’exemple à 0.001 ETH.
Nous allons alors ajouter la ligne suivante au début de la fonction definirMessage :

uint frais = 0.001 ether;

Rendre les frais obligatoires

Maintenant que le niveau de frais est défini, encore faut-il que notre code oblige le paiement de ceux ci.
Il existe ici la fonction déjà présentée dans un précédent tutorial : require, qui permettra justement de valider que le montant d’ETH contenu dans la transaction permet de payer les frais.
Pour cela, nous allons utiliser la variable spéciale liée aux transactions msg.value qui représente le nombre de wei (la plus petite division de l’Ether) contenu dans la transaction.
Nous allons donc ajouter dans la fonction la ligne suivante :

require(msg.value == frais);

Transférer des ETH en Solidity

Maintenant que le montant des frais est défini et obligatoire, nous allons procéder au transfert d’argent vers le compte 0x6a71dD5A02F8BA10e097890046872847900E818C, en utilisant la fonction .transfer
Depuis la version 0.5 de Solidity, il est obligatoire d’utiliser d’utiliser une address de type payable pour transférer des fonds, ce qui donne :

address payable monPortefeuille = address(
0x6a71dD5A02F8BA10e097890046872847900E818C);
monPortefeuille.transfer(msg.value);

Voici le code complet du contrat terminée :

pragma solidity 0.5;

contract message {
      
    string lemessage;
 
    constructor() public {
    }
      
    function definirMessage(string memory _nouveaumessage) public payable{
       uint frais = 0.001 ether;
       require(msg.value == frais);
       address payable monPortefeuille = address(0x92839d69320d8117b26219B5dFd355D2A748b821);
       monPortefeuille.transfer(msg.value);
       lemessage = _nouveaumessage;
    }
      
    function voirMessage() public view returns (string memory){  
        return lemessage;
    }
}

Tester le smart contract qui transfère des ETH

Deux solutions sont possibles pour tester que tout fonctionne bien. Il faudra tout d’abord compiler le contrat maBanque puis obtenir son adresse (l’avantage est qu’il permet d’afficher le solde en ETH pour vérifier que l’argent a bien été transféré), et ensuite compiler le contrat message pour modifier la blockchain en payant les frais de transaction.
Tout cela peut être fait depuis Remix , en utilisant dans l’onglet Run la JavascriptVM ou l’InjectedWeb3 (à condition d’utiliser Metamask)

1 COMMENTAIRE

  1. Bonjour,

    Je voudrais utiliser cette fonction dans une page web avec la possibilité pour le client de rentrer la somme qu’il veut transférer sur le compte.

    Pouvez vous m’aider ?

    merci à vous

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.