Monitorización de Cadenas de Suministro IoT
Monitorización de Cadenas de Suministro IoT
Keywords (inglés)
Internet of Things, Blockchain, supply chain, monitoring, traceability, industry 4.0.
Agradecimientos
Quiero agradecer a mis padres el haberme dado la libertad para afrontar estos 7 años en
los que, además de la carrera, tenía otros sueños y objetivos por cumplir.
A mis amigos, porque han sido mi fórmula secreta para llegar feliz hasta el final de esta
etapa.
A los profesores, por los conocimientos que me han transmitido y la persistencia que han
tenido en que los entienda.
A Lluís, por confiar en la idea del proyecto y ofrecer su tiempo para el desarrollo de este
TFG.
INDICE DE CONTENIDOS
1 Introducción ......................................................................................................................... 1
1.1 Motivación ............................................................................................................ 1
1.2 Objetivos ............................................................................................................... 2
1.3 Fases del proyecto ................................................................................................. 2
1.4 Organización de la memoria .................................................................................. 3
2 Estado del arte...................................................................................................................... 5
2.1 Industria 4.0 .......................................................................................................... 5
2.2 Blockchain ............................................................................................................ 5
2.2.1 Tipos de redes Blockchain ............................................................................ 7
2.2.2 Algoritmos de consenso ................................................................................ 8
2.2.3 BigchainDB.................................................................................................. 9
2.3 Internet de las cosas ............................................................................................. 10
2.4 Patrones y buenas prácticas para el desarrollo de programas ................................ 12
2.5 Arquitectura de Microservicios ............................................................................ 13
2.5 Comunicación REST (Representational State Transfer) ....................................... 15
2.6 Conclusiones ....................................................................................................... 15
3 Diseño ............................................................................................................................... 17
3.1 Proceso de suministro .......................................................................................... 17
3.2 Dispositivo IoT ................................................................................................... 19
3.3 Requisitos del sistema ......................................................................................... 21
3.4 Arquitectura de la aplicación ............................................................................... 22
3.1 Arquitectura del servicio Blockchain ................................................................... 24
3.2 Diseño de la aplicación Web................................................................................ 25
3.2.1 Entidades .................................................................................................... 27
3.3 Conclusiones ....................................................................................................... 28
4 Desarrollo, Integración, pruebas y resultados...................................................................... 29
4.1 Servicio Blockchain ............................................................................................ 29
4.1.1 Autenticación ............................................................................................. 29
4.1.2 Generación de claves .................................................................................. 30
4.1.3 Interacción con la Blockchain ..................................................................... 31
4.1.4 Bróker MQTT ............................................................................................ 35
4.2 Dispositivo IoT ................................................................................................... 35
4.3 Aplicación web ................................................................................................... 35
4.3.1 Entidades .................................................................................................... 35
4.3.2 Sección de visualización de datos ............................................................... 36
4.3.3 Sección de resumen .................................................................................... 37
4.3.4 Sección de gestión de claves ....................................................................... 37
4.3.4 Interacción con la web ................................................................................ 38
4.4 Conclusiones ....................................................................................................... 38
5 Conclusiones y trabajo futuro ............................................................................................. 39
5.1 Conclusiones ....................................................................................................... 39
5.2 Trabajo futuro ..................................................................................................... 39
Referencias ........................................................................................................................... 41
Glosario ................................................................................................................................ 43
Anexos .................................................................................................................................... I
A. Emprendimiento ...................................................................................................... I
B. Creando la red Blockchain en IBM Cloud ............................................................ VII
C. Código del proyecto ............................................................................................. XII
i
ii
INDICE DE FIGURAS
iii
FIGURA 4-7 – VISTA SECCIÓN PINTAR DATOS .................................................................................. 37
iv
INDICE DE TABLAS
v
vi
1 Introducción
En este capítulo se explicará la motivación por desarrollar el proyecto de trazabilidad de
una cadena de suministro que se ha abordado en este trabajo de final de grado. Se expondrá
la planificación de tareas y los objetivos para su desarrollo, así como la previsión de horas
de trabajo y la organización que se ha seguido para escribir la memoria.
1.1 Motivación
Las telecomunicaciones es uno de los sectores de mercado más afectados por la
creciente demanda del universo digital. En los últimos años ha habido un crecimiento
exponencial en el número de dispositivos conectados a la red. Se espera que para el 2020
haya conectados alrededor de 50 billones de dispositivos [3]. Bajo este escenario aparece el
paradigma de “internet de las cosas” (Internet of Things, IoT), el cual pretende conectar
todos los dispositivos y/o máquinas a Internet para que intercambien información y
generen beneficio para la sociedad. La aparición de la tecnología 5G en las redes, en
combinación con los dispositivos, permitirán el análisis de datos en tiempo real y la
ejecución remota de servicios críticos. Paralelamente han emergido tecnologías de
almacenamiento de datos como Blockchain impulsada por el movimiento Cipherfunk [4]
en el que se aboga por el uso generalizado de la criptografía para mejorar la privacidad de
las personas. Según un estudio de Accenture [5], se espera que para el 2022 el mercado
Blockchain esté valorado en los 12 billones de dólares.
Por otro lado, vivimos en un mundo en el que no sabemos a ciencia cierta si los
productos que compramos y utilizamos en nuestro día a día son realmente como nos hacen
creer que son. A pesar de los certificados de origen y las leyes impuestas para el control de
los productos, aparecen noticias como la del atún de contrabando [6] en la que se puede ver
que existen mafias que evitan estos controles con los productos que compramos.
Actualmente las empresas involucradas en una cadena de suministro (productores,
distribuidores, comerciantes, etc.) invierten tiempo y recursos en comunicarse de forma
que el proceso de creación y/o producción, distribución y venta del producto sea lo más
eficiente posible. El sistema de funcionamiento que se sigue en estos casos consiste en que
cada empresa implicada mantiene sus propios datos y se les obliga a pasar por numerosas
auditorias para certificar que los procesos son los correctos. Compartir los datos en una
cadena de suministro permite llevar un control del producto en toda la cadena, facilitando
la comunicación entre las empresas y mejorando la eficiencia de los procesos. Combinando
IoT y Blockchain podemos resolver el problema de la compartición de información en una
cadena de suministro
Se desea desarrollar una aplicación la cual cada empresa instalará en su servidor privado
de forma que se puedan conectar entre sí a modo de crear una red privada. Esta aplicación
será capaz monitorizar los datos de un producto o más productos de la cadena de
suministro y almacenarlos en una base de datos en la que no podrán ser manipulados
ilícitamente. Este sistema permitirá mejorar la comunicación entre empresas, hacer más
eficientes los procesos internos y dar mayor transparencia del producto al cliente final.
1
1.2 Objetivos
Para desarrollar el proyecto y poder realizar una tabla de tareas junto con una estimación
temporal, se han propuesto los siguientes objetivos:
- Investigación: Analizar y extraer información sobre el panorama tecnológico de
herramientas y protocolos dentro del ecosistema Blockchain e IoT. Saber diseñar la
arquitectura de una plataforma como servicio que utilice tecnologías Blockchain e
IoT. Hacer pequeñas pruebas de las posibles herramientas a utilizar con el fin de
averiguar si son útiles para nuestro proyecto. Adquirir conocimientos y experiencia
con las herramientas y lenguajes informáticos que se pretendan aplicar al proyecto.
- Diseño: Elegir las tecnologías más convenientes para el caso de uso que se quiere
desarrollar. Diseñar la arquitectura teniendo en cuenta los requisitos de nuestra
aplicación y los problemas a resolver.
- Desarrollo: Implementar y documentar los componentes mencionados en la
arquitectura de forma que se comuniquen entre sí y proporcionen las
funcionalidades especificadas deseadas.
- Integración y pruebas: Probar que los componentes implementados funcionan
correctamente y proporcionan las funcionalidades requeridas.
- Trabajo adicional: Aprender y tratar de aplicar los conocimientos básicos de
emprendimiento que permitan llevar el producto desarrollado en este trabajo a un
entorno empresarial.
2
Figura 1-2 – Diagrama de Gantt
3
4
2 Estado del arte
Antes de embarcarse en el desarrollo del proyecto, es importante conocer el estado
actual de las tecnologías y protocolos que puedan estar relacionadas con el proyecto. Se va
a desarrollar una aplicación de extremo a extremo (end-to-end) que dará servicio a toda la
cadena de suministro, por lo que es conveniente analizar todas las tecnologías necesarias
en el proceso. Esta sección se enfocará en explicar qué es Blockchain e IoT, junto a los
protocolos y tecnologías más comunes en estos ámbitos. También se explicará algunos
patrones y buenas prácticas para el desarrollo de aplicaciones.
2.2 Blockchain
La palabra Blockchain deriva del término en inglés “cadena de bloques”, donde cada
bloque representa a un conjunto de datos. Estos bloques se encadenan entre sí utilizando
algoritmos criptográficos con el objetivo de que la información que hay en su interior no
pueda ser manipulada. Al conjunto de bloques se le denomina “libro de cuentas” (ledger)
heredado del concepto de libro de cuentas bancario. Esto se debe a que esta tecnología
comenzó con la criptomoneda Bitcoin [10] y en estos bloques se registran el intercambio
de la criptomoneda. Sin embargo, esta tecnología ha ido evolucionando y la información
que se almacena en los bloques ya no tiene por qué referirse sólo a transacciones
monetarias. En términos generales, Blockchain es una base de datos distribuida con tres
características principales: inmutable, descentralizada y transparente.
Cuando se dice que Blockchain es inmutable significa que los datos que permanecen en
el libro de cuentas no se pueden modificar, es decir, sólo se pueden introducir datos, pero
no modificarlos ni eliminarlos. Esta característica se debe a que cada bloque de datos lleva
añadido un identificador (resumen o hash) que tiene información del bloque anterior. Un
resumen o hash criptográfico es el resultado de aplicar un algoritmo matemático a una
cadena de datos y que este a su vez devuelve una cadena de caracteres de tamaño fijo. Este
algoritmo es determinista, es decir, siempre que se introduzca la misma cadena de
5
caracteres se obtendrá el mismo resultado. Además, es extremadamente complicado
encontrar dos mensajes de entrada que resulten el mismo resumen, y no permite realizar la
operación inversa (pasar del resumen a la cadena de entrada). Utilizando las características
de este algoritmo se puede demostrar que, si de partida tenemos un hash y queremos
demostrar que unos datos han producido dicho hash, basta con aplicarles el algoritmo
matemático y comprobar si el resultado coincide con el hash que teníamos. Si dicho
resultado coincide, entonces se puede considerar inequívoco que esos eran los datos que
produjeron dicho hash. Si en un bloque, añadimos el hash del bloque anterior, como se
ilustra en la Figura 2-1, estamos forzando a que la información del bloque anterior no se
pueda modificar, ya que si se modifica, el hash cambiará y por tanto no coincidirá con el
hash que se había añadido en el bloque posterior, rompiendo así la cadena. Por otro lado, si
tratamos de modificar el hash para que coincida con la información manipulada, así mismo
estaremos modificando el hash de dicho bloque que lo contiene y este no coincidirá con el
hash guardado en el siguiente bloque. El principal algoritmo de obtención del hash es el
SHA256 [11].
6
claves (una clave pública y otra privada) las cuales se utilizan para encriptar y desencriptar
el mensaje. En el caso de la criptografía asimétrica, para enviar un mensaje, se encripta con
la clave pública del receptor, por lo que sólo este podrá descifrar el mensaje. En la Figura
2-2 se puede ver como BOB le envía un documento a ALICE cifrando el documento con la
clave pública de ALICE y esta lo descifra con su clave privada.
Este sistema también se puede utilizar a la inversa para verificar que alguien ha aceptado
una transacción. Si yo encripto una información con mi clave privada y el resultado de esta
encriptación se puede desencriptar con mi clave pública, entonces es verídico que yo he
sido el firmante de dicha información. A este proceso de firma se le entiende como firma
electrónica. En Blockchain, este sistema se utiliza para firmar las transacciones o contratos
inteligentes.
Los contratos inteligentes son piezas de código que se insertan en la cadena de bloques.
El hecho de permitir introducir código lógico en los bloques aparece con la criptomoneda
Ethereum [13]. Utilizar piezas de código abre un mundo de posibilidades dentro de la
tecnología Blockchain que con Bitcoin no se había alcanzado. Por ejemplo, se podría
utilizar para registrar datos públicos como los derechos de una vivienda e incluso venderla
utilizando como moneda de cambio el Ether (criptomoneda de la red Ethereum) y
mediante el uso de la lógica, programar condiciones o cláusulas en dicho contrato.
7
2.2.2 Algoritmos de consenso
Un algoritmo de consenso es un proceso informático utilizado para llegar a un acuerdo
entre sistemas distribuidos. Están diseñados para lograr una confiabilidad en una red que
involucra nodos con distintos administradores. En el caso de Blockchain, los algoritmos de
consenso se utilizan para decidir cómo se inserta el siguiente bloque de la cadena y evitar
posibles modificaciones de los datos. Los algoritmos de consenso hacen que una red
Blockchain pueda ser descentralizada y fiable ya que la decisión no la toma un agente
central si no que se toma por el consenso de una cantidad significativa de nodos.
Los algoritmos de consenso, según de qué tipo sean, pueden tener desventajas que
normalmente afectan a la velocidad de procesamiento de las transacciones y la
escalabilidad de la red. Esto hace que en sistemas donde se requieren muchas transacciones
por segundo o haya una alta cantidad de nodos conectados sea un aspecto crítico. Por ello
se han diseñado algoritmos para funcionar mejor en unos sistemas u otros [14]. A
continuación, se describen algunos algoritmos:
8
consenso PoW, se puede procesar alrededor de 5 transacciones por segundo, sin
embargo, haciendo uso del algoritmo Hashgraph se pueden procesar miles de
transacciones. El funcionamiento de este algoritmo consiste en que los nodos de la
red van guardando un histórico de transacciones propio, cada cierto tiempo estos
nodos se comunican entre sí de forma aleatoria y van comprobando si el histórico
de transacciones del resto de los nodos es correcto. En la figura [18] se puede ver la
diferencia entre una red Blockchain tradicional y el algoritmo Hashgraph.
2.2.3 BigchainDB
BigchainDB es un programa administrado por IPDB Foundation [19] y escrito en el
lenguaje de programación Python que hace uso de las técnicas de Blockchain para
implementar una base de datos distribuida enfocada en la administración de activos
digitales [20]. Actualmente se encuentra en una versión estable (2.0.0b9) y posee la
licencia de Apache Versión 2.0. El modo de funcionamiento de BigchainDB consiste en
tratar las transacciones con unas claves privadas de entrada y unas claves públicas de
salida. Cuando se crea una transacción para definir una entidad (elemento al que se le
pueden atribuir propiedades), la entrada está vacía y en la salida se escriben las claves
públicas de los destinatarios o propietarios de dicha entidad. Si se quiere transferir esta
entidad a otros destinatarios, en la siguiente transacción será necesario introducir en la
entrada las claves privadas referentes a las claves públicas que se habían introducido en la
salida de la transacción anterior, es decir, las claves privadas de los propietarios en el
momento que se produce la transacción. BigchainDB además posee una implementación a
la que le denominan “Cryptoconditions”, que permite establecer condiciones para que la
transacción se pueda realizar sin que sea necesario utilizar todas las claves privadas de los
propietarios. BigchainDB no soporta contratos inteligentes, pero existe la red Cosmos que
hace uso del protocolo Inter Chain Comunication, el cual es muy útil para conectar dos
tecnologías Blockchain o escalar una red Blockchain [21]. En la sección de Conclusiones y
trabajo futuro se tratará este tema.
9
La arquitectura de BigchainDB (Figura 2-4) no es muy compleja. Hace uso de software
de terceros como Tendermint [22] o MongoDB [23]. Tendermint es un programa que
incorpora un protocolo de consenso que soporta tolerancia a la falla bizantina. BigchainDB
utiliza este protocolo para tener los nodos en sincronización, validar las transacciones y
asegurarse que son almacenadas en todos los nodos. MongoDB es una base de datos no
relacional en la que se almacena la información de los bloques para que el usuario pueda
acceder a esta de forma eficazFigura 2-4 – Arquitectura de BigchainDB 2.0 [24].
10
El objetivo de la capa de sensorización es extraer datos del entorno, haciendo uso de
sensores, para ser procesados en la capa de aplicación. Dentro de los tipos de sensores
existen varias categorías: sensores de movimiento (acelerómetro, giroscopio…), sensores
ambientales (luz, temperatura, audio…) y de posición (GPS, magnetismo…).
El objetivo de la capa de red es transmitir los datos extraídos en la capa de
sensorización a la capa de procesamiento de datos. En esta capa encontramos distintos
tipos de estándares de conectividad: por proximidad (Como RFID), Wireless Personal Area
Networks (WPAN) (Como Bluetooth), Wireless Local Area Networks (WLAN) (Como
Wi-Fi), Lowe-Power Wide Area Networs (LPWAN) (Como LoRa y SIGFOX) y celular
(Como 5G). A continuación se detallan los más comunes:
- RFID (Radio Frequency Identification): Es un chip transpondedor conectado a
una antena que responde cuando recibe un campo electromagnético. A veces son
acompañados de una pequeña batería o condensador para asegurar una potencia
interrumpida al chip, ya que es necesario que esté recibiendo potencia durante un
cierto tiempo, para poder generar la señal de respuesta. Esta tecnología es muy
utilizada para etiquetar artículos y rastrearlos. Puede operar, en función del modelo,
en distintas frecuencias: baja frecuencia (30 – 500kHz), alta frecuencia (10-
15MHz) y ultra alta frecuencia (850 – 950 MHz, 2.4 – 2.5 GHz, 5.8 GHz)
11
mismo orden en el que se transmitieron. Una de las herramientas más conocidas
para utilizar este protocolo es Mosquitto [29].
12
que se trata en este proyecto, en el que se desarrolla una API REST (se explica más
adelante), existen librerías como Swagger [37] apiDoc [38].
Cuando se trabaja en un equipo, es importante comentar el código del programa para
facilitar la fluidez y el entendimiento entre los desarrolladores. El estilo de programación
que estos deben seguir también debe ser lo más parecido y limpio posible. Para ello existen
programas denominados Linters que se encargan de revisar el código y a partir de una serie
de reglas definidas avisar al usuario de si se ha incumplido alguna de estas. Un ejemplo de
esta herramienta es ESLint [39].
Dentro de lo que se conoce como desarrollo ágil entran aspectos como el uso de
repositorios, la integración continua, las pruebas unitarias o el despliegue continuo. El
objetivo un desarrollo ágil es automatizar el proceso desde que se produce una
modificación en el código de nuestro programa hasta que este está disponible para su
ejecuciñon. En este proceso entran herramientas como Jenkins [40] que son capaces de
ejecutar una serie de acciones cada vez que el código del repositorio se ha modificado y
ejecutar pruebas para comprobar que nuestro programa funciona correctamente. Para el
caso de este proyecto una herramienta para las pruebas es [Link] [41].
La seguridad es otro aspecto muy importante, por ello existen organizaciones como
OWASP [42] en la que se detallan aspectos de seguridad a tener en cuenta a la hora de
desarrollar una aplicación segura.
La arquitectura en una aplicación hace que pueda ser escalable y facilite las cosas a la
hora de encontrar errores. Podremos aplicar distintos tipos de arquitecturas dependiendo
del caso de nuestra aplicación y el nivel en el que nos encontremos. De forma simple
podemos definir 3 aspectos o niveles en los que hay que tener en cuenta la arquitectura:
según la distribución de los documentos que tienen el código de nuestro programa (en la
sección 3.1 se mostrará más detalladamente), según la comunicación que vaya a tener con
otros componentes y según la segmentación de la aplicación en uno o en varios
componentes. A continuación, se muestran dos diseños de arquitectura, por un lado, la
arquitectura de microservicios que se utiliza de forma global en todo el aplicativo y por
otro lado la arquitectura REST que se utiliza para cada componente.
13
microservicios en la que una entidad es encargada de un servicio y otra de los otros dos
servicios.
Una de las herramientas más útiles para combinar con este paradigma de desarrollo de
microservicios es Docker [43] .Docker es una herramienta de código libre que se basa en
la empaquetación de aplicaciones en contenedores. Los contenedores se encuentran
aislados entre sí y se comportan como máquinas independientes. El servicio que ofrecen
los contenedores Docker es parecido al de las máquinas virtuales, sin embargo, la
diferencia es que Docker utiliza su motor, llamado Docker Engine (véase Figura 2-9), que
se encarga de lanzar y gestionar los contenedores con nuestras aplicaciones gestionando los
recursos entre los contenedores, optimizando su uso y eliminando la necesidad de tener
sistemas operativos separados para conseguir el aislamiento. Las ventajas de los
contenedores son que son más ligeros que una máquina virtual, no es necesario instalar un
sistema operativo por contenedor y hacen menor uso de los recursos de la máquina.
14
2.5 Comunicación REST (Representational State Transfer)
REST es un estilo de arquitectura de aplicaciones que se utiliza en sistemas que se
comunican a través de HTTP (Hyper Text Transfer Protocol) [44]. El protocolo HTTP
permite una comunicación entre una aplicación web y el servidor y sirve para realizar una
petición de datos y/o recursos, por ejemplo, el código de una página web, una imagen, o un
fichero de datos genéricos. Los mensajes HTTP están compuestos de una cabecera
(header) en la que se especifica las características del mensaje, y un cuerpo (body) en el
que va el mensaje. REST hace uso de este protocolo para la comunicación. Envía
peticiones HTTP en las que contiene toda la información necesaria para ejecutarla, lo que
permite que ni cliente ni servidor necesiten recordar ningún estado previo a dicha petición.
Las operaciones más importantes que se pueden realizar sobre un recurso usando REST
son: POST (crear), GET (leer), PUT (editar) y DELETE (borrar). REST soporta el formato
JSON (JavaScript Object Notation) y XML (Extensible Markup Language) para
transportar los datos. El formato JSON es menos verboso y ocupa menos que el formato
XML. Esto hace que sea muy común en las aplicaciones actuales.
2.6 Conclusiones
En este capítulo hemos podido abordar el funcionamiento y los aspectos esenciales para
entender la tecnología Blockchain. También se ha explicado el paradigma de IoT,
así como sus protocolos de comunicación. Por último, se han citado algunos
aspectos importantes a la hora de desarrollar aplicaciones y se han mencionado las
arquitecturas que se han seguido a la hora de desarrollar el aplicativo.
15
16
3 Diseño
El objetivo de este trabajo es crear una plataforma capaz de dar servicio a toda la cadena
de suministro. Diseñar un aplicativo eficaz para este cometido, requiere analizar las
necesidades a tener en cuenta en este tipo de entornos. En esta sección se va a analizar el
proceso de negocio de la cadena de suministro y se va a confeccionar la lista de requisitos
de nuestro aplicativo al que se le ha denominado VIKYNGO. También se especificará cómo
debe estar organizado el aplicativo y se evaluarán diferentes tecnologías y plataformas
existentes que puedan asemejarse a VIKYNGO.
17
Haciendo uso de los contratos inteligentes, se puede diseñar una lógica para que
cumplan los contratos legales que se han firmado con el recolector. En ellos se puede
establecer el precio de la manzana y las condiciones que puedan afectar a dicho precio,
como la época del año. Cuando el recolector entregue la caja al transportista, la aplicación
móvil llamará a este contrato que tendrá en cuenta todas las condiciones y los datos que
han extraído los dispositivos IoT. Si las condiciones se cumplen tal y como se han pactado,
la aplicación registrará la transacción, el recolector recibirá el cobro instantáneamente y
será entonces cuando el transportista podrá introducir las cajas en sus camiones.
Una vez que las cajas han entrado en el camión, el sistema debe ser capaz de detectar las
cajas que están en su interior y poder transmitir los datos de interés de estas. Por ejemplo,
localización, vibración o temperatura en el interior del vehículo de transporte.
18
Una vez que las manzanas han llegado a su destino, se colocan en el escaparate para ser
vendidas. En esta situación ya no nos interesa transmitir más datos. Es entonces cuando los
usuarios pueden acceder a la información que se ha ido recolectando y almacenando
durante toda la cadena. Haciendo uso de una aplicación móvil que sea capaz de leer el
código RFID de la caja, se podría enviar una petición a VIKYNGO para que este nos
devuelva la información relevante al producto identificado y quizá un resumen o
valoración del trato del producto.
Teniendo en cuenta el problema expuesto anteriormente, necesitaremos:
- Un aplicativo encargado de administrar la Blockchain y de recibir y almacenar los
datos de los dispositivos IoT.
- Una aplicación web donde las empresas pueden administrar los dispositivos y
activos y puedan visualizar la información que se está registrando.
- Una aplicación móvil para que el cliente final pueda obtener la información del
producto a comprar.
- Un software que se instalará en los dispositivos IoT para que se comuniquen con el
servicio Blockchain.
Para este trabajo se ha desarrollado tanto el programa encargado de administrar la
Blockchain, como el software IoT y la aplicación web. La aplicación móvil se deja como
Trabajo futuro.
19
Se ha utilizado un sensor de temperatura y humedad DHT11 [47]. Donde los pines de
conexión son: un pin de señal, uno de alimentación y otro de tierra.
Por último, se muestra la con los pines del GPIO de la Raspberry Pi Figura 3-7 y la
Tabla 3-1 con las conexiones.
20
Descripción Pin RPi 3B+ DHT11 RFID-RC522
VCC 3.3V #1 VOLTAGE
VCC 5V #2 VOLTAGE
GND #6 GND GND
GPIO4 #7 SDA
GPIO10 #19 MOSI
GPIO9 #21 MISO
GPIO11 #23 SCK
GPIO25 #22 RST
GPIO7 #24 SDA
21
3.4 Arquitectura de la aplicación
El conjunto tecnológico de Blockchain es muy amplio. Para elegir la tecnología
correcta para nuestro proyecto, se ha confeccionado una Tabla 3-2 en la que se comparan
cinco tecnologías importantes de código libre. En esta tabla se han representado con
colores (verde, naranja y rojo) las calificaciones de cada característica relevante de dichas
tecnologías para enfatizar cómo de buenas o malas son.
Contratos Si No Si Se puede Si
Inteligentes implementar
Activos Medio No No Si No
Digitales
Escalabilidad Baja Alta Alta Alta Alta
Siguiendo este análisis, Bitcoin es descartado por ser una red pública sin permisos. Por
otro lado, tanto Ethereum como Quorum no serían las mejores opciones ya que no están
diseñada para funcionar con activos digitales. En cuanto a Hyperledger Fabric, podría ser
una opción viable, sin embargo, la escalabilidad es un punto muy crítico ya que estamos
tratando con casos donde se requerirán muchos nodos. Además, Hyperledger Fabric es una
tecnología que aún sufre grandes cambios en el código y es de las tecnologías más
complejas del conjunto, lo que nos llevaría una gran inversión de tiempo que para un
proyecto inicial no es necesario. Finalmente, BigchainDB es una tecnología estable,
diseñada para trabajar con activos digitales, escalable y con alto procesamiento de
transacciones, por lo que parece una buena herramienta para nuestro caso de uso.
En el proceso que se desarrollaba este proyecto salió la noticia de que el mantenimiento
de BigchainDB se pasaba a la organización IPDB Foundation [49]. Depender de tecnología
de terceros implica estar actualizado en las noticias que ocurren con este programa. Ante el
anuncio, se decidió contactar con la nueva organización para saber cómo iba a ser el
mantenimiento de BigchainDB. La organización contestó indicando que el 7 de junio del
2019 publicarían los objetivos de cara al 2019 [50].
22
A continuación, se procede a elegir la herramienta de trabajo para el desarrollo de la
interfaz. Las herramientas más populares actualmente son Angular [51], React [52] y
[Link] [53].
Todas utilizan el lenguaje de programación JavaScript para el desarrollo. En este sentido
no hay una clara diferencia a la hora de elegir una u otra. Pero se han intentado extraer los
puntos destacables de las 3 para tomar la decisión:
- Angular: Es un entorno de trabajo (framework) que además de JavaScript, soporta
el lenguaje diseñado por Microsoft, TypeScript. Angular está orientado a
aplicaciones web que van a tener una gran dimensión y es utilizada por Google.
- React: Es una librería más flexible que Angular estructuralmente, pero más
sencilla, que está enfocada en el desarrollo de aplicaciones móviles y mantenida
por Facebook.
- [Link]: Es una librería orientada a aplicaciones simples que ocupa muy poco
tamaño y es flexible. Sin embargo, no es tan popular como Angular o React por lo
que habrá menos ejemplos y soporte al desarrollador.
Para este proyecto se ha decidido utilizar Angular, debido a que se espera que el
proyecto vaya a alcanzar una complejidad más alta en el futuro.
En cuanto al almacenamiento, por un lado, se necesitará guardar información
estructurada como pueda ser la información de los usuarios, las cuentas y las entidades.
Como base de datos estructurada se ha decidido utilizar PostgreSQL por ser de código libre
y ser una base de datos más eficiente en proyectos de grandes dimensiones. En la Figura
3-8 se ha diseñado la base de datos relacional. En la tabla “Account” se ha establecido
como clave primaria el “ID” de la cuenta. Esta tiene campos como el “type” en el que se
indica si es gratuita o de pago, o el campo “BigchainDB” en el que se almacena la
localización del nodo asociado. Por otro lado, la tabla “User” que pueden tener acceso a
varias cuentas (varios nodos). En esta tabla se almacenan los datos personales de los
usuarios y la contraseña encriptada. Por último, la tabla “Entity” en la que se almacenan las
claves y los datos de las entidades.
23
Por otro lado, se necesita una base de datos no estructurada para guardar información
como documentos o datos de sensores en la que los campos no tienen por qué llevar una
estructura fija. En este caso se ha utilizado MongoDB ya que es utilizada por BigchainDB
por lo que conviene llevar una similitud en los programas utilizados.
En la se muestra la arquitectura final de nuestro proyecto. Se ha diseñado siguiendo una
arquitectura de microservicios (explicada en el Estado del arte) en la que tendremos el
servicio de Blockchain con la base de datos en un contenedor y el servicio de la aplicación
web en otro contenedor. En IBM Cloud desplegaremos una red Blockchain de cuatro
nodos a la que nos conectaremos con un nodo en local. Por último, tendremos el programa
de la Raspberry Pi.
- App: contiene todo el código necesario para que nuestra aplicación funcione.
Dentro de esta se encuentras otras carpetas:
o Actions: Lógica de nuestro servicio.
24
├── app o Helpers: Funciones que nos ayudan a
│ ├── actions conectar con la Blockchain o la base de
datos.
│ ├── helpers
o Middlewares: Programas que se
│ ├── middlewares
ejecutan antes de
│ ├── node_modules
o Node_modules: Dependencias de
│ ├── routes nuestro programa.
│ ├── schemas o Routes: Todos los métodos disponibles
│ ├── [Link] de nuestro servidor.
│ └── utils o Schemas: Esquemas de validación de
├── .env las peticiones que recibe nuestro
├── build servidor.
├── config o [Link]: Es el archivo que se ejecuta
├── Dockerfile para arrancar el programa.
├── [Link] o Utils: Funciones que se utilizan
├── Jenkins frecuentemente.
├── LICENSE - Dockerfile: Contiene la información para crear
├── [Link] el contenedor que alberga al servidor.
├── [Link] - [Link]: Contiene una serie de tareas
├── scripts automáticas como la creación de la
documentación o las pruebas unitarias.
├── software
- Jenkins: Es el archivo que contiene las tareas
├── tests
para la desplegar el programa automáticamente
en el servidor.
- LICENSE: Contiene la licencia del programa.
Figura 3-10 – Esqueleto del - Scripts: Aquí se encuentran algunos scripts útiles
servicio Blockchain para algunos servicios.
- Tests: Contiene todos los tests las pruebas
unitarias para comprobar que el programa funciona correctamente
- Software: Contiene software que es utilizado en nuestro servicio.
- [Link]: Aquí se establecen las librerías de las que depende nuestro servicio.
- [Link]: Información sobre nuestro servicio.
- .env: En este archivo se encuentran datos secretos como alguna clave de
encriptación.
25
En esta plataforma se puede ver aspecos como el resumen que muestra en los paneles
centrales: “devices” que representa a los dispositivos conectados a la plataforma,
“streams” que son los mensajes que los dispositivos han enviado a la plataforma,
“listeners” que son piezas de código que se ejecutan cuando un “stream” llega a la
plataforma y “alarms” que son avisos (sms, e-mail, etc) que se programan para recibir
información de los “streams” que llegan a la plataforma. También es interesante el menú
de la izquierda, que se muestra en todo momento de la navegación, y la forma en la que se
plantea un modelo jerárquico para abordar un proyecto IoT en el que un proyecto puede
estar formado por servicios que su vez pueden estar formados por grupos y que estos
pueden estar formados por dispositivos. Haciendo uso de esta idea, en VIKYNGO se le ha
dado un enfoque distinto y se hará uso de las claves asimétricas para diseñar una jerarquía
estricta que se comentará en la sección Entidades.
Por otro lado, se ha analizado la plataforma Losant [55]. Esta plataforma es compleja y
mucho menos intuitiva que Altair SmartCore. Es una plataforma potente que cuenta con
muchas funcionalidades, sin embargo, para una primera aproximación no es un buen
modelo a tener en cuenta ya que queremos desarrollar las funcionalidades básicas que
puedan resolver los principales problemas de la cadena de suministro. A pesar de esto, se
ha encontrado un aspecto interesante que podría servir para VIKYNGO, y es el hecho de
poder diseñar una plantilla de visualización de datos para los clientes (se tratará en la
Conclusiones y trabajo futuro).
Después del análisis realizado, a continuación, se muestran las secciones de que
dispondrá la aplicación web de WIKYNGO:
- Inicio: Se muestra un mensaje de bienvenida, algunos consejos para empezar,
noticias relacionadas sobre las versiones del programa, acceso al foro y tutoriales.
- Resumen: Se muestra una ventana con distinta información de la cuenta como
nodos, mensajes o dispositivos conectados en la Blockchain.
- Nodos: Permite administrar (arrancar, parar, reiniciar y configurar) los nodos.
- Entidades: Permite administrar (crear, eliminar, transferir) y representar en una
gráfica jerárquica las entidades.
- Datos: Se muestran los datos almacenados en la Blockchain con el uso de gráficas.
- Tokens: Permite configurar y generar un token para una red privada.
- Contratos: Permite crear contratos para ser llamados al transferir entidades.
- Vista de cliente: Permite crear una plantilla con gráficas para mostrar al cliente que
accede a la información de un producto de la cadena.
- Documentación: Ofrece documentación de la API para desarrolladores.
- Ayuda: Preguntas frecuentes. Contacto con los administradores.
- Configuración: Configuración de la cuenta como administradores de esta, sistema
de pago, o estado (status) de la cuenta (libre o de pago)
- Componentes: Componentes desarrollados por la comunidad para ser utilizados en
la plataforma.
- Recursos: Programa disponible compatible con VIKYNGO. Por ejemplo, el
programa que hemos diseñado para la Raspberry Pi.
26
- Incidencias: Sección donde depositar incidencias o errores encontrados en la
plataforma.
3.2.1 Entidades
Se ha denominado entidad a cualquier elemento de la cadena de suministro que vaya a
tener datos asociados en la Blockchain, bien sea porque vaya a crear transacciones o bien
porque se vayan a almacenar metadatos de este elemento. Las entidades deben tener una
clave pública y privada para poder firmar las transacciones. Además, las entidades pueden
ser poseedoras de otras entidades teniendo el derecho a operar con ellas o introducir
metadatos relacionados con estas.
Tomando como ejemplo nuestra cadena de producción de manzanas, las entidades
pueden ser tanto las cajas de manzanas, como los recolectores que las recogen, el
transportista o incluso el mismo camión que contiene las cajas. De esta forma, podemos
crear una jerarquía y tener un control del estado de todas las entidades para así poder
trazarlo. De esta forma podríamos tener una jerarquía la que se muestra en la Figura 3-12.
En la Figura 3-12 todos los elementos de la jerarquía están identificados con claves
públicas (donde Kx representa una clave pública). Así el “EMPLEADO A (ID=K1)”, que
podría ser un recolector de manzanas, es poseedor de “Caja de manzanas (ID=K6)”. Por
otro lado, el “EMPLEADO B (ID=K2)” tiene en posesión 3 camiones. A su vez, tiene un
camión que posee 2 cajas de manzanas. Si el “EMPLEADO A (ID=K1)” decidiese
transferir la caja a “EMPLEADO B (ID=K2)”, podría hacerlo de dos formas distintas: Bien
ejecutando una transacción directamente a uno de los camiones del “EMPLEADO B
(ID=K2)” o bien transfiriendo la caja al “EMPLEADO B (ID=K2)” y este a su vez
transfiriéndoselo a uno de los camiones que posee. Cabe recalcar, que el “EMPLEADO A
(ID=K1)” no podrá introducir metadatos de las cajas de manzanas que pertenezcan al
“EMPLEADO B (ID=K2)”.
Este sistema permite llevar un control estricto de las relaciones de posesión entre
entidades y por tanto es conveniente para el proyecto. En principio para este trabajo, con
27
saber el estado actual de las entidades es suficiente. En la sección Conclusiones y trabajo
futuro.
3.3 Conclusiones
En este capítulo hemos diseñado el proyecto partiendo desde el caso global de una
cadena de suministro, entendiendo el proceso a modo de desarrollar una aplicación útil.
Posteriormente se ha hecho un análisis en las tecnologías Blockchain y las plataformas IoT
del mercado, atendiendo a las necesidades de nuestro sistema. Finalmente, haciendo uso de
las técnicas mencionadas en el estado del arte, se ha diseñado la arquitectura de nuestra
aplicación.
28
4 Desarrollo, Integración, pruebas y
resultados
A continuación, se explica el desarrollo y las pruebas de la arquitectura mencionada en
el apartado anterior. Esta sección se dividirá en tres apartados: servicio Blockchain,
dispositivo IoT y aplicación web. Como se comentó en la sección 2.4 y se tratará en la
sección 5.2, es recomendable de cara a una aplicación escalable que las pruebas estén
automatizadas. En este proyecto se utilizará la herramienta Postman [56] para probar la
API. También se interactuará con la web para comprobar que se comunica correctamente
con nuestra API. Antes de poder realizar las pruebas es necesario crear una red Blockchain
a modo de simular los nodos del resto de las empresas. Este proceso se detalla en el Anexo
B. Todo el código que se explica a continuación se encuentra en el Anexo C. En este anexo
se han introducido las funciones más relevantes para el proyecto, por lo que no aparece
todo el código del aplicativo. El código completo se encuentra en el repositorio de
VIKYNGO [1].
Antes de poder comprobar que nuestro programa funciona correctamente es necesario
arranchar nuestra aplicación. Para realizar este proceso de la forma más automática
posible, se han desarrollado 3 tipos distintos de archivos: un archivo denominado
“Dockerfile” que se encuentra en cada programa y en el que se especifica la configuración
que debe seguir Docker para que este arrancar cada programa en un contenedor, un archivo
denominado “Docker-compose” en el que se configura la conexión y comunicación de los
distintos contendores y un script en lenguaje Bash que descarga el contenido de los
repositorios y ejecuta el archivo “Docker-composer”. Para ejecutar el programa bastará con
introducir el comando “sudo make up”.
4.1.1 Autenticación
Para que nuestra aplicación sea segura, se ha implementado un método de obtención de
un símbolo (token) de acceso que se muestra en la Tabla C 1. De esta forma, los usuarios que
quieran acceder a las funcionalidades de nuestro servicio deberán acompañar en la
cabecera del mensaje dicho token. Para la autenticación se ha utilizado la librería
jsonwebtoken [58] muy útil para la gestión de los tokens. En esta función se muestra el
código para generar la documentación (líneas 1-27). Por simplicidad se ha omitido este
código en el resto de las funciones. En esta función se habilita un recurso con método
POST llamado “/auth” que recibe en el cuerpo del mensaje el usuario y la contraseña
(líneas 29-30), posteriormente se conecta a la base de datos de MongoDB (líneas 32-33) y
se hace una petición para extraer la contraseña (líneas 38-40). En caso de ser correcta, se
genera un token con el nombre de usuario y el tiempo válido para utilizar los servicios
29
(líneas 51-52). En caso de que la contraseña sea incorrecta, se devuelve un mensaje HTTP
con código de estado “401 No Autorizado (Unauthorised) (línea 48)”.
Para comprobar que el token es válido, se ha creado una función (Tabla C 2) que se
ejecuta cada vez que se llama a un método de nuestro servicio. Esta función comprueba si
el token es válido y que no ha expirado (línea 11). En caso de no ser válido, se devuelve un
mensaje HTTP con código de estado “401 No Autorizado (Unauthorised) (línea 13). Con
el fin de no mostrar datos secretos en el código (como la semilla de encriptación), se utiliza
una librería llamada dotenv [59] que lee un archivo donde se encuentran estos datos
secretos y los añade a las variables de entorno al arrancar la aplicación.
Una vez diseñado se procede a probar la función.
SOLICITUD
Método:
POST /auth
Cabecera:
Content-Type: application/json
Cuerpo:
{
"username": "diego",
"password": "password"
}
RESPUESTA
Estado:
200
Cuerpo:
{
"token":
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImRpZWdvIiwia
[Link]-wK27AamIVUp2dg36fKyUsUzwIgPOQ"
}
30
SOLICITUD
Método:
POST /api/v1/keys
Cabecera:
Content-Type: application/json
Authorization:
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImRpZWdvIiwia
[Link]-wK27AamIVUp2dg36fKyUsUzwIgPOQ"
Cuerpo:
{
"data": {
"type": "device",
"name": "raspberry pi",
"id": "12345"
}
}
RESPUESTA
Estado:
200
Respuesta:
{
"result": {
"n": 1,
"ok": 1
},
"connection": {
"id": 1,
"host": "mongo",
"port": 27017
},
"ops": [
{
"username": "diego",
"_id": "69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoyXKdQ9",
"privateKey":
"5Y8JHkF7DrN8U2h9m1SPRH68wr3HopjuDbqcDhq9DGfc",
"data": {
"type": "device",
"name": "raspberry pi",
"id": "12345"
}
}
],
"insertedCount": 1,
"insertedId": "69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoyXKdQ9",
"n": 1,
"ok": 1
}
Tabla 4-2– POST /api/v1/keys
31
que se puede observar que se accede a la carpeta de BigchainDB y se ejecuta un script en
lenguaje Bash (líneas 2-3).
Para crear las entidades se ha utilizado tanto el controlador oficial de JavaScript para
BigchainDB [60] y un controlador específico para el manejo de activos digitales (js-driver-
orm [61]). En la Tabla C 5 se muestra la función en la que se crea un activo utilizando js-
driver-orm. En el Anexo B se han hecho pruebas para comprobar si un nodo está
funcionando por lo que aquí haremos pruebas sobre la función de crear una entidad. En la
Tabla C 5 se habilita un recurso con método POST llamado “/create” (línea 1). Se crea un
objeto con la clave pública del activo (línea 2), después se define el modelo del activo (el
modelo son los campos que va a tener el activo, como temperatura o humedad) (línea 5) y
se llama a la función que registra un activo en la Blockchain (línea 3). Se puede ver como
se crea un activo utilizando el par de claves (pública y privada) y el campo “ data” que
almacena la información de los sensores de temperatura y humedad (línea 7). Si el activo
ha sido creado con éxito se devuelve un mensaje HTTP con código de estado “201
Creado” (línea 9). Otras funciones que se han implementado y se pueden ver en el código
del repositorio son: transferencia de activos Tabla C 7, registro de datos de un activo,
eliminación de un activo, obtención de datos de un activo, parar el nodo o arrancar el nodo.
Para comprobar que funciona correctamente procedemos a probar nuestro recurso que se
puede ver en la Tabla 4-3. La respuesta que recibimos es la que devuelve BigchainDB al
crear la entidad:
SOLICITUD
Método:
POST /api/v1/entities
Cabecera:
Content-Type: application/json
Authorization:
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImRpZWdvI
iwia
[Link]-
wK27AamIVUp2dg36fKyUsUzwIgPOQ"
Cuerpo:
{
"publicKey":
"69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoyXKdQ9",
"modelEntity": "dispositivo",
"entityInfo": {
"id": "12345"
},
"ownerKeyPair": {
"publicKey":
"69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoyXKdQ9",
"privateKey":
"5Y8JHkF7DrN8U2h9m1SPRH68wr3HopjuDbqcDhq9DGfc"
},
"data": {
"temperature": 20
},
"ownerName": "diego"
}
RESPUESTA
32
Estado:
201
Respuesta:
{
"_name": "dispositivo",
"_schema": {
"id": "12345"
},
"_connection": {
"path": "[Link]
"headers": {},
"conn": {
"path": "[Link]
"headers": {}
}
},
"_appId": "global",
"transactionHistory": [
{
"inputs": [
{
"owners_before": [
"69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoy
XKdQ9"
],
"fulfills": null,
"fulfillment":
"pGSAIEyKhxoLSHyHxLNzZoxhHu8LnvD2wyhb_VyZDwD3P75-
gUD8hnzR6vLa7QBXRQEq6wyLAIrZBzWQZIY5Iv4R4_wG-
JPT0QvzUrxqZ7tHoBqPu93-HVPkf0HjsUjldUuWvMwE"
}
],
"outputs": [
{
"public_keys": [
"69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoy
XKdQ9"
],
"condition": {
"details": {
"type": "ed25519-sha-256",
"public_key":
"69nVysuaLCSvGfSbQ6whNfYaxaxAMczmhULJRoyXKdQ9"
},
"uri": "ni:///sha-
256;bmcZ91_KKh7oQ5Oicj-aDv2g7hC61Q-ypZL1j249SuE?fpt=ed25519-
sha-256&cost=131072"
},
"amount": "1"
}
],
"operation": "CREATE",
"metadata": {
"temperature": 20
},
"asset": {
"data": {
"schema": {
33
"id": "12345"
},
"id": "id:global:dispositivo:1fdce690-b13d-
4d2b-b33c-aebe2f4389c1"
}
},
"version": "2.0",
"id":
"ada562b1a8718b97e319daac421fad104fb17c62f9757a21832944f87d7404
39"
}
],
"id": "id:global:dispositivo:1fdce690-b13d-4d2b-b33c-
aebe2f4389c1",
"data": {
"temperature": 20
}
}
Ahora que hemos creado un dispositivo vamos a comprobar que nuestro método para
extraer datos sobre la Blockchain funciona correctamente. En la Tabla 4-4 podemos ver
que nuestro método nos devuelve que existe una entidad (la que hemos creado en el
apartado anterior).
SOLICITUD
Método:
GET /api/v1/data
Cabecera:
Content-Type: application/json
Cuerpo:
{
"username": "diego",
"password": "password"
}
RESPUESTA
Estado:
201
Cuerpo:
{
"entities": 1,
"blocks": 4,
"metadata": 1,
"transactions": 1
}
Tabla 4-4 – GET/api/v1/data
34
4.1.4 Bróker MQTT
Para poder escuchar los eventos de los dispositivos IoT que nos estarán enviando la
información de los sensores, se utiliza un bróker MQTT. Como se ha comentado en el
Estado del arte este protocolo es muy común en la arquitectura de aplicaciones IoT. En
este caso, se ha utilizado Mosquitto [29] como bróker MQTT por su sencillez. El algoritmo
implementado se muestra en la Tabla C 6. El algoritmo empieza conectándose al bróker y
suscribiéndose a todos los tópicos que empiecen por “asset/” (# es un comodín que indica
“cualquiera”) (línea 2). Cuando llega un mensaje con tópico “asset/create” (línea 7),
entonces se analiza el mensaje recibido. En este caso, si el tópico es “asset/créate”, se crea
un activo llamando a la función de la sección 4.1.2.
4.3.1 Entidades
Se ha generado una sección en la plataforma, aquí se muestra el resultado para la
generación de una entidad:
Para esta vista se ha generado un formulario HTML. Este formulario carga los activos y
Figura
los propietarios de la base 4-2 –yVista
de datos nos dasección crearde
la opción entidad
elegir entre varios. Al hacer clic
en “Submit” se recoge la información seleccionada y la empaqueta en una petición POST
que envía al servidor de VIKYNGO.
35
6 data}).subscribe(data => {
7 return data
8 })
9 }
Tabla 4-6 – Función crear activo
El algoritmo funciona recibiendo todos los activos que ha registrado el usuario “Test” y
crea un array de objetos JSON con campos “ name” y “owner” (líneas 3-4), a continuación,
recorre este array llamando a la función recursiva “findChild” que va obteniendo de los
hijos desde el principio de la jerarquía (el padre).
36
Figura 4-3 – Vista sección pintar datos
37
4.4 Conclusiones
En esta sección hemos podido comprobar cómo se han implementado las funciones para
que nuestro aplicativo funcione correctamente. Como se ha podido ver, se han desarrollado
funciones tanto para generar las claves necesarias que nos permiten crear las entidades en
nuestra cadena de suministro, como las funciones que permiten administrar un nodo
Blockchain y su interacción con este y la inyección de datos en el libro de cuentas.
También Se ha podido comprobar el aspecto de la plataforma que hace uso de estas
funciones. Todo este sistema se ha desarrollado haciendo uso de la arquitectura de
Microservicios, empaquetando todos los componentes en un contenedor que se comunican
entre sí, y automatizando todo el proceso para que se pueda arrancar el programa con un
simple comando.
38
5 Conclusiones y trabajo futuro
5.1 Conclusiones
La aparición de tecnologías disruptivas como Blockchain y el desarrollo de las redes de
comunicaciones y dispositivos electrónicos están mejorando los procesos y sistemas de
nuestro día a día. Los dispositivos IoT consiguen digitalizar el mundo analógico en el que
vivimos, proviniéndonos de grandes cantidades de datos que tenemos que almacenar y
mantener. Gracias a la inmutabilidad que la tecnología Blockchain ofrece, podemos estar
seguros de que esos datos no serán alterados. Poco a poco se empiezan a utilizar estas
tecnologías en sectores como la industria, especialmente en las cadenas de suministro.
En este trabajo se ha abordado el proceso de las cadenas de suministro y se ha estudiado
cómo funcionan las tecnologías Blockchain e IoT y qué utilidad nos pueden dar para
mejorar los procesos y añadir nuevos servicios que hasta ahora eran imposibles. Se ha
demostrado que se puede mejorar el control y la monitorización de los activos en toda la
cadena y añadir contratos inteligentes establecer cláusulas entre los participantes de la
cadena. Todo ello haciendo uso de metodologías y tecnologías de software, como la
encriptación, los microservicios y los protocolos de comunicación. Además, se ha visto la
potencia del lenguaje JavaScript ya que hemos conseguido desarrollar tanto la parte del
cliente como del servidor haciendo uso de herramientas y entornos de trabajo de este
lenguaje.
Este trabajo será de código libre y se publicará en un repositorio público [1]. A partir del
momento en el que se publica este trabajo, será posible que se añadan colaboradores al
proyecto con el objetivo de desarrollar los puntos que se mencionan en la siguiente
sección.
39
- Automatización de procesos: Desarrollar un script o scripts para automatizar el
proceso de creación y adición de nodos a la Blockchain de forma que un usuario
registrado sólo necesite darle a un botón para ejecutar todo el despliegue. Los
scripts no son muy críticos por lo que el lenguaje de programación podría ser
JavaScript.
- Versión de pruebas: Acabar los servicios necesarios en VIKYNGO (tanto el núcleo
del software como las secciones de la aplicación web) para poder llevar la
aplicación a un entorno de pruebas y poder realizar una simulación en una cadena
de producción real.
- Investigación: Investigar las brechas de seguridad y líneas que quedan por resolver
como: estudiar la optimización y la eficiencia de las tecnologías y plataformas
Blockchain para reducir la energía de consumo en los dispositivos IoT, evitar la
manipulación del código que presentan los dispositivos IoT y la manipulación de
los sensores que obtienen los datos, desarrollar proyectos a gran escala para
cadenas de suministro a fin de localizar nuevos problemas que no se detectan a
pequeña escala, etc.
40
Referencias
[1] Diego Sierra Fernandez, Github. [Online] [Link]
[2] Licencia Apache, [Link]
[3] Daniel Wellers, “Is this the future of the Internet of Things”, Noviembre 2017. [Online]
[Link]
[4] Eric Hughes, “A Cypherpunk’s Manifesto”, Marzo 1993. [Online]
[Link]
[5] Accenture, “Tracing The Supply Chain”. [Online]
[Link]
[Link]
[6] Carlos Quilez, “Atún gourmet en realidad era atún de contrabando”, Mayo 2019.
[Online] [Link]
contrabando/4339/
[7] IBM Food Trust. [Online] [Link]
[8] Trazable. [Online] [Link]
[9] Mirror. [Online] [Link]
[10] Bitcoin. [Online] [Link]
[11] SHA256. [Online]
[Link]
01/documents/[Link]
[12] Alastria. [Online] [Link]
[13] Ethereum. [Online] [Link]
[14] “ConsensusPedia: An Encyclopedia of 30+ Consensus Algorithms”. [Online]
[Link]
e9c4b4b7d08f
[15] “Tolerancia a las fallas bizantinas”, Wikipedia. [Online]
[Link]
[16] “Problema de los generales Bizantinos”. [Online]
[Link]
[17] Peercoin. [Online] [Link]
[18] Hasgraph [Link]
[19] IPDB Foundation
[20] “How BigchainDB is good for Asset Registrations & Transfers”. [Online]
[Link]
[21] “Cosmos Inter-Blockchain Communication (IBC) Protocol”. [Online]
[Link]
[22] Tendermint. [Online] [Link]
[23] MongoDB. [Online] [Link]
[24] BigchainDB Whitepaper. [Online]
[Link]
[25] RFID. [Online] [Link]
[26] IEEE 802.11. [Online] [Link]
[27] IEEE 802.15. [Online] [Link]
standards/en/standard/802_15_4-[Link]
[28] MQTT. [Online] [Link]
[29] Mosquitto. [Online] [Link]
[30] PostgreSQL. [Online] [Link]
41
[31] Apache Hadoop. [Online] [Link]
[32] D3js. [Online] [Link]
[33] Chartjs. [Online] [Link]
[34] Grafana. [Online] [Link]
[35] Graphite. [Online] [Link]
[36] WCAG2.1. [Online] [Link]
[37] Swagger. [Online] [Link]
[38] Apidoc. [Online] [Link]
[39] ESLint. [Online] [Link]
[40] Jenkins. [Online] [Link]
[41] Mocha. [Online] [Link]
[42] OWASP. [Online] [Link]
[43] Docker. [Online] [Link]
[44] HTTP RFC7230. [Online] [Link]
[45] Raspberry Pi. [Online] [Link]
[46] Fritzing. [Online] [Link]
[47] DHT11 Humidity & Temperature Sensor. [Online]
[Link]
[Link]
[48] MFRC522. [Online] [Link]
[49] IPDB Foundation. [Online] [Link]
[50] Manifiesto IPDB Foundation. [Online] [Link]
foundation-assumes-governance-of-bigchaindb-software-and-testnet-51235322e14c
[51] Angular. [Online] [Link]
[52] React. [Online] [Link]
[53] Vuejs. [Online] [Link]
[54] Altair smartcore. [Online]
[55] Losant. [Online] [Link]
[56] Postman. [Online] [Link]
[57] [Link]. [Online] [Link]
[58] jsonwebtoken. [Online] [Link]
[59] dotenv. [Online] [Link]
[60] BigchainDB JavaScript Driver. [Online] [Link]
bigchaindb-driver
[61] BigchainDB JavaScript ORM Driver. [Online] [Link]
driver-orm
[62] Raspbian. [Online] [Link]
[63] PrimeNG. [Online] [Link]
[64] Script 4 Nodes BigchainDB. [Online]
[Link]
[65] Postman. [Online] [Link]
[66] Anna Corberó, Linkedin. [Online] [Link]
corber%C3%B3-551b2147
[67] VIKYNGO, UAM Emprende. [Online] [Link]
[68] “El método Lean Startup”, Eric Ries. [Ref-libro]
[Link]
innovaci%C3%B3n/dp/842340949X
[69] ScrumStudy. [Online] [Link]
42
Glosario
43
44
Anexos
A. Emprendimiento
Para este proyecto se ha hecho un trabajo adicional de emprendimiento en el que se ha
acudido a un programa de la Universidad Autónoma de Madrid y que se ha creído
conveniente documentar debido a la intención de llevar el aplicativo a un entorno real. En
este anexo no se profundizará mucho en documentar la información aprendida durante el
programa, pero sí dejar constancia de los ejercicios que se hicieron. También se
comentarán otros aspectos relacionados con el emprendimiento, como ha sido la búsqueda
de un equipo de colaboradores, la organización que se ha diseñado de cara a un futuro
desarrollo del proyecto con distintos integrantes y la difusión de proyecto en charlas. Por
último, se comentará el proceso de concesión de 1000 euros mensuales que dio IBM para
el desarrollo de este proyecto en la plataforma IBM Cloud.
• UAM Emprende
UAM Emprende es un programa en el que se imparten clases, ejercicios y charlas sobre
emprendimiento. A este curso se pueden presentar todos los alumnos de la Universidad
Autónoma de Madrid. Sin embargo, sólo VIKYNGO y otros 19 proyectos más, fueron
seleccionados para acceder al curso. Durante el programa, VIKYNGO recibió un premio al
mejor planteamiento de idea inicial (Figura A-0-1). El proyecto se puede encontrar en la
web oficial del programa [67]. Durante este curso se han tratado conceptos como “Lean
Startup”, “Propuesta de Valor” y “Tablero de experimentación Javelin”.
I
El Método Lean Startup [68] Figura A-0-2 es un proceso que se aplica para la creación
de nuevas empresas en entornos de mucha incertidumbre. Está basado en la creación de
nuevos productos y servicios por medio del aprendizaje validado, la experimentación y la
iteración en los lanzamientos del producto, a través del mínimo producto viable (MVP),
teniendo al cliente como fuente del aprendizaje.
Siguiendo este método, se plasman en el lienzo de Lean (Lean Canvas Figura A-0-3)
las hipótesis o suposiciones acerca del modelo de negocio en cada uno de los bloques. Con
esto conseguimos tener una visión global a cerca de nuestro proyecto. En la siguiente
figura, se muestra el método Lean Canvas aplicado a VIKYNGO.
II
Antes de pasar a validar las hipótesis para convertirlas en certezas, se busca el encaje
de la propuesta de valor (Figura A-0-4) con el segmento de clientes. Para ello, se
utiliza el lienzo de la propuesta de valor. Esta herramienta pretende dar a entender si de
verdad el producto/servicio les aporta valor a los clientes, cubre su necesidad o
soluciona su problema proporcionando la satisfacción que buscan. La clave de este
lienzo es empatizar con el cliente y entender qué le frustra y qué le hace feliz. Para
rellenar este lienzo ha sido necesario hablar con posibles clientes interesados en el
software.
III
Figura A-0-5 – Tablero de experimentación Javelin
IV
Otro de los ejercicios fue diseñar y crear una web corporativa en la que mostrar
información del producto a los clientes interesados. La web se puede encontrar en
[Link].
V
• Divulgación del proyecto
Para la divulgación del proyecto se realizarán charlas y artículos de investigación. El 26
de junio se convocó una charla en la que se habló sobre VIKYNGO y la tecnología
BigchainDB aplicada a las cadenas de suministro.
VI
B. Creando la red Blockchain en IBM Cloud
El proceso para levantar una red Blockchain puede ser bastante complejo según con qué
tecnología se trabaje. En el caso de BigchainDB, cuenta con un guion de comandos [64]
que levanta 4 nodos automáticamente (es el mínimo de nodos que requiere el algoritmo de
consenso de Tendermint).
Para levantar la red se ha creado una instancia en IBM Cloud con Ubuntu 18.04, 1CPU y
4GB de memoria RAM. Accedemos a la instancia utilizando SSH. Una vez dentro,
descargamos el repositorio de BigchainDB ¡Error! No se encuentra el origen de la
referencia. con la herramienta Git y ejecutamos el guión de comandos.
VII
32 mongodb3
33 959fac755cec mongo:3.6 "docker-entrypoint.s…"
34 3 months ago Up 3 months [Link]:32771->27017/tcp
35 mongodb2
36 9427101f8d7a mongo:3.6 "docker-entrypoint.s…"
37 3 months ago Up 3 months [Link]:32769->27017/tcp
Tabla B-2 - Contenedores Docker
Para comprobar que la red funciona correctamente hacemos una petición HTTP, a uno
de los nodos de BigchainDB, con la aplicación Postman [65] que es una aplicación muy
útil para hacer peticiones HTTP. Por ejemplo, hacemos un GET al nodo que se encuentra
en el puerto 32815 ([Link] La respuesta que nos devuelve el nodo
es la que se muestra a continuación:
1 {
2 "api": {
3 "v1": {
4 "assets": "/api/v1/assets/",
5 "blocks": "/api/v1/blocks/",
6 "docs":
7 "[Link]
8 [Link]",
9 "metadata": "/api/v1/metadata/",
10 "outputs": "/api/v1/outputs/",
11 "streams":
12 "[Link]
13 "transactions": "/api/v1/transactions/",
14 "validators": "/api/v1/validators"
15 }
16 },
17 "docs": "[Link]
18 "software": "BigchainDB",
19 "version": "2.0.0b9"
20 }
21
1 [
2 {
3 "public_key": {
4 "type": "ed25519-base64",
5 "value": "k6r5vKd+F2bC6SOVX6lYfs9LrIOBtZ5ecqU8VuheZWo="
VIII
6 },
7 "voting_power": 10
8 },
9 …
10 …
11 …
12 …
13 {
14 "public_key": {
15 "type": "ed25519-base64",
16 "value": "xui6nxqjEq2cBEzHpeHzLY9SThNerctsJnEngWj8t9g="
17 },
18 "voting_power": 10
19 }
20 ]
El siguiente paso es conectar un nodo local a la red que se acaba de desplegar con el fin
de estudiar el proceso de adición de nodos a una red Blockchain. Para este trabajo, el
programa encargado de administrar los nodos estará en nuestro servidor local, y por ello,
levantaremos un nodo que será nuestra puerta de acceso a la Blockchain. El despliegue del
nodo se ha hecho de forma manual, aunque de cara a trabajo futuro sería interesante crear
un script que automatizara ese proceso. A continuación, se detallan los pasos que se han
seguido basándose en la documentación oficial ¡Error! No se encuentra el origen de la
referencia.:
IX
• Compartir la clave pública y el identificador del nodo con los administradores
del resto de nodos. En nuestro caso, nosotros administramos todos los nodos
por lo que bastará con obtener acceder a esta información.
• Uno de los nodos tiene que proponer la entrada de un nuevo nodo validador,
introduciendo los datos del nodo desplegado siguiendo el siguiente comando:
• Aprobar la propuesta por 2/3 partes del total de poder de voto. Para ello 3 de los
4 nodos que tenemos instalados deberán introducir el comando $ bigchaindb
election approve <election-id> --private-key <path-to-the-
private-key>
Para comprobar que el nodo ha sido validado correctamente podemos hacer un GET al
puerto de BigchainDB de nuestro nodo:
1 [
2 {
3 "public_key": {
4 "type": "ed25519-base64",
5 "value": "k6r5vKd+F2bC6SOVX6lYfs9LrIOBtZ5ecqU8VuheZWo="
6 },
7 "voting_power": 10
8 },
9 …
10 …
11 {
12 "public_key": {
13 "type": "ed25519-base64",
14 "value": "9FcaoJurrmKaKiCg4EDv1y0tjdeuczxwjT24RBDACuA="
15 },
16 "voting_power": 9
17 }
18 ]
X
Podemos observar que nuestro nodo nos devuelve una respuesta y además nos da la
información de un nuevo nodo con poder de voto 9.
XI
C. Código del proyecto
1 /**
2 * @api {post} /api/v1/login Request Token
3 * @apiName PostLogin
4 * @apiGroup Authentication
5 *
6 * @apiParam {String} username Username unique ID.
7 * @apiParam {String} password Password associated with the username
8 account.
9 *
10 * @apiSuccess {JSON} token Token access.
11 *
12 * @apiSuccessExample {json} Success-Response:
13 * HTTP/1.1 200 OK
14 *{
15 * "token":
16 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImRpZWdvIi
17 wiaWF0IjoxNTYwMzQzMDk5fQ.9xHv04cJFLcOKRaDCwRP6FLKQj2rHfXKQskAMJx-NjA"
18 *}
19 *
20 * @apiError NotAuthorized Invalid password.
21 *
22 * @apiErrorExample Error-Response:
23 * HTTP/1.1 401 Not Authorized
24 * {
25 * "error": "Invalid password"
26 * }
27 */
28 [Link]("", function (req, res, next) {
29 let username = [Link];
30 let password = [Link];
31
32 [Link]("mongodb://" + [Link] + ":" +
33 [Link] + "/",{ useNewUrlParser: true }, function(err, db) {
34 if (err) {
35 [Link](400).send(err);
36 }
37 else {
38 [Link]([Link].DB_NAME).collection("users")
39 .find({username: [Link]}).project({"password":
40 true}).toArray(function(err, resp) {
41 if (err) {
42 [Link]();
43 [Link](400).send(err);
44 }
45 else {
46 [Link]();
47 if (resp[0].password !== password) {
48 [Link](401).send({error: "Invalid password"})
49 }
50 else {
51 const token = [Link]({"username": username},
52 [Link].SECRET_WORD);
53 [Link](200).json({token});
54 }
55 }
56 });
57 }
XII
1 [Link] = function(req, res, next) {
2 var token = [Link]['authorization'];
3 if(!token){
4 [Link](401).send({
5 error: "Es necesario el token de autenticación"
6 });
7 return;
8 }
9 token = [Link]('Bearer ', '');
10
11 [Link](token, [Link].SECRET_WORD, function(err, decoded) {
12 if(err) {
13 [Link](401).send({error: 'Token inválido'})
14 }
15 else {
16 [Link] = [Link];
17 next();
18 }
19 });
20 }
XIII
1 [Link]('/v1/blockchain/start', function (req, res) {
2 exec("( cd ./software/bigchaindb/ && sudo make start )", { shell:
3 '/bin/bash' },
4 (err, stdout, stderr) => {
5 if (err !== null) {
6 [Link](500).send(err);
7 }
8 else {
9 [Link](201);
10 }
11 });
12 });
XIV
13 )
14 const signedTransfer =
15 [Link](createTranfer,
16 [Link]);
const response = await [Link](signedTransfer);
[Link](200).send(response);
});
1
2 var interval = setInterval(function () {
3 // reset card
4 [Link]();
5 // Scan for cards
6 let response = [Link]();
7 if (![Link]) {
8 return;
9 }
10 [Link]("Activo detectado");
11 // Get the UID of the card
12 response = [Link]();
13 if (![Link]) {
14 [Link]("UID Scan Error");
15 return;
16 }
17 // If we have the UID, continue
18 let uid = [Link];
19 let ID = uid[0].toString(16) + uid[1].toString(16) + uid[2].toString(16)
20 + uid[3].toString(16);
21 [Link]("ID: " + ID);
22 // Stop
23 [Link]();
24
25 // Check broker connection
26 if ([Link] == true) {
27 if ([Link].ASSET_ACTION === "create") {
28 [Link]('asset/create', '{"AssetData": {"AssetID": "' +
29 ID + '"}, "AssetMetadata": ' + null + '}');
30 }
31 if ([Link].ASSET_ACTION === "data") {
32 let metadata;
33 [Link](type, pin, function (err, temperature, humidity) {
34 if (!err) {
35 metadata = {
36 temeprature: [Link](1),
37 humidity: [Link](1)
38 }
39 }
40 [Link]('asset/data', '{"AssetData": {"AssetID": "' +
41 ID + '"}, "AssetMetadata": ' + metadata + '}');
42 });
43 }
44 if ([Link].ASSET_ACTION === "transact") {
45 [Link]('asset/transact, '{ "AssetData": { "AssetID": "'
46 + ID + '" }, "AssetMetadata": ' + null + ' }, to: ' + pubKey + ', from:
47 keyPair + '}');
48 }
49 }
50 else {
51 [Link]("No se ha podido conectar con el broker");
XV
52 return;
53 }
54 // If create action then only 1 interval
55 if ([Link].ASSET_ACTION === "create") {
56 clearInterval(interval);
57 }
58 }, interval)
XVI
XVII
-1-