Ejercicio: Redacción de un contrato inteligente

Completado

En esta unidad, agregaremos un nuevo contrato inteligente al proyecto newSolidityProject que creamos antes.

Creación de un contrato de envío

El contrato inteligente que creará realiza un seguimiento del estado de los artículos adquiridos de un marketplace en línea. Cuando se crea el contrato, el estado de envío se establece en Pending. Cuando se envía un artículo, el estado de envío se establece en Shipped y se emite un evento. Tras la entrega, el estado de envío del elemento se establece en Delivered y se emite otro evento.

Para iniciar este ejercicio:

  1. En el proyecto que ha creado, en el directorio contracts, haga clic con el botón derecho en la carpeta y elija la opción para crear un archivo con el nombre Shipping.sol.

  2. Copie el siguiente contenido del contrato y péguelo en el nuevo archivo.

    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. Examine el contrato para ver lo que está ocurriendo. Confirme que puede compilar correctamente el contrato.

  4. En el panel Explorador, haga clic con el botón derecho en el nombre del contrato y, a continuación, seleccione Build Contracts (Compilar contratos) para compilar el contrato inteligente.

Agregar una migración

Ahora vamos a agregar un archivo de migración para que podamos implementar el contrato en la red de Ethereum.

  1. En el panel Explorador, mantenga el puntero sobre la carpeta migrations y elija Nuevo archivo. Asigne al archivo el nombre 2_Shipping.js.

  2. Agregue este código al archivo:

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

Implementación

Después, asegúrese de que puede implementar el contrato correctamente antes de continuar. Haga clic con el botón derecho en el nombre del contrato y seleccione Deploy Contracts (Implementar contratos) En la ventana que aparece, seleccione desarrollo y, a continuación, espere a que finalice la implementación.

Vea la información en la ventana de salida. Busque una implementación de 2_Shipping.js.

Screenshot showing the output window for the shipping contract migration.