
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 :
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;
}