Tutorial Solidity : Créer un contrat depuis un autre contrat.

0

Lors de la création d’un smart contract, on peut être amené à vouloir créer un contrat depuis un autre contrat, c’est tout à fait possible en Solidity et il est même possible lors de la création d’envoyer l’adresse du contrat source au contrat nouvellement créé pour garder un lien entre les deux.

C’est ce que nous allons réaliser dans ce tutorial en créant un contrat intelligent pour un carnet d’entretien d’un véhicule, qui va stocker une liste de tous les entretiens effectués. Le carnet d’entretien est évidemment un domaine ou la blockchain a un rôle important à jouer, notamment lors de la revente, garantissant à l’acheter de connaitre précisément l’historique du produit qu’il achète. Qui lors de l’achat d’une voiture d’occasion n’a pas rêver de disposer d’un document qui retrace réellement et avec certitude le passé de celle-ci ?

L’objectif est ici de développer 2 contrats en Solidity :

  • Un premier contrat CarnetEntretien dont le rôle sera de créer les contrats Entretien, la logique est de créer un nouveau contrat à chaque entretien, et de stocker la liste dans le carnet
  • Un deuxième contrat Entretien, créé uniquement par le premier, qui recevra dans son constructeur deux paramètres : une description et une adresse Ethereum du carnet du véhicule concerné.

Pour réaliser ce tutorial, vous pouvez utiliser l’IDE Remix, qui existe désormais dans une version desktop, ce qui permettra de se familiariser avec une version à jour.

Commençons par créer la structure du contrat pour les entretiens:

// SPDX-License-Identifier: GPL-3.
pragma solidity ^0.7.4;

contract Entretien {
    
}

Pour simplifier l’exemple ce contrat ne contiendra que 2 variables, la description de l’entretien et l’adresse Ethereum du carnet d’entretien du véhicule auquel il appartient, ce sont ces deux paramètres qui sont reçus dans le constructeur :

contract Entretien {

   string description;
   address vehicule;

   constructor (string memory _description, address _adressevehicule) 
   {
      description = _description;
      vehicule = _adressevehicule;
   }
    
}

Enfin, ajoutons deux fonctions pour consulter la description de l’entretien et récupérer ladresse du véhicule, le contrat finalisé devient alors :

contract Entretien {
    
   string description;
   address vehicule;

   constructor (string memory _description, address _adressevehicule) 
   {
      description = _description;
      vehicule = _adressevehicule;
   }
   
   function voirladesc() public view returns(string memory) {
      return description;
   }
   
  function voirlevehicule() public view returns(address) {
      return vehicule;
   }
   
}

Il faut maintenant créer le contrat qui va s’occuper de créer et lister tous les entretiens qui ont lieu sur le véhicule, il doit donc avoir un tableau des entretiens qu’on appelle listentretien :

contract CarnetEntretien {
   Entretien[] listeEntretiens;   
}

Nous allons maintenant créer une fonction pour créer un entretien, avec en paramètre la description de celui-ci, et l’adresse Ethereum du carnet que l’on récupère avec address(this), sans oublier d’alimenter notre liste avec la directive .push :

   function creerEntretien(string memory _description) public {
      Entretien nouveauEntretien = new Entretien(_description, address(this));            
      listeEntretiens.push(nouveauEntretien);  
   }

Enfin, nous allons créer une fonction pour lister toutes les adresses Ethereum des contrats Entretiens, permettant de voir toute l’historique du véhicule :

   function voirLesEntretiens() public view returns(Entretien[] memory) {
      return listeEntretiens;
   }

Le contrat terminé se présente ainsi :

contract CarnetEntretien {
    
   Entretien[] listeEntretiens;
   
   function creerEntretien(string memory _description) public {
      Entretien nouveauEntretien = new Entretien(_description, address(this));            
      listeEntretiens.push(nouveauEntretien);  
   }
   
   function voirLesEntretiens() public view returns(Entretien[] memory) {
      return listeEntretiens;
   }
}

Dans remix, ajoutez les contenus des contrats dans un fichier sol :

Puis cliquez en haut à gauche pour le compiler :

Puis dans l’icone en dessous pour le déployer (La javascript VM est suffisante, mais vous pouvez utiliser Ganache pour un environnement plus réaliste) :

Vous voyez alors votre contrat apparaitre en bas à gauche avec son adresse, dans le champs texte devant Creer entretien, entrez un texte « Changement des roues avant » puis cliquez sur le bouton orange pour que notre contrat créé lui même un nouveau contrat :

Vous pouvez ensuite récupérer l’adresse du contrat de cet entretien en cliquant sur ‘VoirLesEntretiens’, elle apparaitra juste en dessous :

Nous allons maintenant nous connecter sur ce nouveau contrat pour vérifier qu’il contient bien la description de notre entretien et l’adresse Ethereum du carnet.
Pour cela, commencez par copier l’adresse récupérée ci avant dans le champs ‘At Address’, sans oublier dans la liste déroulante « CONTRACT’ de choisir le type de contrat Entretien, car Remix à compilé les deux contrats et cela nous permet d’utiliser l’ABI du deuxième contrat, indispensable pour communiquer avec lui (Ethereum nécessite de connaitre l’adresse ET l’ABI pour communiquer avec un contrat) :

Le contrat apparait alors en bas à gauche à la suite de celui du carnet, ce qui permet d’appeler nos fonctions et de constater que nous récupérons bien la description de l’entretien et l’adresse du carnet :

C’est terminé ! Nous voyons qu’il est facile en Solidity de créer un ou plusieurs contrats depuis un autre.
Le code source complet du tutorial est disponible sur Github.

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.