¿Cuánto has oído hablar de Blockchain y DLT en los últimos meses? Muchísimo, ¿verdad? En este post queremos daros alguna alternativa a este tipo de tecnologías.

Aunque mantiene alguna de las características de Blockchain, tiene algunas particularidades que aportan un valor diferencial para determinados casos de uso basados en IoT. Hoy en el blog os hablamos de IOTA.

A estas alturas es difícil no conocer nada sobre la tecnología Blockchain y los beneficios que puede traer a la sociedad. Palabras como Bitcoin, Ethereum, criptomonedas, o el Internet del Valor son términos sobre los que ya hemos hablado en otros artículos.

Pero, ¿qué perspectiva nueva aporta al ecosistema DLT tecnologías como Tangle e IOTA?

Un DLT (libro mayor distribuido) es un consenso de datos digitales replicados, compartidos y sincronizados distribuidos geográficamente en múltiples sitios, países o instituciones. No hay administrador central o almacenamiento de datos centralizado.

IOTA es básicamente eso, un DLT. ¿Qué diferencia a IOTA de otras redes de blockchain? Si bien es cierto que hay muchos tipos de redes blockchain y muchas implementaciones con características distintas (algunas de ellas parecidas a las de IOTA), podemos resumirlo en las siguientes:

No utiliza mineros

El rol del minero no existe en el ecosistema de IOTA. En un DLT de tipo blockchain con PoW (si no conoces qué es esto, puedes echar un vistazo a este post) para consolidar una transacción se utiliza un sistema de bloques, los bloques son resueltos matemáticamente por un conjunto de nodos que están constantemente tratando de resolver por fuerza bruta un problema matemático, obteniendo a cambio una recompensa.

Actualmente la media es de 1900 transacciones por cada bloque minado, por lo que el esfuerzo computacional es enorme, de ahí que sea necesario el uso de pools de mineros y trabajar al mismo tiempo.

En IOTA no es así ya que no necesita de un conjunto de mineros dedicados, solo necesita validar dos transacciones previas por cada transacción, mediante una pequeña prueba de trabajo similar a otro tipo de redes pero con una dificultad menor.

No hay comisiones

Las transacciones son gratuitas.

Es escalable

No hay limitaciones en la estructura de DLT, es decir ni en tiempo, ni en forma. Las DLT de blockchain tienen un formato específico, es decir un número de transacciones acotadas por tiempo.

Por ejemplo, en la red de Bitcoin actualmente la media es de 1900 transacciones por cada bloque, teniendo un bloque cada 10 minutos.

Resistente a fuerza bruta (Computación Cuántica)

Como en el resto de redes DLT, existe una figura que son los monederos o direcciones donde apuntan las transacciones. Estos monederos, al ser digitales, están protegidos por una clave privada.

Sin embargo, los sistemas de cifrado que se usan actualmente, podrían verse comprometidos con sistemas como la computación cuántica. IOTA ha optado por resolver este potencial problema, implementando el sistema de firmas Winternitz.

Una característica muy importante de Winternitz es cómo afecta al uso del monedero. Entendemos al monedero como el recipiente donde se guardan las monedas y es que, al contrario de otras DLT, un monedero en IOTA no es reutilizable, es como una hucha, donde metes monedas pero no puedes sacar, solo hasta que decides romper la hucha y sacar el dinero.

En ese momento es cuando coges el dinero que necesitas enviándolo a otro usuario y el resto de monedas lo metes en otra hucha nueva. La hucha rota, queda accesible, pero nunca se debe volver a usar ya que se corre el riesgo de no poder acceder de nuevo a los fondos.

El software monedero de IOTA tiene codificado la regla anterior y advierte que no es posible reutilizar esta address rota, por lo que si programamos nuestro software y no tenemos esta precaución podemos perder los fondos que ingresemos.

El motivo de esto es que Winternitz expone parte de la clave privada en la hash de la transacción que junto con la address, por fuerza bruta podría acceder a los fondos, es por esto que cada vez que tenemos un nuevo monedero estamos renovando la seguridad. Más adelante se detalla la generación de monederos y los niveles de seguridad.

Transacciones con valor 0 y Mensajería

Se permiten transacciones de texto dirigidas a una cartera. Los monederos de IOTA, además de poder enviar o recibir monedas, tienen la habilidad de recibir o enviar mensaje.

A primera vista no tiene mucha utilidad, pero cuando tenemos un evento en base al mensaje entrante, podemos reaccionar enviando un pago u otro mensaje.

Es decir, si en mi monedero recibo el texto pactado, podríamos realizar un pago o enviar otro mensaje sin ningún tipo de coste ya que es posible enviar transacciones con mensaje sin valor económico.

PoW ligera

Como en otras DLT, para evitar el spam, la sobrecarga de la red por un mal uso o evitar ataques de tipo Sybil, se recurre al método PoW. El concepto de 'Dificultad en la prueba de trabajo' en IOTA es estático y lo suficientemente ligero como para realizarla desde un dispositivo con pocos recursos.

Con estas bases se ha creado un sistema que es capaz de realizar transacciones entre dispositivos electrónicos o personas, con mensajería, a coste cero, sin estar limitados por el tiempo de minado de bloques, sin nodos dedicados de minado, sin que afecte la dificultad en la PoW.

Hasta ahora con blockchain de Bitcoin por ejemplo, los mineros soportan las tareas de guardar una copia de la base de datos, buscar y difundir la solución a la PoW, a cambio reciben una compensación económica, lo que garantiza la estabilidad de la red.

La arquitectura de IOTA es singular, ya que el interés de tener un nodo que mantenga la base de datos y pueda realizar PoW a demanda, no es el de una recompensa económica, sino la de generar sus propias transacciones.

Es decir, la tendencia es que cada usuario que haga transacciones tenga sus datos con él y no un tercero implicado. Esta situación abre las puertas al mercado de datos.

El ejemplo del anterior párrafo lo podemos ver en esta web. Es una PoC donde los dueños de los datos pueden monetizar la información.

Tangle como soporte de transacciones

En IOTA las transacciones se realizan sin la intervención de un tercer rol, el minero. Esto es posible ya que las transacciones se realizan sólo entre emisor y receptor con la particularidad de que el emisor debe de validar otras dos transacciones que quieran ser enviadas a sus respectivos receptores.

Es decir, esta acción representa un grafo acíclico dirigido. Este grafo tiene tres capas:

  1. La capa de transacciones que han sido validadas y consolidadas dentro del grafo. Color verde.
  2. La capa de transacciones que están en proceso de validación y consolidación. Color rojo.
  3. La capa de nuevas transacciones que inician la petición de inclusión de en grafo y están esperando a nuevas tx. Color gris.

En esta estructura no hay limitación del tiempo, por lo que todas las transacciones nuevas se envian sin tener que esperar al minado de otras transacciones que pertenezcan a un bloque determinado. Simplemente porque no hay bloques.

Para realizar el envío de una transacción, al igual que en blockchain, cada transacción debe contener una prueba de trabajo válida.

Para realizar la PoW se toman los valores que componen una transacción:

La PoW se da por correcta si el hash generado contiene en su terminación en tantos caracteres '0' como se ha configurado en la red como dificultad, por el valor mwm (minimum weight magnitude), para homogeneizar la prueba de trabajo todos los nodos o todos los validadores tienen un valor mínimo configurado, por defecto 14.

Esto asegura que las transacciones entrantes cumplen con este requisito mínimo.

Como muestra la imagen el valor de:

Value B in trits =
 0 -1 -1 0 0 1 0 -1 1 0 0 1 1 -1 1 0 1 0 1 1 1 0 0 0 -1 1 0 0 -1 0 1 1 0 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 0 -1 0 0 0
 1 1 -1 1 1 -1 0 -1 -1 0 -1 -1 1 1 0 1 -1 0 0 0 -1 1 0 1 1 1 0 1 1 -1 0 -1 1 -1 -1 1 1 -1 -1 0 -1 -1 1 -1 0 -1 -1 0 -1 -1
-1 0 1 0 1 0 1 -1 1 -1 0 1 0 1 0 1 -1 0 -1 1 0 0 0 1 -1 -1 0 0 0 -1 0 1 -1 1 -1 0 1 -1 -1 0 -1 -1 0 1 -1 0 -1 1 -1 0
-1 -1 0 -1 1 1 1 1 0 1 0 -1 1 1 0 -1 -1 -1 0 0 1 1 1 -1 -1 0 0 0 0 -1 0 -1 -1 -1 1 1 1 1 -1 1 0 -1 -1 -1 1 -1 1 -1 0 1
-1 -1 1 -1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 -1 1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

% block:blockquote
% items:
% text:Nota: En su parte final contiene al menos tantos ceros como el valor de de la propiedad mwm, por defecto 14.
% endblock

El usuario A quiere enviar una transacción al usuario B. Para ello, selecciona al azar dos transacciones nuevas usando los algoritmos de equilibrio conocidos como Nash y Montecarlo, que buscan balancear la carga de selección de transacciones.

Además, verifica que la prueba de trabajo de esas dos transacciones es correcta y se ajusta al valor predeterminado por la red.

A continuación, realiza la prueba de trabajo de su transacción firmando y dejándola disponible para que otra transacción de un usuario C la incluya dentro de la propia transacción de C.

Walkthrough de una transacción

Fuente Fuente

En el esquema anterior muestra cómo un usuario 5, para realizar su transacción, valida que el PoW de las transacciones-aristas 2-3 es correcto y las incluye como trunk/branch dentro del cálculo de su transacción.

El usuario 6 se le denomina Tip, es el último en la cadena, este hace referencia al usuario 5 cómo branch, comprueba que el PoW del usuario 5 se haya generado correctamente.

Para mandar su transacción, el usuario 6 necesita comprobar el PoW de otro usuario, por ejemplo el 4; este sería el trunk. Recordamos que se necesitan dos transacciones previas denominadas trunk y branch.

Una vez comprobado, el usuario 6 realizará el PoW de su propia transacción, firmaría el conjunto de la transacción incluyendo trunk/branch de usuarios previos y entonces haría un broadcast a la red indicando que hay disponible una transacción, repitiendo así el ciclo.

Otro punto importante para realizar la transacción es la profundidad de selección de TIPS, esto lo definiremos como la herencia necesaria para consolidar una transacción. Al igual que el valor de minWeightMagnitude es necesario para evitar el Spam, la profundidad nos asegura que nuestra transacción tiene una historia.

Por ejemplo, todas las transacciones están indirectamente relacionadas con el génesis 0.

La transacción 6 está directamente relacionada con la 5.

Las transacciones 0, 1, 2 están validadas, por lo que la 6 también lo estará, en el momento que 3, 4, 5 lo estén. La profundidad mínima está fijada en 3, por lo que entendemos que en orden jerárquico, mi transacción estará validada cuando mi padre, abuelo y bisabuelo estén validados.

Explicado de esta forma la sensación que da es de que estamos ante algo marciano, para esto podemos ver en el simulador su funcionamiento.

Ejemplo de una transacción, al conjunto de los tres nodos que participan en la transacción se le denomina bundle. Un nodo es vinculado a otros dos. Fuente. Ejemplo de una transacción, al conjunto de los tres nodos que participan en la transacción se le denomina bundle. Un nodo es vinculado a otros dos. Fuente.

El resultado a lo largo del tiempo es que se generan grafos de transacciones, que tienen el aspecto de las siguientes imágenes.

Estas imágenes son distintas representaciones de las transacciones en IOTA. Al conjunto transacciones se denomina Tangle, vemos que es diferente al sistema de bloques de blockchain, que es secuencial y se representa así:

Fuente Fuente

IOTA minimiza algunas de las desventajas de las principales redes de blockchain, como puede ser:

En este punto es importante recordar la existencia de redes privadas y redes semiprivadas, por ejemplo Corda R3, Alastria o HyperLedger, que son capaces de procesar un elevado número de transacciones manteniendo las características de las DLT, y que hoy en día son la referencia en proyectos en los que el carácter distribuido de la red aportan un alto valor añadido.

Conceptos básicos

Antes de entrar en la programación de una transacción hay que tener dos elementos:

Ambos tienen en común el alfabeto ‘9ABCDEFGHIJKLMNOPQRSTUVWXYZ’ y no pueden contener otro carácter.

Esta cadena debe ser aleatoria para cada usuario y se puede generar de forma manual, con un script bash, por ejemplo en linux:

cat /dev/urandom |tr -dc A-Z9|head -c${1:-81}
‘STKGY9PTOTVOGGQENVQMARJQIDKDSZVHIGZTBOT9BHQHWCZXESAAXA99GZRYGESQLQLSJVGEFPIJFZEYY’

% block:blockquote
% items:
% text:Nota: Esta seed es importante no compartirla con nadie, ya que da el acceso a todos los fondos de la cartera y nunca generar una seed desde una plataforma web o programas de terceros que no sean de confianza.
% endblock

Ya tenemos una seed, por lo que ahora el siguiente paso es generar una cartera donde almacenar los fondos y desde la que se enviarán las transacciones o mensajes.

Al usar el API de IOTA para generar el wallet, este utiliza una función determinista que recibe como parámetro la seed. Este API básicamente calcula las direcciones de monedero y devuelve una colección indexada de direcciones.

Al generar direcciones, también debe tener en cuenta que existen tres niveles, llamados niveles de seguridad (1, 2 y 3). Cada nivel de seguridad genera un conjunto de direcciones totalmente independientes. Las direcciones del Nivel de seguridad 1 son totalmente diferentes de las direcciones del Nivel de seguridad 2 o del tercer nivel de seguridad.

En definitiva, el nivel de seguridad indica lo difícil que es generar una clave privada desde la wallet, es decir realizar el proceso inverso. El nivel de seguridad predeterminado es 2.

Por lo tanto, con una seed generamos una secuencia de claves privadas, con las que se generan los monederos.

Fuente Fuente

Debemos tener en cuenta que estamos acostumbrados a pensar en binario, inconscientemente 0 o 1, verdadero o falso.

IOTA utiliza un sistema ternario, base 3 con los estados 0,1, -1 y por analogía utiliza como unidad mínima el Trit (Trit = Trinary digit), en lugar de bit.

Por otra parte también utilizaremos otra unidad llamada Tryte, compuesto por tres Trits => 3^3=27 esto nos da 27 combinaciones posibles.

También IOTA tiene su propio alfabeto, que va desde la A a la Z y el carácter 9.

Veamos un ejemplo: convertir a trites un texto en ascii.

El valor de 1 Byte puede ser representado en 2 Trytes, por lo que podemos obtener el valor decimal de un carácter en ascii.

De un valor decimal podemos derivar a dos tryte calculando su equivalencia (por ejemplo, 100 se expresa como 19 + 3 * 27).

Dado que el alfabeto de tryte contiene 27 valores de trytes:

  1. El primer valor de tryte es el valor decimal módulo 27 (que es la longitud del alfabeto).
  2. El segundo valor es el resto de el valor decimal - el primer valor dividido por 27.

Los dos valores devueltos desde el Paso 2. son la entrada como índices en el alfabeto de trytes disponible (9ABCDEFGHIJKLMNOPQRSTUVWXYZ), para obtener el valor de tryte correcto.

Digamos que queremos convertir el carácter ASCII de Z.

Nuestros dos valores son 9 y 3.

Para obtener el valor de tryte ahora simplemente lo insertamos como índices en el alfabeto de tryte:

  1. El primer valor de prueba es '9ABCDEFGHIJKLMNOPQRSTUVWXYZ' [9] = I
  2. El segundo valor de prueba es '9ABCDEFGHIJKLMNOPQRSTUVWXYZ' [3] = C

Por lo tanto, el carácter Z en ASCII se representa como IC en Trytes.

Como ejemplo, la función del API de IOTA que representa en Trits, un valor Tryte:

TryteString(b'YZJEATEQ9JKLZ')
'Number of Trytes: 13'
\[1, -1, 0, -1, 0, 0, 1, 0, 1, -1, -1, 1, 1, 0, 0, -1, 1, -1, -1, -1, 1, -1, 0, -1, 0, 0, 0, 1, 0, 1, -1, 1, 1, 0, 1, 1, -1, 0, 0\]
'Number of trits: 39'

Conclusiones

Como resumen de las características que hemos visto de IOTA, podemos decir que IOTA es una tecnología de cartera distribuida de tipo permisionless, totalmente gratuita, segura ante computación cuántica cuyo principal caso de uso es generar transacciones entre dispositivos IoT.

IOTA propone un ecosistema de procesos para facilitar la comunicación entre dispositivos IoT y que, entre ellos, pueda existir una economía de máquinas. Es decir, que un dispositivo IoT pueda tener una cartera digital con la que poder enviar o recibir transacciones de valor.

En próximos post realizaremos unos pequeños ejemplos para iniciarnos en la programación del API de IOTA y Tangle como soporte de transacciones entre dispositivos IoT con o sin valor económico.

Happy coding!

Cuéntanos qué te parece.

Enviar.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.