Définir le propriétaire d’un smart contract Solidity

0

Dans ce tutoriel, nous allons repartir de notre contrat de messagerie vu à l’étape précédente.

Pour rappel voici son code complet :

pragma solidity ^0.5;

contract Message {

    string public lemessage;
    event MessageModifie(string memory _nouveaumessage);

    constructor(string _messageoriginal) public {

        lemessage = _messageoriginal;

    }

   function definirMessage(string memory  _nouveaumessage) public{

       lemessage = _nouveaumessage;

       emit MessageModifie(_nouveaumessage);

   }

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

        return lemessage;

    }

}

Nous avons un nouveau besoin, à savoir définir une adresse du propriétaire du contrat, ce qui peut avoir plusieurs utilités: bloquer certaines fonctions à un ‘administrateur’ du contrat, le sécuriser etc…

Ici, notre but est que seul le propriétaire du contrat puisse modifier le message affiché dans la blockchain. Pour cela nous allons utiliser la variable globale ‘msg.sender’, qui est une variable de type address correspondant à l’adresse de celui qui appelle le contrat (ce peut être un autre contrat, nous le verrons plus tard)

Nous allons donc tout d’abord en début de contrat créer une nouvelle variable ‘propriétaire de type address : address proprietaire;

Une fois fait, nous allons ajouter initialiser cette variable dans le constructeur de notre contrat (pour rappel celui ci n’est appelé qu’à la création du contrat, et il porte le même nom que le contrat Solidity).

Dans la fonction Message (le constructeur) nous allons ajouter :
proprietaire = msg.sender;
Ce qui permettra de définir celui qui déploie le contrat comme propriétaire de celui ci.

Enfin, la fonction definirMessage va être modifiée pour faire un test sur msg.sender et vérifier qu’il s’agit bien du propriétaire du contrat, si ce n’est pas le cas, nous allons envoyer un message à un gestionnaire d’événement créé pour l’occasion qui enverra un message indiquant que l’adresse ne correspond pas au propriétaire du contrat.

Pour le gestionnaire d’événement, il faut le créer avec les variables en début de contrat :
event Log(string _unlog);
C’est un gestionnaire généraliste qui pourra être utilisé n’importe ou pour du débug puisqu’il prend une chaine de caractères comme paramètre.

Enfin, la fonction definirMessage sera désormais ainsi :

   function definirMessage(string _nouveaumessage) public{
       if (msg.sender == proprietaire)
       {
            lemessage = _nouveaumessage;
            MessageModifie(_nouveaumessage);
       }
       else {
           Log("L'adresse ne correspond pas au propriétaire du contrat");
       }
   }

Vous voyez que Solidity permet d’utiliser toutes les structures de contrôle classiques de javascript. En fait toutes celles de javascript à part switch et goto sont disponibles, vous pouvez donc utiliser : if, else, while, do, for, break, continue, return, ? :

Notre contrat est prêt, voici son code complet (une fonction voirPropriétaire a été ajoutée pour vérifier l’adresse du propriétaire) :

pragma solidity ^0.5;

contract Message {

    string lemessage;
    event MessageModifie(string _nouveaumessage);
    event Log(string _unlog);
    address proprietaire;

    constructor(string memory  _messageoriginal) public {
        proprietaire = msg.sender;
        lemessage = _messageoriginal;
    }

   function definirMessage(string memory _nouveaumessage) public{
       if (msg.sender == proprietaire)
       {
            lemessage = _nouveaumessage;
            emit MessageModifie(_nouveaumessage);
       }
       else {
           emit Log("L'adresse ne correspond pas au propriétaire du contrat");
       }
   }

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

    function voirProprietaire() public view returns (address){
        return proprietaire;
    }

}

Vous pouvez le déployer sur Remix directement dans la javascript VM pour gagner du temps lors de votre essai. Pour tester que tout fonctionne bien, déployer le depuis une adresse, et dans Account changez celle-ci. Tenter ensuite de modifier le message dans la colonne de droite. Vous verrez alors dans les logs :

Basculez ensuite dans le compte d’origine (qui peut être vu en cliquant à droite sur ‘voirProprietaire’) et modifiez le message, vous pourrez confirmer en cliquant sur ‘voirMessage’ que la modification s’est bien faite.

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.