Un exemple de modificateur (modifier) Solidity avec paramètres

0

Nous avions déjà vu un exemple simple de ‘modifier’ (modificateur, qui servait avant tout de vérificateur dans cet exemple) qui permettait d’exécuter une fonction avant une autre, nous allons faire un autre exemple un peu plus compliqué qui permet de prendre en compte un paramètre utilisé à la fois dans le modifier et dans la fonction.

Pour notre exemple, nous allons repartir du contrat de message utilisé dans la plupart des tutoriaux du site, dans une version simplifiée :

 pragma solidity ^0.4.23; contract message { string lemessage; constructor() public { } function definirMessage(string _nouveaumessage) public { lemessage = _nouveaumessage; } function voirMessage() public view returns (string ){ return lemessage; } } 

Nous allons ajouter un contrôle sur la taille du message à 280 caractères. Pour rappel, c’est quelque chose que nous avions déjà fait par héritage et par interface.

Nous allons créer un modificateur qui prend deux paramètres, le message à vérifier et la limite de taille de message à appliquer :

    modifier limitMessage(string memory _nouveaumessage, uint _limitmessage) {
      require (bytes(_nouveaumessage).length <= _limitmessage);
      _;
    }


Quelques explications:
– On déclare le modifier dans solidity comme une fonction mais avec le mot clé modifier
– Les paramètres doivent être typés comme une fonction classique
– Les caractères _; indiquent simplement au modifier qu’il faut à partir de la continuer à exécuter la fonction.
– A l’intérieur, il suffit alors de mettre en place la vérification, ce qui est fait ici avec un require de Solidity

Ensuite, il faut modifier la fonction definirMessage pour lui demander d’appliquer le modifier :

    function definirMessage(string memory    _nouveaumessage) public limitMessage(_nouveaumessage, 5){
       lemessage = _nouveaumessage;
    }


Le modifier vient après la déclaration de la fonction et après la visibilité, et contient les paramètres qu’il utilisera. Le code complet devient alors :

pragma solidity ^0.5;

contract message {

    string lemessage;

    constructor() public {
    }

    function definirMessage(string memory  _nouveaumessage) public limitMessage(_nouveaumessage, 5){
       lemessage = _nouveaumessage;
    }

    function voirMessage() public view returns (string memory   ){
        return lemessage;
    }

    modifier limitMessage(string memory _nouveaumessage, uint _limitmessage) {
      require (bytes(_nouveaumessage).length <= _limitmessage);
      _;
    }

}


Vous pouvez ensuite le tester comme d’habitude dans Remix et constater son efficacité.

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.