Exercice - Rédiger un contrat intelligent

Effectué

Dans cette unité, nous allons ajouter un nouveau contrat intelligent au newSolidityProject que nous avons créé précédemment.

Créer un contrat d’expédition

Le contrat intelligent que vous allez créer effectue le suivi de l’état des éléments achetés sur une place de marché en ligne. Lorsque le contrat est créé, l’état de l’expédition est défini sur Pending. Lorsqu’un article est expédié, l’état de l’expédition est défini sur Shipped et un événement est émis. Une fois la livraison exécutée, l’état d’expédition de l’élément est défini sur Delivered et un autre événement est émis.

Pour commencer cet exercice :

  1. Dans le projet que vous avez créé, dans le répertoire des contrats, cliquez avec le bouton de droite sur le dossier et choisissez de créer un nouveau fichier appelé Shipping.sol.

  2. Copiez le contenu du contrat suivant et collez-le dans le nouveau fichier.

    pragma solidity >=0.4.25 <0.9.0;
    
    contract Shipping {
        // Our predefined values for shipping listed as enums
        enum ShippingStatus { Pending, Shipped, Delivered }
    
        // Save enum ShippingStatus in variable status
        ShippingStatus private status;
    
        // Event to launch when package has arrived
        event LogNewAlert(string description);
    
        // This initializes our contract state (sets enum to Pending once the program starts)
        constructor() public {
            status = ShippingStatus.Pending;
        }
        // Function to change to Shipped
        function Shipped() public {
            status = ShippingStatus.Shipped;
            emit LogNewAlert("Your package has been shipped");
        }
    
        // Function to change to Delivered
        function Delivered() public {
            status = ShippingStatus.Delivered;
            emit LogNewAlert("Your package has arrived");
        }
    
        // Function to get the status of the shipping
        function getStatus(ShippingStatus _status) internal pure returns (string memory) {
         // Check the current status and return the correct name
         if (ShippingStatus.Pending == _status) return "Pending";
         if (ShippingStatus.Shipped == _status) return "Shipped";
         if (ShippingStatus.Delivered == _status) return "Delivered";
        }
    
       // Get status of your shipped item
        function Status() public view returns (string memory) {
             ShippingStatus _status = status;
             return getStatus(_status);
        }
    }
    
  3. Examinez le contrat pour voir ce qui se passe. Confirmez que vous pouvez générer le contrat avec succès.

  4. Dans le volet Explorer, cliquez avec le bouton de droite sur le nom du contrat, puis sélectionnez Générer des contrats pour compiler le contrat intelligent.

Ajouter une migration

Nous allons maintenant ajouter un fichier de migration pour pouvoir déployer le contrat sur le réseau Ethereum.

  1. Dans le volet Explorer, pointez sur le dossier des migrations et choisissez Nouveau fichier. Nommez le fichier 2_Shipping.js.

  2. Ajoutez ce code au fichier :

    const Shipping = artifacts.require("Shipping");
    
    module.exports = function (deployer) {
      deployer.deploy(Shipping);
    };
    

Déployer

Ensuite, assurez-vous que vous pouvez déployer correctement le contrat avant de continuer. Cliquez avec le bouton de droite sur le nom du contrat, puis sélectionnez Déployer des contrats. Dans la fenêtre qui s’affiche, sélectionnez développement, puis attendez que le déploiement se termine.

Regardez les informations dans la fenêtre de sortie. Recherchez un déploiement de 2_Shipping.js.

Screenshot showing the output window for the shipping contract migration.