Caso práctico: cadena de suministro

Clase 8 de 11Curso de Casos de Uso de Smart Contracts

Resumen

Desarrollar una cadena de suministros en Blockchain es un caso de uso particular y requiere de un exhaustivo análisis de los requisitos antes de escribir el código. Que todas las partes involucradas en el proceso aprueben el flujo será muy importante al escribir el código del contrato.

Imagina si desarrollas una solución, pero faltó incluir campos para guardar datos del proceso o alguna parte involucrada no está de acuerdo con algo.

Cómo implementar una cadena de suministros

La inmutabilidad de Blockchain hará que haya que desplegar el contrato nuevamente con sus respectivas comisiones a la red. A continuación podrás ver un ejemplo sencillo de implementación de una cadena de suministros en un contrato inteligente.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract SupplyChain {

    // Estructura para cada paso de la cadena
    struct Step {
        Status status;
        string metadata;
    }

    // Enumerable para determinar en qué estado se encuentra el producto
    enum Status {
        CREATED,
        READY_FOR_PICK_UP,
        PICKED_UP,
        READY_FOR_DELIVERY,
        DELIVERED
    }
// Evento para lanzar con cada nuevo Step de la cadena
event RegisteredStep(uint256 productId, Status status, string metadata, address author);

// El mapping guarda el ID de la cadena y un array asociado con cada Step de la misma
mapping(uint256 => Step[]) public products;

// Registrar nuevo producto que contendrá Steps
function registerProduct(uint256 productId) public returns (bool success) {
    require(products[productId].length == 0, "This product already exists");
    products[productId].push(Step(Status.CREATED, ""));
    return success;
}
    // Registrar un nuevo Step en un producto
    function registerStep(uint256 productId, string calldata metadata) public payable returns (bool success) {

        // Verificamos la existencia del producto
        require(products[productId].length > 0, "This product doesn't exist");
        Step[] memory stepsArray = products[productId];

        // Incrementamos en uno el estado de los Steps del producto
        uint256 currentStatus = uint256(stepsArray[stepsArray.length - 1].status) + 1;
        
        // Verificamos que no se exceda la cantidad de pasos disponible
        if (currentStatus > uint256(Status.DELIVERED)) {
            revert("The product has no more steps");
        }
``` c

        // Construimos la información del Step
        Step memory step = Step(Status(currentStatus), metadata);

        // Guardamos el Step en el array del producto
        products[productId].push(step);

        // Emitimos el evento y devolvemos un OK
        emit RegisteredStep(productId, Status(currentStatus), metadata, msg.sender);
        success = true;
    

Define la cantidad de pasos que necesita un producto para ser producido. Los mismos suelen tener un orden predefinido aunque, dependiendo la regla de negocio, puede haber pasos opcionales o retroceder en los mismos.

Desafío de la cadena de suministro

Los contratos de cadena de suministro suelen permitir pagos. Retienen ETH hasta su posterior liberación por parte del usuario para el pago inmediato a una parte involucrada.

El desafío para ti es agregar estos pagos en el flujo del contrato. Al momento de actualización del estado del producto, se debe efectuar el pago correspondiente a otra cuenta.

Una cadena de suministros en Blockchain es un caso de uso particular y complejo de desarrollar. Imagina cómo lo desarrollarías con tecnologías tradicionales como NodeJS o Java y lleva esa solución al mundo Web 3.


Contribución creada por: Kevin Fiorentino.