Sécuriser un smart contrat avec un modificateur (modifier) et découverte d’OpenZeppelin

0

Nous avons déjà vu lors d’un précédent tutorial comment définir le propriétaire d’un smart contrat. Nous allons cette fois réaliser cette opération en utilisant ce qui s’appelle sur Solidity un ‘modificateur’ (modifier en anglais).

L’intérêt d’un Modifier est d’exécuter une fonction juste avant une autre, c’est donc souvent utilisé pour des contrôles (typiquement « est-ce que celui qui exécute le contrat est bien son propriétaire »).

Déclarer un modifier se fait comme pour une fonction avec le mot clé modifier, puis le code de la fonction.

Plutôt que de créer manuellement le code de vérification, nous allons importer un smart contrat simple qui gère déjà plusieurs possibilités pour la gestion de propriété d’un contrat, il s’agit du contrat « Ownable » d’OpenZeppelin. Il s’agit d’une librairie de contrats Open Source centrée sur la sécurité avec une centaine de contributeurs.

Le premier contrat que nous allons utiliser, Ownable.sol, permet de :
– Définir le propriétaire d’un contrat
– Utiliser un modifier pour vérifier le propriétaire d’un contrat
– Transférer la propriété d’un contrat

Voici son code (que vous pouvez coller dans Remix)

pragma solidity ^0.4.23;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

Vous pouvez dans Remix créer un fichier Ownable.sol et copier le code précédent, puis dans un autre fichier message.sol, nous allons utiliser le code de messagerie déjà créé dans un autre tutorial, :

pragma solidity ^0.4.23;

contract message {
   
    string lemessage;
    address proprietaire;

    constructor() public {
        proprietaire = msg.sender;
    }
     
    function definirMessage(string  _nouveaumessage) public {
       require(msg.sender == proprietaire);
       lemessage = _nouveaumessage;
    }
     
    function voirMessage() public view returns (string ){  
        return lemessage;
    }
    
    function voirProprietaire() public view returns (address){  
        return proprietaire;
    }
}

Nous allons apporter quelques modifications à celui-ci pour prendre en compte l’utilisation de notre nous contrat avec Modifier. Tout d’abord, il faut importer le nouveau contrat en ajoutant:
import "browser/ownable.sol";

Ensuite, notre contrat message devra hériter du contrat Ownable en ajoutant : is Ownable dans sa déclaration.

Puis ensuite utiliser le modifier onlyOwner dans la fonction definirMessage , pour cela il suffit d’ajouter son nom après la visibilité, ce qui donne :
function definirMessage(string _nouveaumessage) public onlyOwner

Ainsi, ce modifier sera exécuté avant la fonction.

Pour ne pas faire doublon, nous pouvons supprimer le ‘require’ dans definirMessage puisque ce rôle est maintenant assuré par le modifier, mais également la fonction voirProprietaire puisque nous héritons d’un contrat qui possède déjà la variable public owner .

Le code finale de la messagerie maintenant est maintenant très allégé et ressemble à ceci :

pragma solidity ^0.4.23;

import "browser/ownable.sol";
 
contract message is Ownable {
     
    string lemessage;

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

Vous pouvez tester tout cela dans Remix, toujours dans l’environnement Javascript VM en compilant ce contrat, puis il faut le créer, changer ensuite l’adresse en cours d’utilisation (dans la liste déroulante juste sous ‘Environement’ dans l’onglet Run de Remix). Vous pouvez ensuite tenter de modifier le message et verrez qu’il ne bougera pas, sauf si vous resélectionnez l’adresse avec laquelle vous avez créé votre contrat.

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.