Caso práctico: cadena de suministro
Clase 8 de 11 • Curso 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.