Solidity : les Struct pour des variables personnalisées

2

Dans ce nouveau tutorial Solidity nous allons voir comment utiliser les Struct en Solidity. Il s’agit d’un outil très flexible pour créer des structures personnalisées.
Imaginons que nous ayons besoin de créer une base de données de produit que, pour des raisons de sécurité et de traçabilité, nous souhaitons stocker dans la blockchain Ethereum, un peu comme le fait IBM avec « food trust ».

Pour chaque produit, nous souhaitons pouvoir stocker à la fois son id, son nom, et son prix.

Commençons par créer ce nouveau smart contract avec le pragma et la déclaration du contrat :

pragma solidity >=0.4.0 <0.6.0;

contract GestionProduit {
    constructor() public {
    }
}

Pour l’instant, celui ci ne fait pas grand chose, nous allons lui déclarer notre Struct aini :

    struct Produit {
        uint idProduit;
        string nomProduit;
        uint Prix;
    }

On voit donc qu’un struct est très puissant puisqu’il peut contenir tous les types de variables. Il s’agit alors d’une véritable base de données dans la blockchain. Cet exemple reste le plus accessible possible pour montrer le fonctionnement du struct, mais il pourrait l’être beaucoup moins par le fait qu’un struct peut contenir des tableaux ou des mapping.

C’est également très souple puisqu’il possible de faire un tableau de struct, qui devient un type de variable à part entière que l’on peut utiliser, comme un int ou string.

Pour illustrer cela, nous allons créer un tableau ‘produits’ avec des structs Produit. Nous allons le déclarer ainsi (en privé pour des raisons de sécurité) :

Produit[] private produits;

Ce tableau doit pouvoir être alimenté, pour cela il est nécessaire de créer une fonction ajouterProduit qui prend en paramètre les 3 variables de notre structure :

    function ajouterProduit (uint _id, string memory _nomProduit, uint _prix) public {
        Produit memory nouveauProduit = Produit(_id, _nomProduit, _prix);
        produits.push(nouveauProduit);
    }

Nous allons aussi, pour vérifier que tout fonctionne bien, créer deux fonctions, l’une pour compter le total des produits contenus dans le tableau produits, et l’autre pour vérifier un produit depuis son id:

    function totalProduit() public view returns (uint)  {
        return produits.length;
    }
    
    function voirUnProduit(uint i) public view returns (string memory)  {
        return produits[i].nomProduit;
    }

C’est terminé, voici le code complet du contrat :

pragma solidity >=0.4.22 <0.6.0;

contract GestionProduit {
    
    constructor() public {
    }
    
    struct Produit {
        uint idProduit;
        string nomProduit;
        uint Prix;
    }
    
    Produit[] private produits;
    
    function ajouterProduit (uint _id, string memory _nomProduit, uint _prix) public {
        Produit memory nouveauProduit = Produit(_id, _nomProduit, _prix);
        produits.push(nouveauProduit);
    }
    
    function totalProduit() public view returns (uint)  {
        return produits.length;
    }
    
    function voirUnProduit(uint i) public view returns (string memory)  {
        return produits[i].nomProduit;
    }
    
}

Vous pouvez le tester comme d’habitude sur Remix dans la javascript VM.

2 Commentaires

  1. Bonjour,
    j’essaye d’exécuter cet exemple en ajoutant des produits avec in identifiant unique, ma boucle for que j’utilise pour parcourir le tableau des produits afin de vérifier l’existence d’un identifiant avant d’ajouter un produit ne marche pas, elle vérifie pour le premier élément uniquement.

    C’est quoi le soucis svp?

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.