Solidity : héritage et interface

0

Nous allons voir dans ce tutorial Solidity comment est géré l’héritage et comment créer une interface. Quels sont les avantages de ces deux notions ? – Pour l’héritage, en solidity comme dans n’importe quel langage cela permettra qu’un contrat « hérite » des caractéristiques d’un autre contrat, et donc d’utiliser ses variables et fonctions. – Concernant l’interface, cela sera très pratique pour faire communiquer des smart contrats entre eux. Pour voir comment cela fonctionne, nous allons repartir du code du contrat de messagerie utilisé jusqu’ici pour lui ajouter une nouvelle fonctionnalité : La limitation à 280 caractères des messages (comme sur Twitter). Nous verrons comment ajouter cela par héritage et par interface. Voici son code depuis le dernier tutorial :

pragma solidity ^0.5;
  
contract message {
      
    string lemessage;
    event MessageModifie(string _nouveaumessage);
    address proprietaire;
 
    constructor() public {
        proprietaire = msg.sender;
    }
      
    function definirMessage(string memory  _nouveaumessage) public{
       //require(msg.sender == proprietaire);
       lemessage = _nouveaumessage;
       emit MessageModifie(_nouveaumessage);
    }
      
    function voirMessage() public view returns (string memory  ){  
        return lemessage;
    }
     
    function voirProprietaire() public view returns (address){  
        return proprietaire;
    }
}
Celui-ci a été modifié pour correspondre à la nouvelle version de Solidity, puisque depuis la version 0.4.22 il ne faut plus utiliser le même nom que le contrat pour le constructeur de celui-ci, mais à la place le mot clé construtor . Aussi, la sécurité pour bloquer la modification de message uniquement par le propriétaire du contrat a été commentée pour que celui-ci puisse être appelé par le contrat avec une interface. Pour étendre les fonctionnalités de notre contrat avec une limite à 280 caractères, il suffit d’ajouter dans la définition de celui-ci : contract nouveaucontrat is anciencontrat , ce qui donne ici (vous pouvez simplement ajouter ce code à la fin du fichier message.sol) :
contract message280 is message {
    function definirMessage(string memory _nouveaumessage) public{
        if(bytes(_nouveaumessage).length < 280){
            lemessage = _nouveaumessage;
        }
        else{
            emit log("Message trop long");
        }
    }
}
Vous voyez aussi l’ajout d’un test pour vérifier la longueur du string reçu. Pour compter sa taille simplement, celui-ci est converti en bytes (car le type string est en fait un array d’un ensemble de bytes dans Solidity) puis on utilise un classique .length qui renverra en uint la taille de la chaîne. Enfin, si le message est trop long, on renvoie en log « Message trop long » pour avertir du problème.

Solidity : Utilise un contrat depuis un autre avec une interface

Nous allons maintenant voir comment utiliser notre contrat « message » (dont le code est en début d’article) depuis un autre contrat, qui s’occupera lui de faire le contrôle sur la taille de la chaîne de caractère avant de modifier le message. Pour faciliter le test, nous allons cette fois limiter à 5 caractères la taille du message. Depuis Remix, créez un nouveau fichier message5.sol Nous allons commencer par déclarer l’interface, avant de voir comment l’utiliser. Pour créer une interface, il faut déclarer le contrat d’origine avec les fonctions que nous utiliserons du contrat d’origine. Ici une seule fonction sera utile, à savoir « definirMessage ». Il faut simplement déclarer la fonction mais sans mettre le corps de celle-ci, on remplacera { et } par un simple ; ce qui donne pour l’instant dans notre fichier message5.sol :
pragma solidity ^0.4.23;

contract message {
function definirMessage(string _nouveaumessage) public;
}
Maintenant que l’interface est prête, nous allons créer un contrat message5 qui dans son constructeur prendra l’adresse du contrat d’origine, nous l’appellerons address contratsource;, celle-ci sera utilisée ensuite pour se connecter au contrat d’origine. Ensuite, nous initialisons la connexion au contrat d’origine avec la ligne message m = message(contratsource); Nous allons aussi redéfinir la fonction definirMessage pour ajouter le contrôle sur la taille du message, comme déjà fait précédemment avec if(bytes(_nouveaumessage280).length < 5) Ce qui donne alors :
pragma solidity ^0.5;
 
contract message5  {
     
    address contratsource;
     
    constructor(address _addr) public{
        contratsource = _addr;
    }
     
    function definirMessage(string memory _nouveaumessage280) public {
        if(bytes(_nouveaumessage280).length < 5){
        message m = message(contratsource);
        m.definirMessage(_nouveaumessage280);
        }
    }
}
 
contract message {
    function definirMessage(string memory  _nouveaumessage) public;
} 
Pour tester, compilez l’ensemble, et commencez par créer un contrat ‘message’, qui apparaîtra alors dans la colonne de droite de Remix. Copiez son adresse, puis dans la liste déroulante au dessus du bouton ‘Create’, choisissez le contrat message5, et juste à gauche dans le champ texte ou il est écrit address _addr, copiez l’adresse du contrat message déployez juste avant. Validez ensuite en cliquant sur Create. Une fois fait, définissez un premier message avec un texte. Puis tentez de le modifier dans la fonction definirMessage du nouveau contrat. Vous pouvez vérifier que cela fonctionne en utilisant la fonction ‘voirMessage’, et vous constaterez que le message ne se modifie que lorsque vous entrez un texte de moins de 5 caractères. Vous avez désormais un exemple d’héritage en solidity et un autre exemple d’une interface fonctionnelle, qui pourront être utilisés sur des cas plus complexes.

Importer le code d’un contrat dans un autre

Vous pourriez souhaiter, pour rendre votre code plus propre et mieux organisé, mettre l’interface dans un autre fichier. C’est possible simplement en utilisant ‘import’ en début de fichier sans oubliez si vous êtes dans Remix d’ajouter le répertoire browser en début d’adresse, comme ceci : import "browser/interfacemessage.sol";

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.