Blockchain

¿Cómo Ser Un Desarrollador Blockchain?

Cómo comenzar a desarrollar en blockchain

El viaje que supone ser un desarrollador de blockchain puede ser muy atemorizante, pero en esta guía voy a intentar simplificar aquellos aspectos generales para transformarse en uno. El artículo estará compuesto de varios objetivos que debes ir cumpliendo antes de pasar al otro.

No hace falta decir que estamos ante una auténtica revolución con esta nueva tecnología llamada blockchain. Esta puede llegar a tener un impacto tan importante en nuestras vidas que ahora mismo hay una creciente necesidad de personas capacitadas para la tarea. Si buscas transformarte en un desarrollador para proyectos que trabajen con la tecnología de cadena de bloques mejor que sigas los pasos que veremos a continuación.

Espero que al finalizar de leer esto tengas una idea importante de qué actitudes se requieren y cuáles son los pasos en el desarrollo de tu carrera como programador de blockchain. Está claro que no te convertirás de la noche a la mañana en un gran desarrollador con un sueldo enorme o un proyecto que ganará millones, implica tiempo y esfuerzo. Pero si eres lo suficiente dedicado en la tarea de aprender sobre esta tecnología entonces a la larga obtendrás grandes beneficios.

Contenido

#1 Entender los aspectos básicos

Antes de comenzar a escribir una línea de código es necesario adquirir conocimientos sobre los aspectos básicos de la tecnología. Nadie desarrolla un producto sin entender las tecnologías primero ni las necesidades del cliente. Es importante entonces familiarizarse con algunos conceptos.

Si todavía no has leído sobre esta tecnología deberías comenzar entendiendo algunos conceptos:

  • Blockchain: La blockchain podemos traducirlo como una cadena de bloques, en donde cada bloque contiene información valiosa y que no requiere de ninguna entidad central para su supervisión. Esta utiliza la criptografía para obtener la seguridad y la inmutabilidad de la que tanto se jacta.
  • Descentralizada: Para poder obtener estos objetivos la cadena de bloques es descentralizada, ya que la información no se encuentra en ningún ordenador en particular, tal es el caso de los servidores que hospedan sitios webs, sino que hay copias diseminadas en varios ordenadores de la red, también llamados nodos.
  • Mecanismo de consenso: Los mecanismos o algoritmos de consenso son los que permiten validar que información es agregada o no al blockchain. Es una componente importante de la descentralización.
  • Mineros: Se llama mineros a las personas que ofrecen el poder de cómputo de sus ordenadores para verificar los bloques, a cambio reciben una recompensa en la criptomoneda nativa de esa blockchain. (¿Qué es la minería de Bitcoin?)

En este sitio web tenemos todo un diccionario con estos términos en donde profundizó estos temas. Es aconsejable leerlos y estudiarlos cuidadosamente antes de comenzar a trabajar. Si no dominas estos términos seguramente luego cuando comencemos a ver cuestiones más específicas te pierdas.

Existen otros términos también muy importantes que no son propiamente de la blockchain, pero que tiene una estrecha relación. También es importante aprender sobre cripto económica, ya que la gran mayoría de personas entienden todos aquellos aspectos técnicos, pero carecen de los conceptos económicos esenciales.

Esta carencia de conocimientos se puede ver de forma notable en algunas de las ICO que salen a diario. En donde el desarrollo técnico está cubierto con holgura, pero la parte económica no está planteada de forma correcta.

Aquí lo aconsejable es leer sobre economía. Las criptomonedas no nacieron por el simple hecho de crear monedas en un mundo digital, sino para enfrentarse a problemas recurrentes como la expansión monetaria y crediticia.

La criptografía también es un aspecto a destacar si queremos empaparnos de todo aquello que es importante para ser un buen desarrollador de blockchain. Conceptos como claves privadas y claves públicas son prácticamente excluyentes de este mundo.

Por último, aunque no menos importante, entender cómo funciona Bitcoin. Esta fue la primera criptomoneda y es la más popular, de la que muchas altcoins se basan. La fuente principal para aprender de uno de las aplicaciones más importantes de de la tecnología blockchain la encontramos en el whitepaper, escrito por su creador Satoshi Nakamoto.

Con todo esto, lo cual no es poco, podemos dar por terminado este objetivo. El cual sienta las bases para los próximos y el cual no podemos dejar de lado. Recomiendo no saltarse esta parte, ya que el resto será muy complejo de entender.

En resumen podemos decir que es necesario:

  • Adquirir conocimientos básicos de los términos más comunes de la tecnología
  • Saltar a aspectos más técnicos sobre blockchain
  • Leer el whitepaper de Satoshi Nakamoto sobre Bitcoin

#2 Aprender cómo funciona el proceso

Es bastante difícil intentar mejorar algo y crear un producto que ofrezca soluciones si no conoces como funciona el proceso. Esto ocurre en muchos sectores, y en blockchain también. Que un desarrollador no haya utilizado las criptomonedas es algo que se encuentra en este mundo y que la verdad no tiene mucho sentido.

La solución para este problema es involucrarte con ellas. Comprar y vender algunas pocas monedas solo para ver el funcionamiento de las mismas. No tienes por qué gastarte una gran cantidad de dinero, solo algunos pocos dólares o euros.

Puedes comprar Bitcoin si lo deseas utilizando PayPal o hacerlo de forma anónima, pero la idea es que lo hagas ya. No es necesario que te vuelvas loco y compres un sin fin de monedas, simplemente que te familiarices con ellas y cuáles son los pasos del proceso de compra y venta, junto con el de creación de un monedero.

Tampoco es necesario que por ejemplos destines dinero para comprar un monedero hardware. Ya que el objetivo no es comprar mucho, solo un poco, y si bien es deseable por la seguridad que estos ofrecen, al final con un monedero online o software es más que suficiente.

Esto son perfectos para esta tarea, ya que no requieren de mucho trabajo para su configuración. Simplemente instalarlos o registrarnos y no mucho más. Si utilizamos el monedero de un exchange solo es necesario crearnos una cuenta.

Pero ojo, los monederos online tienen un gran problema, y es su seguridad. Las claves privadas en este caso son almacenadas en un servidor centralizado, el cual puede ser víctima de un hacker. Si piensas comprar más criptomonedas lo mejor es que pienses en otras alternativas. La idea en este objetivo es simplemente comenzar a trabajar con ellas, no invertir.

Si estás buscando invertir lo mejor es que utilices los monederos físicos, también llamados offline, para guardar tus criptos. Es importante conocer que es un monedero y las distintas opciones que existen, ya que si finalmente creas una ICO este es un detalle muy importante de su éxito.

Cada vez nos acercamos a la parte más interesante de este tutorial. Lo importante es que ahora ya poseemos una gran cantidad de conocimientos y estamos prácticamente listos para ponernos manos a la obra.

Lo aprendido en esta parte incluye:

  • Como funcionan los exchanges
  • Familiarizarnos con los monederos

#3 Comencemos a programar

Como desarrollador blockchain te encuentran ante grandes desafíos en el back-end. Crear y dar mantenimiento a una blockchain público es una tarea ardua por un número de razones.

Dificultades en el desarrollo blockchain

#1: Seguridad

Un gran desarrollador en este sector es David Schwartz, que dijo que una blockchain debe ser como una fortaleza. La primera observación que hace es que el código tiene que ser público y abierto para que todo el mundo lo mire. De esta forma nos aseguramos de que haya más ojos observando el código en busca de errores y vulnerabilidades.

Sin embargo, es importante que se remunere muy bien a estas personas, ya que de explotar estos fallos o vendérselos a otros, conseguirían grandes sumas de dinero. Debido a esto el desarrollo en esta tecnología es muy lento, y no cualquier persona debe ni puede realizarlo.

#2: Administración de recursos

Es importante en todo momento tener conciencia del avance de la red. No podemos quedarnos muy atrás en lo que respecta a desarrollo, debido a que esta puede crecer enormemente si recibe una adopción masiva en cualquier momento. Debe ser capaz la blockchain de manejar consultas locales y remotas.

#3: Rendimiento

La blockchain siempre debe rendir a la máxima capacidad posible, pero para que esto sea posible la elección del lenguaje de programación debe ser de vital importancia. Esto se debe a que hay ciertas tareas en la blockchain que pueden ser paralelizables mientras que otras no.

Un ejemplo de una tarea que puede realizarse en forma paralela es la verificación de la firma digital. Solo se requiere para la verificación de la firma la clave, la transacción y la firma en sí. Una vez que tenemos toda esta información ante nosotros podemos realizar la tarea en paralelo.

Pero no todas las tareas pueden ser efectuadas de esa forma. Las transacciones son una de ellas, ya que el orden en que se ejecutan es muy importante. Es importante este aspecto, ya que de paralelizar las transacciones podríamos incurrir en el fallo de doble gasto.

Es por esta razón que el lenguaje elegido es una tarea de sumo cuidado, algunos están pensando para facilitarnos el desarrollo de la paralelización y otros no. Hay que buscar un punto intermedio que se ajuste lo mejor posible a nuestras necesidades.

#4 Aislamiento

Para hablar de este aspecto tenemos que primero definir que es un comportamiento determinístico. Si por ejemplos decimos que A + B = C, entonces no importa cuáles son los valores de A y B, siempre su suma dará como resultado C.

Las funciones de hash son deterministas, lo que implica que si realizamos un hash de A siempre tendremos como resultado H(A).

Con respecto la blockchain, propiamente dicho, el comportamiento de las transacciones siempre debe ser determinista. Debido a que no es deseable que una transacción se comporte de una forma un día y al otro de forma distinta. Lo mismo ocurre con los contratos inteligentes, estos tiene un camino determinado de comportamiento, de lo contrario no cumplirían con su cometido.

La solución para este problema, el de tener contratos inteligentes y transacciones que se comporten de forma determinista, es la de aislar los componentes de otros no deterministas.

Para eso existen algunos lenguajes que son ideales para esta tarea, C++ y JavaScript. Así que si estás comenzando y quieres aprender lo que te recomiendo es que empieces ya a ver vídeos de YouTube y leer manuales de programación sobre ellos.

Para muchos C++ puede ser un lenguaje un tanto anticuado, pero la realidad es que cumple con todas las necesidades. De hecho Satoshi Nakamoto escribió el código fuente de Bitcoin con él. Junto con la tecnología HTML y CSS es una de las tres que ayudan a la creación de contenidos en internet. JavaScript, en cambio, está más enfocado a la creación de páginas web con un alto grado de interacción con el usuario.

Ahora pasemos a ver como crear una blockchain muy simple utilizando JavaScript. Un lugar para encontrar ejemplos y tutoriales sobre programación en blockchain es savjee.be.

Vamos a crear una pequeña criptomoneda con su blockchain que le llamaremos TutorialCoin. Y las primeras preguntas que surgen son ¿cómo creamos un bloque? y ¿de qué consisten estos?. Las respuestas son sencillas, cada bloque cuenta con la siguiente información:

  • Index: El número del bloque
  • Timestamp: La y hora de su creación
  • Data: La información dentro del bloque
  • Hash Anterior: El hash del bloque anterior
  • Hash: El código hash del bloque actual

Antes de continuar y meternos de lleno con el código, existen algunas palabras que son importante conocer si queremos comenzar a programar nuestra blockchain.

  • This: Esta palabra reservada del lenguaje de programación nos permite acceder dentro de una función a una variable del objeto al que pertenece la función.
  • Constructor: Es una función particular que ayuda a crear e inicializar un objeto de una clase.

Ahora ya estamos listos para crear un bloque. Veamos el código involucrado en esta tarea:

const SHA256 = require("crypto-js/sha256");

class Block
{

constructor(index, timestamp, data, previousHash = '')
{
this.index = index;

this.previousHash = previousHash;

this.timestamp = timestamp;

this.data = data;

this.hash = this.calculateHash();
}

calculateHash()
{

return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString();

}

}

Análisis del código

Ahora que tenemos un gran código aquí arriba seguro muchos se preguntan qué hace cada parte. Pasemos a destripar, en el buen sentido, este extracto de código.

En la primera línea vemos cómo llamamos a la librería «crypto-js», en donde encontramos la función de hash sha256 que no se encuentra disponible de forma nativa en JavaScript.

Lo siguiente que hacemos es invocar al constructor dentro de la clase para crear objetos que tendrá ciertos valores. Aunque la función más llamativa de esta clase es la de CalculateHash(), veamos qué hace exactamente.

Lo primero que hacemos es tomar todo el contenido del bloque y pasarlo por una función de hash, de esta forma obtenemos el hash en particular. Para eso utilizamos la función JSON.stringify para convertir los datos del bloque que se encuentran en una cadena de texto a hash.

Creando la blockchain

class Blockchain
{

//Creación del bloque genesis

constructor()
{

this.chain = [this.createGenesisBlock()];

}

createGenesisBlock()
{

return new Block(0, "09/06/2018", "Bloque Génesis", "0");

}

//Agregando el nuevo bloque
getLatestBlock()
{

return this.chain[this.chain.length - 1];

}

addBlock(newBlock) 
{
newBlock.previousHash = this.getLatestBlock().hash;

newBlock.hash = newBlock.calculateHash();

this.chain.push(newBlock);

}

//Validando la cadena
isChainValid()
{

for (let i = 1; i < this.chain.length; i++)
{

const currentBlock = this.chain[i];

const previousBlock = this.chain[i - 1];

if (currentBlock.hash !== currentBlock.calculateHash()) {

return false;

}

if (currentBlock.previousHash !== previousBlock.hash)
{

return false;

}

}

return true;

}

}

Bloque Génesis

El bloque génesis es el bloque más importante, es el que le da vida a la cadena de bloques. Es necesaria su creación por el simple motivo de que todos los bloques como vimos antes apuntan a su anterior, y este es el que inicia esa cadena. Claro que este bloque no apunta hacia ninguno.

Entonces, cuando se crea la cadena se invoca esta función para que genere el bloque génesis. Es necesario que este primer bloque tenga la información ingresada de forma manual:

createGenesisBlock()
{

 return new Block(0, "09/06/2018", "Bloque Génesis", "0");

}

Agregando bloques

Antes de poder agregar un nuevo bloque es necesario saber cuál fue el anterior creado, ya que como vimos antes es necesario tener el hash del bloque anterior para enlazarlo. En este caso es de utilidad la función getLatestBlock().

getLatestBlock()
{

return this.chain[this.chain.length - 1];

}

Ahora que hemos determinado el último bloque, vamos a ver cómo agregarlo.

addBlock(newBlock) {

newBlock.previousHash = this.getLatestBlock().hash;

newBlock.hash = newBlock.calculateHash();

this.chain.push(newBlock);

}

Lo que hacemos aquí es primero obtener el hash del bloque anterior. Luego calculamos el hash del bloque nuevo y se lo agregamos al objeto del bloque. Por último añadimos este nuevo bloque a la cadena.

Validamos la cadena

Ahora es necesario verificar que ningún bloque se haya perdido en nuestra cadena de bloques y que todo se encuentre estable.

Para eso utilizamos una sentencia muy común en programación llamada «for» para crear un buque que vaya desde el bloque número 1 hasta el último agregado. El bloque génesis es el número 0.

for (let i = 1; i < this.chain.length; i++)
{

const currentBlock = this.chain[i];

const previousBlock = this.chain[i - 1];
En esta parte del código verificamos que el hash del bloque actual sea correcto

y que el hash del bloque anterior también lo sea.


if (currentBlock.hash !== currentBlock.calculateHash()) {

return false;

}

if (currentBlock.previousHash !== previousBlock.hash)

{

return false;

}

}

return true;

}

En caso de que el valor del hash del bloque previo «previousHash» que posee el bloque actual no sea igual al hash del bloque previo, la función devuelve falso, caso contrario verdadero. Lo mismo si calculamos de nuevo el hash del bloque actual y no coincide con la información que posee el bloque.

Ahora ya es momento de comenzar a utilizar la blockchain. Es decir, de crear nuestra TutorialCoin.

let TutorialCoin = new Blockchain();

TutorialCoin.addBlock(new Block(1, "06/09/2018", { amount: 4 }));

TutorialCoin.addBlock(new Block(2, "06/09/2018", { amount: 8 }));

Aquí creamos la blockchain que llamamos TutorialCoin. Al hacer esto el constructor es llamado y genera el bloque génesis.

Finalmente agregamos dos nuevos bloques a la cadena. Con la fecha del dia de hoy y con la información que nos interesa, uno con una cantidad 4 y otro con 8.

En este apartado hemos visto algunos puntos muy importantes en el desarrollo de blockchain. Quizás no sea tan fácil de entender si no posees algunos conocimientos técnicos. Caso contrario seguramente haya sido muy fácil, y es que en realidad el código no presenta muchas dificultades.

Claro que esta es una versión híper simplificada de una blockchain, pero sirve como para comenzar a comprender los aspectos básicos de su programación.

Lo que debemos haber conseguido para completar este objetivo:

  • Aprender algún lenguaje de programación que nos sirva para desarrollar una blockchain. Ejemplo: C++, JavaScript, C#, etc.

#4 Aprender sobre contratos inteligentes

Como los contratos inteligentes funcionan

En esta web hemos visto los contratos inteligentes con gran detalle. Pero si no quieres profundizar en este tema, lo cual es parte esencial de este objetivo, voy a hacer un resumen.

Un contrato inteligente es un código de programación que tiene la intención de facilitar, verificar y hacer cumplir lo pactado en un contrato. Si bien no es un concepto nuevo, ya que Nick Szabo, un criptógrafo estadounidense lo propuso en 1996, este se llevó a la práctica gracias a Ethereum, que popularizó el concepto.

Veamos aquellos aspectos que nos interesan conocer del contrato inteligente.

Cualquier tipo de cosas que corra sobre la blockchain debe ser inmutable y tener la habilidad de funcionar en múltiples nodos sin comprometer la integridad del sistema. Por tanto los contratos inteligentes deben poseer tres características importantes:

  • Ser deterministas
  • Tener un fin
  • Estar aislados

Características importantes de un contrato inteligente

Deterministas

Ya vimos que un programa de ordenador es determinista si ante un conjunto de variables presenta un mismo comportamiento. El ejemplo de una suma es el más claro de ver, si se ingresan dos variables como 2 + 4 el resultado siempre debe ser 6.

Sin embargo existen distintos momentos en el que un programa puede comportarse de forma no determinista:

  • Cuando llama a una función no determinista: Cuando el programador hace una llamada a una función no determinista en el programa.
  • Recursos de datos no determinista: Si el sistema consume información en tiempo de ejecución y esta es no determinista entonces el programa se transforma en no determinista. Por ejemplo un scrapper que obtiene los 10 resultados de Google para una búsqueda en concreto, una lista que varía continuamente.
  • Llamadas dinámicas: Cuando un programa llama a un segundo programa se lo denomina llamada dinámica. Ya que el objetivo de la llamada dinámica se determina solo durante la ejecución, es de naturaleza no determinista.

Tener un fin

Existe en programación un error que se denomina «problema de detención». Este implica un estado en el cual es imposible determinar si un programa determinado puede ejecutar su función en un límite de tiempo.

Estos fue algo que dedujo Alan Turing en 1936, utilizando el Problema Diagonal de Cantor, en donde estableció que no hay manera de saber si un programa determinado puede terminar en un límite de tiempo o no.

Este es un serio problema para los contratos inteligentes porque su definición bien indica que tiene un límite de tiempo. Por tanto se han desarrollado algunas medidas para poder matar el contrato y no acabar en un bucle infinito que consuma continuamente los recursos.

  • Incompletitud de Turing: Una blockchain incompleta de Turing tendrá una funcionalidad limitada y no podrá realizar saltos y/o bucles. Por tanto no puede entrar en un ciclo infinito.
  • Medidor de pasos y comisiones: Un programa puede de forma sencilla medio el número de «pasos» que le ha tomado, por ejemplo el número de instrucciones que ha ejecutado, y luego terminar cuando ha alcanzado un determinado número. El otro método es un medidor de comisión, en el cual el contrato se ejecuta con una comisión prepagada. Cada instrucción en este caso requiere de una cierta cantidad de comisión, en caso de que se exceda el valor entonces el contrato se termina.
  • Temporizado: En esta solución se mantiene un temporizador predeterminado. Si el contrato excede este límite temporal entonces es abortado.

Aislamiento

En el caso de las cadenas de bloques que permiten contratos inteligentes, como Ethereum, cualquier persona puede subir el suyo. Esto trae aparejado cuestiones de seguridad debido a que pueden contener un virus o errores. Por tanto los contratos deben ser aislados para no poner en peligro todo el sistema.

Es un punto crítico que los contratos se mantenga aislados en una «caja de arena» para proteger el completo ecosistema de los efectos negativos que este pudiera tener.

¿Cómo ejecutan los contratos inteligentes?

Ahora que conocemos las distintas características vamos a pasar a ver como consigue distintas blockchains que se ejecuten los contratos inteligentes. Existen dos opciones muy utilizadas que son:

  • Máquinas virtuales: La solución que implementa Ethereum
  • Docker: Fabric utiliza esta

Comparemos estas dos soluciones e intentemos determinar cuál es la mejor. Para hacer sencilla esta comparación vamos a tomar la máquina virtual de Ethereum y el docker de Fabric, ya que puede haber muchas implementaciones de estas.

CaracterísticasMaquina VirtualDocker
DeterministaEl contrato no tiene funciones no deterministas y la información esta limitada solamente a la que se encuentra en la cadena. Sin embargo, ejecuta llamadas dinámicas que son por su naturaleza no deterministas. Por suerte la información a la que accede si lo es.Gracias al diseño de esta solución, el sistema es confía en los usuarios para que creen contratos que son deterministas. Esta no es la mejor de las soluciones.
Tiene finEthereum utiliza el contador de comisiones para la terminación de los contratos. Cada paso del contrato tiene un coste de gas, y una vez que se termina el presupuesto el contrato se acaba.Fabric utiliza un temporizador. Sin embargo, como cada nodo tiene su propio temporizador debido a que poseen cada uno un poder computacional distinto, existe un riesgo en el proceso de consenso.
AislamientoTiene un buen aislamiento.No posee un buen aislamiento.

En el caso que te decidas desarrollar sobre blockchain es importante que adquieras conocimientos sobre su lenguaje de programación, Solidity.

Este lenguaje es útil si queremos por ejemplo desarrollar dapps (aplicaciones descentralizadas) o entrar a la industria de las ICO. Por lo que ahora vamos a ver algunos aspectos básicos de él.

Solidity fue creado por Gavin Wood, Christian Reitwiessner, Alex Beregszaszi, Yoichi Hirai y varios colaboradores principales de Ethereum, con el objetivo de permitir la escritura de contratos inteligentes que corren sobre la plataforma de Ethereum. Aquí no importa tanto aprender como escribir los nombres de estos desarrolladores, pero si el objetivo detrás de su creación.

Solidity es un lenguaje flexible y con una sintaxis muy similar a ECMAScript (Javascript). Lo más importante es repasar algunos puntos claves del documento de Fundamentos de diseño de Ethereum.

Con solidity estamos trabajando en un modelo de pila y memoria con un tamaño de palabra de instrucciones de 32 bytes, la máquina virtual nos da acceso al programa «stack» que es como un espacio de registro donde también podemos pegar direcciones de memoria para hacer el contador de programa, una memoria temporal ampliable y un almacenamiento más permanente que está escrito en la blockchain. Por último hay que destacar que la máquina virtual requiere de un determinismo total dentro de los contratos inteligentes.

Que aprendimos en este cuarto objetivo:

  • Como funciona los contratos inteligentes
  • Aprendimos conceptos muy básicos de Solidity

#5 Actualizarse constantemente

Uno de los aspectos más importantes a la hora de construir una blockchain es estar continuamente perfeccionando tus conocimientos, aprendiendo un poco más cada día de todos los avances que surgen en este campo.

Para eso tenemos foros en Reddit, páginas Github y el archí conocido para cualquier desarrollador: StackExchange. A su vez es interesante relacionarse con otros desarrolladores para generar sinergia y aprender mutuamente.

También es importante ver cuáles son aquellas cualidades que los empleadores buscan en un desarrollador blockchain, ya sea que estés buscando trabajo o que simplemente lo hagas para crear tu propio proyecto. Las compañías buscan ciertas habilidades y conocimientos específicos que pueden ayudarte a trazar tu plan de acción.

Si logras dirigir tus esfuerzos en esa dirección te será de mucha ayuda.

Conclusión

Hemos visto una gran cantidad de información que será relevante para tu camino a convertirte en un gran desarrollador de blockchains. Está claro que no podemos ver en un solo artículo todos aquellos aspectos en detalle, por lo que obviamente este es un resumen introductorio.

Si tuviéramos que profundizar en los aspectos de programación requerimos varios artículos y sinceramente no tiene mucho sentido en este momento, más que nada por lo atemorizante que puede llegar a ser. Espero que esta guía sirva más para empujarte a trabajar por conseguir eso que anhelas y que funcione como orientación hacia una nueva tecnología que es realmente fascinante.

Acerca del autor

Criptotario

Me llamo Martin, soy ingeniero y apasionado de las inversiones y la tecnología. Me gusta mucho leer libros y todo aquello que me haga mejorar día a día.

3 Comentarios

Haz clic aquí para añadir un comentario