Esercizio: Scrivere un contratto intelligente

Completato

In questa unità si aggiungerà un nuovo contratto intelligente al progetto newSolidityProject creato in precedenza.

Creare un contratto di spedizione

Il contratto intelligente che verrà creato tiene traccia dello stato degli articoli acquistati in un marketplace online. Quando viene creato il contratto, lo stato di spedizione viene impostato su Pending. Quando un elemento viene spedito, lo stato di spedizione viene impostato su Shipped e viene generato un evento. Al momento della consegna, lo stato di spedizione dell'elemento viene impostato su Delivered e viene generato un altro evento.

Per avviare l'esercizio:

  1. Nel progetto creato, nella directory contracts fare clic con il pulsante destro del mouse sulla cartella e scegliere di creare un nuovo file con nome Shipping.sol.

  2. Copiare il contenuto del contratto seguente e incollarlo nel nuovo file.

    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. Esaminare il contratto per visualizzare la funzionalità. Verificare che sia possibile configurare correttamente il contratto.

  4. Nella finestra di esplorazione fare clic con il pulsante destro del mouse sul nome del contratto, quindi selezionare Build Contracts (Compila contratti) per compilare il contratto intelligente.

Aggiungere una migrazione

A questo punto si aggiungerà un file di migrazione per distribuire il contratto alla rete Ethereum.

  1. Nella finestra di esplorazione passare il puntatore del mouse sulla cartella migrations e scegliere New File (Nuovo file). Assegnare al file il nome 2_Shipping.js.

  2. Aggiungere il codice seguente al file:

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

Distribuisci

Ora è necessario assicurarsi di poter distribuire il contratto correttamente, prima di passare alla fase successiva. Fare clic con il pulsante destro del mouse sul nome del contratto e selezionare Deploy Contracts (Distribuisci contratti). Nella finestra visualizzata selezionare development (sviluppo) e attendere il completamento della distribuzione.

Controllare le informazioni nella finestra di output. Cercare una distribuzione di 2_Shipping.js.

Screenshot showing the output window for the shipping contract migration.