El Sistema de Seguimiento de la Cadena de Suministro (SSCS) es una demostración del potencial de la tecnología blockchain para proporcionar visibilidad, transparencia y trazabilidad en cada etapa del proceso logístico. Utilizando la tecnología de Hyperledger Fabric, el proyecto tiene como objetivo la demostración de cómo se puede transformar la cadena de suministro convencional en un modelo eficiente, seguro y confiable.
🌠Características del proyecto
- Transparencia total
- Trazabilidad garantizada
- Roles especificos
- Gestión de assets
- Verificación del cliente
Utiliza la tecnología blockchain para mantener un registro transparente e inmutable de todas las transacciones en la cadena de suministro.
Proporciona una trazabilidad completa desde la creación de un producto hasta su entrega al cliente final, permitiendo un seguimiento detallado del mismo.
Define roles específicos como Productor, Transportador y Cliente, cada uno con permisos y accesos adaptados a sus funciones respectivas.
Permite a los distintos agentes crear nuevos productos, actualizar información relevante y transferir la propiedad de manera segura a lo largo de la cadena de suministro.
Ofrece al cliente la posibilidad de trazar la procedencia y la calidad de los productos que adquieren.
😃Beneficios
- Confianza del consumidor
- Eficiencia operativa
- Reducción de fraudes
- Cumplimiento normativo
Incremento de la confianza del cliente al ofrecer información transparente y detallada sobre cada producto.
Optimización de la cadena de suministro al eliminar redundancias y mejorar la coordinación entre los actores involucrados.
Minimización de fraudes y prácticas deshonestas mediante la verificación transparente de cada transacción.
Cumplimiento efectivo de regulaciones y estándares de la industria mediante la documentación detallada y precisa.
💻Tecnologias utilizadas
- Aplicación web
- Flask: framework de desarrollo web en Python para la construcción del servidor web
- HTML, CSS y JS: fundamentales para la creación de la interfaz de usuario, ofreciendo una experiencia interactiva y atractiva.
- Bootstrap: empleado para el diseño responsivo y la mejora estética de la interfaz web.
- jQuery: facilita la manipulación del DOM y la interactividad en el lado del cliente.
- Leaflet: biblioteca de JavaScript para mapas interactivos, permitiendo la visualización geográfica de la cadena de suministro.
- WebSocket: protocolo de comunicación bidireccional que facilita la transmisión de datos en tiempo real entre el servidor y la aplicación web.
- MQTT: protocolo de mensajería ligero y eficiente, utilizado para la comunicación asincrónica entre la aplicación web y el dispositivo IoT.
- Dispositivo IoT ESP8266
- Biblioteca de WiFi: facilitan la conexión del ESP8266 a la red, permitiendo la comunicación con la aplicación web.
- Biblioteca de MQTT: protocolo utilizado para la comunicación entre los dispositivos IoT y el servidor, asegurando una transmisión de datos eficiente.
- Biblioteca de escaner RFID RC522: permite la identificación única de productos a lo largo de la cadena de suministro mediante tecnología de identificación por radiofrecuencia.
- Biblioteca de DHT11: sensor de temperatura y humedad utilizado para monitorear condiciones ambientales durante la cadena de suministro.
- Hyperledger Fabric
- Test-Network con 3 organizaciones: configuración de una red de prueba con tres organizaciones (una por cada agente), garantizando la simulación de un entorno empresarial diverso.
- Chaincode en TypeScript: lógica de contrato inteligente implementada en TypeScript, define las reglas y la lógica de negocio en la red blockchain. En esta demostración como asset principal se utilizo al modelo de un vino.
- API-REST en TypeScript: interfaz de programación de aplicaciones basada en el protocolo REST para facilitar la interacción entre la aplicación web y la red Hyperledger Fabric.
- Mosquitto
- Mosquitto: broker de MQTT de código abierto que facilita la implementación del protocolo MQTT en la arquitectura del proyecto. Actúa como intermediario entre el dispositivo IoT (ESP8266) y la aplicación web, asegurando la entrega eficiente de mensajes en la red.
Tabla de contenidos
Prerequisitos-Mosquitto
La integración de Mosquitto en el proyecto SSCS añade una capa adicional de eficiencia y confiabilidad en la comunicación entre la aplicación web y el dispositivo IoT. Este broker MQTT gestiona la publicación y suscripción de mensajes, garantizando una transmisión de datos muy rápida.
Para su instalación visitar la pagina web https://mosquitto.org/.
Prerequisitos-Hyperledger Fabric
Hyperledger Fabric es una tecnología blockchain empresarial que proporciona una plataforma robusta y segura para la gestión de assets y transacciones en la cadena de suministro. Gracias a sus características, como la capacidad de definir permisos y roles específicos, así como su enfoque modular, Hyperledger Fabric se convierte en una opción poderosa para garantizar la transparencia y la trazabilidad en proyectos como el SSCS.
Se requieren las tecnologias listadas en https://hyperledger-fabric.readthedocs.io/en/release-2.5/prereqs.html, debe seguir las instrucciones de instalación de los prerequisitos dependiendo el sistema operativo que este utilizando.
Adicionalmente debe tener instalado NPM y NodeJS en su última versión. https://nodejs.org/en.
Prerequisitos-ESP8266
Se requiere descargar el .ino contenido en TP2-ESCANER-RFID, configurarlo con los parametros de WiFi y broker MQTT correspondientes, configurar los pines de los sensores que se utilizan y finalmente cargar el programa al microcontrolador.
Prerequisitos-Aplicación Web
Se requiere la última versión de python https://www.python.org/.
Se requiere tener instalada la última versión de PostgreSQL https://www.postgresql.org/ configurada con una base de datos llamada supply-chain-platform (de preferencia).
Instalación-Hyperledger Fabric
El directorio principal de Hyperledger Fabric es fabric-supply-chain, estando allí, debe acceder al directorio test-network:
$ cd test-network
Luego debe ejecutar el comando:
$ ./network.sh up createChannel -c mychannel -ca -s couchdb
Esto genera 2 organizaciones, cada una con un peer, un single raft ordering service y crea un canal llamado mychannel, donde une a los peers de las 2 organizaciones. Tambien crea una CA por cada organización.
Para este sistema se requieren 3 organizaciones, por lo tanto:
$ cd addOrg3
$ ./addOrg3.sh up -c mychannel -ca -s couchdb
Volver a la carpeta test-network y hacer el deploy del chaincode:
$ cd ..
$ ./network.sh deployCC -ccn basic -ccp ../chaincode-typescript/ -ccl typescript
Ahora se puede probar el chaincode, se pueden setear las variables para actuar como organización 1:
export PATH=${PWD}/../bin:$PATH # binarios
export FABRIC_CFG_PATH=$PWD/../config/ # config
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
Para inicializar la ledger con assets precargados:
$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
Para obtener todos los assets:
$ peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
Para crear un asset:
$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"Args":["CreateAsset","admin","wine6", "blanco", "Org1MSP", "2500", "52.9393", "42", "Las cabras", "2010", "52.9393", "52.9393"]}'
Finalizadas las pruebas del chaincode se puede levantar el servidor API REST y el servidor REDIS (que se encarga de la cola de tareas). Ir a la carpeta rest-api-typescript e instalar las dependencias y realizar el build:
$ cd ..
$ cd rest-api-typescript
$ npm install
$ npm run build
NO OLVIDAR EJECUTAR EL SCRIPT generateEnv.sh que está en la carpeta rest-api-typescript/scripts. Este script genera un archivo .env que se debe colocar en la carpeta principal rest-api-typescript.
Luego se debe inicializar el server REDIS, que se encarga de mantener la cola de tareas que le van llegando en cada transacción:
$ export REDIS_PASSWORD=$(uuidgen)
$ npm run start:redis
Finalmente iniciar el servidor API REST
$ npm run start:dev
Las API-KEYS correspondientes a cada organización estan en el archivo .env y deben ser enviadas en la cabecera de la petición HTTP al servidor REST para que la misma sea autorizada.
Instalación-Aplicación Web
En el directorio raíz, crear el entorno virtual:
$ python -m venv venv
Activar el entorno virtual:
# venv\Scripts\activate # Windows
$ ./venv\Scripts\activate # Linux
Instalar dependencias freezadas:
$ pip install -r requirements-freezed.txt
Tener encendido el servidor de DB.
Configurar el archivo .env con las credenciales correspondientes.
Correr las migraciones para tener el sistema de usuarios:
$ flask db upgrade
Iniciar el servidor de la aplicación web:
$ flask run -h 0.0.0.0 --debug
Roles
Rol | Organización |
---|---|
Productor | 1 |
Transporte | 2 |
Cliente | 3 |
Endpoints API-REST
Endpoint | Método | Descripción |
---|---|---|
/assets | GET | Obtener todos los assets del WS |
POST | Crear un nuevo asset | |
/assets/:assetID | GET | Obtener el asset de ID :assetID |
PUT | Modificar el asset | |
PATCH | Transferencia de dueño del asset | |
DELETE | Borrar el asset del WS | |
OPTION | Devuelve si existe el asset | |
/assets/history/:assetID | GET | Ver el historial de transacciones del asset |
Se realizó un registro de todos los avances del proyecto en la Bitacora.