(Tiempo de lectura estimado: 20 min)
IOTA, una criptomoneda para el Internet de las cosas
Lo primero que debemos tener claro es que IOTA es una criptomoneda. Si no estás familiarizada con este último término seguro que sí te suena todo el movimiento que hay alrededor de Bitcoin y de otras monedas digitales o virtuales.
Hasta ahora habíamos visto que las criptomonedas se basaban en distintas variaciones de unas estructuras llamadas blockchain, que en resumen vienen a ser un registro distribuido (distributed ledger) donde se anotan las transacciones que se realizan con dicha moneda.
Estas transacciones, en un blockchain, se agrupan en bloques y los bloques están enlazados entre sí de tal manera que una vez entrelazados ya no se puede modificar ninguno de ellos sin que se rompa esta cadena.
Sin embargo blockchain tiene varios inconvenientes si queremos aplicarlos a la comunicación entre máquinas en el Internet de las cosas, entre ellos:
- Velocidad de generación de bloques, pues hasta que nos se generan los bloques y se verifican no se incluyen en la cadena y por lo tanto las transacciones no son aprobadas.
- Coste. En los blockchain tradicionales la generación de transacciones tienen un coste, dependiendo de lo compleja que sea dicha transacción o de cuánta cantidad de moneda estemos transfiriendo.
- Escalabilidad. Debido a la lentitud de generación de bloques se hace muy difícil que miles de máquinas puedan usar un blockchain para comunicarse entre sí.
IOTA es un sistema que nada tiene que ver con blockchain, aunque realmente sí está inspirado en él:
- Antes de nada no es una una sucesión de bloques enlazados entre sí, sino que usan una estructura llamada The Tangle (podríamos traducirla como la maraña). Un poco más abajo verás un dibujo.
- No existe minado de bloques, pues cada “bloque” es una sola transacción y para formar parte de The Tangle tan solo debe aprobar otras dos transacciones cualesquiera.
- Está pensado para hacer microtransacciones en tiempo real, por lo que el hecho de generar un bloque no tiene coste, tan solo el de verificar los otros dos obligatorios.
- Permite hacer transacciones offline e incorporarlas luego al Tangle.
- Tiene un crecimiento teóricamente infinito.
Lo ideal es que primero veas algunos ejemplos de estas comunicaciones machine-to-machine (M2M) y de esas microtransacciones, así cuando sigas leyendo verás más claro las situaciones que voy a ir planteando.
Ejemplos de uso de IOTA:
- Dispositivos que adquieren servicios en la nube de forma autónoma (almacenamiento, ancho de banda, transferencia de datos, etc). Imagínate que los sensores inteligentes supieran cuánto almacenamiento están usando y compraran más por su cuenta, pero que lo hicieran en paquetes de 50 MB.
- Dispositivos que generan electricidad y comercian con ella en una smartgrid, vendiendo la energía en pequeñas cantidades
- El caso contrario, electrodomésticos que compran la electricidad que van a usar.
Contenido
Abstract (Traducción literal de la introducción)
Weiner, J. (2005). The Tangle. New Yorker, 81(8), 43–51.
En este artículo analizamos los fundamentos matemáticos de IOTA, una criptomoneda para el Internet de las cosas (IoT). La principal característica de esta novedosa criptomoneda es “la maraña” (The Tangle), un grafo acíclico dirigido (DAG) para almacenar las transacciones. El Tangle mejora de forma natural a blockchain con un avance revolucionario, y ofrece características requeridas para establecer un sistema de micropagos maquina a maquina. Una contribución esencial de este artículo es un algoritmo de la familia de Markov Chain Monte Carlo (MCMC). Estos algoritmos eligen un enlace en el tangle para una transacción recién llegada.
Cómo funciona IOTA?
En IOTA podemos distinguir estos elementos principales
- Transacciones, son las operaciones que realizan los nodos que intervienen y usan IOTA.
- The Tangle. Es la estructura formada por estas transacciones al ir vinculándose (validándose), unas a otras
- Nodos, forman una red de computadores que generan y validan las transacciones, uniéndolas entre ellas. No forman parte del Tangle, sino que operan sobre el mismo.
Un funcionamiento a grandes rasgos podríamos describirlo así:
- En el origen se creó una transacción génesis, que contenía todos los tokens. Esta transacción dividió los tokens entre otras transacciones fundadoras del tangle. No se crearán más tokens en el futuro.
- A partir de entonces cada nueva transacción tiene que elegir dos transacciones existentes y aprobarlas. De esta forma quedan vinculadas al Tangle y ya forman parte de él.
- Los nodos que manejan el tangle deben tener algoritmos para generar nuevas transacciones y darles un peso, para elegir qué otras transacciones aprobar y para comprobar que no validan transacciones que se contradicen o son incoherentes. Lo curioso de este punto es que estos algoritmos no son impuestos por la propia red o el sistema, sino que son de libre elección, aunque más adelante verás como no vale hacerlo de cualquier forma.
- Conforme las transacciones son aprobadas directa o indirectamente por otras transacciones van subiendo su nivel de confianza, de tal forma que van haciendo cada vez más difícil que el sistema acepte transacciones de doble-gasto.
- Cuando los nodos van a generar una transacción nueva deben resolver una prueba criptográfica, al estilo de blockchain, y según el coste computacional de dicha prueba la transacción nace un con peso propio, siempre un número potencia de 3 (3n)
La dinámica de IOTA
IOTA es un sistema asíncrono, o sea, que los nodos no ven todos la misma versión de el Tangle ni siquiera la ven en tiempo real. Esto es debido a que mientras un nodo está generando una transacción nueva y eligiendo cuáles otras dos va a validar, puede haber otro nodo haciendo lo mismo.
Los nodos no deben ponerse de acuerdo entre sí para decidir qué transacción es válida y cuál no, no existe la noción de consenso como sí ocurre en blockchain.
Como no existe minado de monedas, para evitar los nodos perezosos, es decir esos que solo intervienen cuando tienen que introducir nuevas transacciones, se llevan un conteo estadístico de cuántas transacciones genera y aprueba cada nodo. Los nodos que no aprueban las suficientes transacciones son extraídos de la red.
Las transacciones en el Tangle
Una transacción en IOTA tiene varios parámetros que es importante que nos queden claros:
- El peso propio (own weight). Es un número, potencia de 3, que le es asignado por el nodo en el momento de la creación, y que es proporcional al esfuerzo computacional que hizo el nodo al resolver el puzzle criptográfico. Las transacciones con pesos más altos son más “importantes” que las de peso más bajo. Para evitar abusos, es de suponer que ningún nodo puede generar un número alto de transacciones de peso alto en un período corto de tiempo.
- Peso acumulado (cumulative weight). Es el peso propio más la suma de los pesos propios de todas las transacciones que aprueban a esta, tanto directa como indirectamente.
- Puntuación (score). Es la suma del peso de la propia transacción más la suma de los pesos propios de todas las transacciones que ésta ha aprobado directa o indirectamente.
- Altura (height). Es la longitud del camino más largo desde una transacción hasta la génesis.
- Profundidad (deep). Es la longitud del camino más largo desde la génesis hasta una determinada transacción.
Cuando las transacciones acaban de llegar al Tangle y todavía nadie las ha validado, son denominadas “tips” (transacciones punta). Si llegan nuevas transacciones detrás y las aprueban, ahora estas transacciones serán las nuevas puntas.
En los siguientes dos gráficos ves las transacciones como bloques, el número grande indica el peso acumulado y el pequeño de la esquina el peso propio. En la segunda imagen te muestro como la llegada de nuevas transacciones modifica el peso acumulado de todo el Tangle.
Conforme llegan las transacciones y van validando otras que ya estaban, van aumentando el peso acumulado de todo el Tangle, así las transacciones más antiguas van ganando en nivel de confianza.
Por lo tanto el parámetro más importante en una transacción es el peso acumulado, pues es el que convierte a una transacción en una transacción confiable.
La estabilidad del sistema, los cutsets
Atención el texto que vas a leer a continuación contiene explicaciones y fórmulas matemáticas,
¡pero no te asustes !
Voy a hacerte un breve resumen, ya sabes que si te gusta y quieres saber más puede leerlo directamente del artículo original, que encontrarás aquí.
En el siguiente diagrama puedes ver el estado del Tangle en el momento “t”. Puedes ver algunas transacciones que son “tips” y luego el resto del Tangle como transacciones ya validadas.
En el artículo original se hacen una serie de asunciones para poder hacer un modelo matemático del comportamiento del Tangle, y así más adelante poder analizar qué tipo de ataques puede sufrir y qué tasa de éxito puede llegar a tener cada uno.
- Las transacciones son generadas por un gran número de nodos independientes, y por lo tanto se comportan como un proceso de Poisson, que viene a ser un proceso de generación de objetos de forma aleatoria, cada uno con ciertas características, y que se producen a un ritmo de (lambda)transacciones por minuto.
- Se asume que es constante en el tiempo y por lo tanto cada unidad de tiempo se produce el mismo número de transacciones
- Cada nodo que maneja el Tangle tiene la misma capacidad de
proceso y cada uno de ellos tarda “h” minutos en realizar todas las operaciones implicadas en la generación de transacciones. - Para simplificar el análisis se asume que cada nodo elige y valida dos transacciones “tips” para introducir su transacción en el Tangle.
- Y yo mismo voy a hacer una simplificación. Para no liar mucho el lenguaje usado vamos a considerar las unidades de tiempo en minutos. Realmente da igual qué unidad de tiempo usemos, podrían ser segundos o milisegundos, las conclusiones no variarían. Si consideras el tiempo en minutos creo que además te va a resultar más sencillo ponerte en situación de lugar. Si quieres comprobar en tiempo real cuántas “tips” se producen, échale un ojo a IOTA en tiempo real
En el siguiente gráfico te muestro el Tangle en el momento “t”.
Cuando un nodo lee el Tangle en el momento “t” empieza a procesar sus transacciones, tardando un tiempo “h” en hacerlo. Durante ese tiempo el resto de nodos ha seguido generando transacciones a un ritmo de transacciones por minuto. Por lo tanto cuando el nodo termina de insertar su transacción el Tangle ya ha cambiado, y se han agregado h transacciones nuevas.
Esto significa que los nodos siempre tiene h transacciones ocultas y que es posible que las transacciones que ha elegido para validar ya no sean “tips” en el momento de realizar la validación, aunque sí lo eran en el momento de elegirlas.
En el siguiente gráfico te aclaro un poco el tema. Verás que en el momento “t” hay transacciones “tips” con un borde verde y relleno azul que son esas que puede que ya no sean “tips” cuando el nodo termine la operación. Las que aparecen en los tiempos t+1, t+2, etc son las que el nodo no conoce hasta que termina de procesar en el tiempo t+h.
Esto también significa que cada transacción tarda 2h minutos en ser aprobada, puesto que los primeros h minutos primeros está oculta y cuando es elegida el nodo tarda otros h minutos en aprobarla.
En cualquier momento dado “t” existe una cierta cantidad de “tips”, a este conjunto de transacciones se las denomina cutset (recorte o sección). Cualquier camino desde las transacciones que lleguen después del tiempo “t” deben pasar a través de este “cutset”. Cuando un cutset se hace muy pequeño se le denomina checkpoint, o punto de control, y son puntos interesantes para “podar” el árbol o realizar algunas otras tareas.
Más adelante verás cómo a pesar de que la estrategia de selección de transacciones a validar no está fijada por el sistema, hay varios motivos por los que los nodos terminarán eligiendo las transacciones “tip”, y no dos transacciones aleatorias, pues elegir transacciones del interior del Tangle puede dar origen y favorecer distintos tipos de ataques.
Con el fin de que una transacción no quede “olvidada” o que pase mucho tiempo sin su aprobación, un nodo puede generar una transacción vacía para aprobarla.
¿Cómo varía el peso acumulado en el Tangle?
Como te decía antes, las transacciones van aumentando su peso acumulado conforme son validadas directa o indirectamente por nuevas transacciones que van llegando.
Si el Tangle está en un régimen bajo, en el que llegan pocas transacciones por minuto, el aumento del peso acumulado es bastante lineal, puesto que si se genera por ejemplo una sola transacción por minuto, ésta será validada por la siguiente que llegue y así consecutivamente.
Sin embargo en un régimen de alto de llegada de transacciones este comportamiento no alcanza la linealidad hasta pasado un tiempo, puesto que una determinada transacción puede tardar cierto tiempo en ser validada, y las validaciones indirectas tampoco crecen de forma lineal. A este período de crecimiento del peso acumulado de esta forma pseudo-aleatoria se le denomina periodo de adaptación. Si te gustan las matemáticas y el estudio de probabilidades, vas a disfrutar mucho con esta parte del artículo original, no te la pierdas.
Posibles escenarios de ataques
Supongamos el siguiente escenario:
- Un consumidor de energía compra cierta cantidad a un micro productor o prosumer (productor y consumidor), que genera la electricidad de forma particular en su hogar.
- Realiza la compra mediante una transacción en IOTA, realizando una transferencia de cryptomonedas al vendedor.
- Al mismo tiempo genera otra transacción con las mismas monedas para realizar otra compra a otro vendedor. Es el ataque del double-spending o doble gasto, donde un pagador fraudulento usa las mismas monedas dos veces.
- Cuando en la transacción del punto 2 empieza a ser validada por el Tangle y empieza a adquirir peso acumulado, el vendedor la acepta y realiza la venta.
- Pero en ese momento el comprador, con gran capacidad de cómputo, genera un gran número de transacciones falsas que aprueba la transacción del punto 3, y no el del punto 1. Esto haría a dicha transacción subir rápidamente su peso y ser la preferida para el resto de transacciones que están por venir.
- La transacción original terminará en una “rama muerta” del Tangle y será eliminada.
Ataque de peso grande
El ataque del punto 3 también se puede hacer con una sola transacción con un peso enorme que hace que el resto de transacciones la elijan y hagan un “desvío” del Tangle, o subtangle, a partir de dicho punto. Para estos ataques son necesarias altas capacidades de cómputo.
Estos ataques sobre la misma transacción se pueden repetir hasta que finalmente tengan efecto y sean exitosos.
Una de las posibles contramedidas es limitar el peso máximo de una transacción, pues la capacidad de cómputo del resto de la red será mayor que la del atacante y éste no podrá triunfar en su ataque. De todas formas se puede ver cómo elegir las transacciones para aprobar basándose en su peso acumulado tiene bastantes inconvenientes.
Recuerda que tienes las demostraciones en el artículo original, por si quieres pasar un buen rato. 🙂
Ataque de cadena parásita
En esta ocasión el atacante ha fabricado de antemano una cadena que la enlazó con una transacción tiempo atrás y que ha ido rellenando de transacciones sin sentido, pero que de vez en cuando ha ido referenciando algunas de ellas con transacciones legítimas en el Tangle. En el momento de realizar la transacción “legítima”, esta va a parar a la cadena principal y entonces inunda la cadena parásita para que la primera que hizo gane más peso y anule a esta última.
Tras analizar este tipo de ataques se propone un algoritmo de elección de transacciones basado en Markov Chain Monte Carlo (MCMC).
El algoritmo MCMC de selección de “tips”
Este algoritmo consta de los siguientes puntos:
- Consideremos que podemos poner un cierto número de “partículas” a caminar por el Tangle de forma aleatoria, las denominadas “random walkers”.
- Las podemos colocar en cualquier sitio del Tangle, no necesariamente al principio y caminarán incrementando su altura hacia la zona donde están las “tips”, transacciones aún sin aprobar. Para pasar de una transacción X a una Y, Y debe aprobar a X directamente.
- Las dos primeras partículas que lleguen a una tip serán las que ganen y esas tips serán las elegidas para ser aprobadas. Pero para proteger el algoritmo de posibles transacciones que se hayan perdido por el Tangle y que nadie haya aprobado (“lazy tips”), se descartan las partículas que hayan llegado demasiado rápido.
Si ahora aplicamos este algoritmo al ataque de cadena parásita, verás que debido a la naturaleza aleatoria de MCMC es muy difícil que las partículas terminen saltando a la cadena del atacante. Incluso si alguna estuviera colocada en la cadena parásita por casualidad, avanzaría por transacciones con menos peso acumulado que las partículas que cayeron en la rama principal.
El ataque de separación contra MCMC
Para poder atacar un Tangle cuyos nodos usan MCMC para elegir las tips a aprobar se podría pensar en un ataque donde se van creando dos ramas equilibradas. Esto quiere decir que las transacciones nuevas irán eligiendo tips de ambas ramas y ambas crecerán por igual. El atacante tendrá especial cuidado en neutralizar cualquier desviación en dicho equilibrio.
En esta situación el atacante puede colocar transacciones iguales en ambas ramas y por lo tanto gastar dos veces las mismas monedas, double spending.
Una posibles solución es que el algoritmos de selección no funcione de forma tan simétrica y que tenga una “predilección” por alguna de las ramas. Esto haría que el esfuerzo computacional del atacante fuera bastante mayor. Si además estamos en un Tangle en un régimen alto con una tasa alta de creación de transacciones, entra en juego la latencia de la red y el atacante nunca sabe cuántas transacciones nuevas se han creado en un instante y que rama han elegido.
Si cuando usemos MCMC en vez de colocar las partículas en una zona profunda se hace en una zona más cerca de las tips, conseguiremos también romper ese balance que pretende el atacante.
Por lo tanto:
- Para defendernos de los ataques de gran peso, limitaremos el peso propio de cada transacción a un tope máximo.
- Con ese tope máximo un atacante todavía podría intentar un ataque, pero en un entorno de alto ritmo de creación de transacciones no tendría suficiente capacidad de computación para hacer prevalecer su operación.
- Los ataques del tipo cadena parásita hacen que los algoritmos basados en el peso acumulado no sean apropiados, y por lo tanto se propone el algoritmos MCMC.
Resistencia a la computación cuántica
Bien es sabido que un supercomputador no tendría grandes dificultades en minar blockchains, debido a su eficiencia en la solución de los problemas criptográficos para conseguir bloques nuevos.
En IOTA un ataque por un supercomputador tendría éxito si usa una transacción de gran peso, pero dado que hemos indicado que el peso estaba limitado este ataque ya no es posible tal cual. Además el tiempo de cómputo necesario para generar una transacción no es demasiado largo, puesto que no es una prueba tan compleja como en blockchain, incluso se puede decir que es un tiempo comparable a realizar cualquier otra tarea en el Tangle, por lo que un supercomputador será más rápido, pero no habrá una ventana tal que permita que gane el control.
Espero sinceramente que te haya gustado el artículo. Si has llegado hasta aquí puede que también quieras leer este fantástico artículo sobre IOTA (en inglés).
Si tienes algún comentario que hacer, alguna duda, corrección o sugerencia, puedes hacerlos en esta misma página.
Si quieres conocer más arquitecturas IoT, vuelve a la sección donde encontraras los artículos sobre ellas.