Este curso de Blockchain online gratis contiene varios temas, unos más técnicos y otros más generales como que es blockchain y para que sirve, o si una blockchain es fiable, o si se necesita una blockhain.
La segunda parte es un curso técnico de blockchain desde cero.
Por cierto, si quieres obtener criptomonedas gratis viendo unos pocos videos para aprender, puedes dar un vistazo a Coinbase que es además un excelente Exchange.
Indice de contenidos:
Originalmente el término blockchain proviene del inglés y significa "cadena de bloques".
El término cotidiano que he visto en algunas ocasiones, es que blockchain es como una hoja de Excel distribuida entre varios ordenadores de una red.
Es una simplificación considerable porque no comenta las principales características de blockchain:
1. La información se almacena en bloques que se encuentran encadenados de una alguna manera, que más adelante veremos.
2. Este conjunto de bloques se distribuye entre los nodos de una red (de ordenadores). Algunos nodos pueden añadir bloques nuevos.
3. No hay un servidor central, donde se encuentre centralizado este conjunto de bloques. Es descentralizado.
4. Usa la criptografía asimétrica (clave pública/privada) y de las funciones de hash para dotar de seguridad a este sistema.
5. Existen unas reglas de consenso que los nodos de la red (los participantes) aceptan y que permite gestionar quien puede crear y añadir bloques a la cadena, y quien puede dar por válidos estos bloques.
6. Los bloques una vez creados y publicados en la cadena principal no se pueden editar, la información guardada se mantiene de forma histórica durante toda la vida de la cadena siempre y cuando haya nodos (ordenadores) que vayan almacenando y compartiendo la cadena de bloques entre el resto de nodos.
Así pues a grandes rasgos las piezas fundamentales de blockchain son:
En general podemos decir que blockchain sirve para tener un registro no manipulable e histórico en el tiempo de quien tiene la propiedad de un objeto físico o digital. Este objeto puede ser incluso algo abstracto y no tangible. Con los registros que hay almacenados en la blockchain podemos ver como va pasando de manos ese objeto.
Entre los casos de uso blockchain podemos encontrar:
En el caso de la blockchain de bitcoin, ésta sirve para tener un registro de como se va transfiriendo una cantidad de bitcoin denominada satoshi. Un satoshi es la mínima unidad de bitcoin que corresponde a 10-8 bitcoin.
Para identificar al propietario de esos satoshis se utiliza criptografía de clave pública/privada de este modo no figura nuestro nombre ni nuestros datos, tanto sólo una cantidad de número y letras sin sentido alguno. Podemos decir que prácticamente es anónima, aunque realmente no lo es del todo.
Un propietario tiene un par de claves (como mínimo), una pública y una privada, las dos estan relacionadas entre sí.
En el registro de traspasos de esos "satoshis" figura la clave pública del propietario (en realidad su dirección que es una secuencia de números y letras generada a partir de la clave pública).
El propietario debe guardar en secreto la clave privada, que nos permite hacer transacciones con esos satoshis.
Sólo el que posee la clave privada puede transferir ese activo (satoshi) a otro usuario (a otra clave pública o dirección). Lo que coloquialmente significa transferir esa cantidad de bitcoin.
Con esta idea en mente, seguro que vemos los usos potenciales de blockchain.
Todos aquellos sectores o industrias que lleven un registro o un histórico de estados de un activo (físico, digital, conceptual) en su sentido más amplio y que se quiera descentralizar su gestión, para que funcione entre personas (peer to peer), organizaciones, departamentos, grupos, de tal modo que no esa información no se encuentre centralizada en un solo servidor.
Algunos ejemplos blockchain:
blockchain en el registro de la propiedad,
blockchain en las transacciones de dinero electrónico,
blockchain en el registro de incidencias,
blockchain en el registro de vehículos,
blockchain en el registro de inmuebles,
blockchain en el registro de artículos de un blog,
blockchain en el registro civil,
blockchain en el registro de artículos de lujo u obras de arte,
blockchain en el registro de la propiedad intelectual,
blockchain en el registro de piezas en una cadena de suministro,
blockchain en el registro de actos médicos,
blockchain en el registro de transferencias de criptomonedas,
blockchain en el registro de la identidad ciudadana, ...
la lista es realmente impresionante y esto son sólo algunos ejemplos.
Ya podemos entrever que habrá una blockchain con unas características diferentes para cada uso.
Pública, si cualquiera puede ver los bloques.
Privada, si el acceso a los bloques está restringido a miembros de un grupo, o de un consorcio, una organización, etc...
Permisionada o no. Con permisos de creación de bloques a sólo unos cuantos nodos o a todos...
Pues depende. No todos los protocolos blockchain son fiables al 100%.
Actualmente según alguna web que lista criptomonedas, debe haber más de 2000 proyectos blockchain.
¿Es Bitcoin fiable? Podemos afirmar con un elevado porcentaje de probabilidad que sí. Es el código más revisado de todos estos proyectos, el más capitalizado, el número de nodos de la red es enorme comparado con proyectos pequeños de blockchain y el algoritmo de consenso de la prueba de trabajo sigue siendo seguro.
A nivel de seguridad criptográfica, casi todos estos protocolos usan criptografía asimétrica y funciones de hash de 256 bits, así que el día que se "rompa" la seguridad de estos algoritmos, posiblemente la mayoría de proyectos blockchain incluido bitcoin dejen de ser seguros.
Ahora bien, si no guardas tu clave privada de modo adecuado, puedes exponer a que te roben los bitcoin que tenga esa dirección. Así que la mejor manera de estar seguro es no compartir la clave privada con nadie, y utilizar nuevas direcciones en cada transacción.
Antes de plantearse si alguien necesita blockchain, hemos de pensar si el objetivo es nuestra profesión/trabajo o una afición. A continuación muestro una recopilación de los diferentes usuarios que suelen estar interesados en blockchain:
Con un objetivo profesional:
Con un objetivo de aficionado:
En función de tus intereses te puedo recomendar un tutorial de Hyperledger si quieres usar una blockchain a nivel empresarial, o un tutorial de solidity si quieres programar contratos inteligentes, un artículo práctico de como crear un contrato inteligente con ethereum wallet, un artículo sobre la nueva blockchain de Facebook, o un tutorial como minar ethereum si te interesa la minería, o si quieres empezar a usar criptomonedas o las necesitas para hacer pruebas de tus proyectos blockchain, te recomiendo buscar "bitcoin testnet faucet" en un buscador para obtener las 3 o 4 webs que dan criptomonedas gratis sin riesgo alguno.
Después de resumir los diversos perfiles interesados en blockchain, que me he encontrado estos 2 años, podemos decir que principalmente es una tecnología tan incipiente que ha servido para hacer dinero formando a la gente en blockchain o creando ICOs para captar dinero de inversores.
Para el resto de empresas, dado que implica una fuerte inversión económica y el reciclaje de los trabajadores (su formación o nueva contratación), no parece rentable su uso, aunque habría que conocer cada caso de negocio individual.
Otro problema es la "descentralización" que conlleva blockchain, no todos los negocios pueden adecuar esa característica, pareciera que la mayoría del sistema empresarial está basado precisamente en la centralización de información y de servicios.
El primer proyecto que usó tecnología blockchain (y el que ha tenido más éxito) ha sido el Bitcoin, que cuenta ya con más de 9 años de historia.
Su producto estrella es un concepto digital denominado Bitcoin, englobado dentro de la categoría de criptomonedas.
Bitcoin es un concepto intangible, pues no existe físicamente como una moneda de metal o un billete de papel.
Existe como un apunte contable en un libro de transacciones compartido, que muestra de manera fidedigna quien posee un bitcoin (o una fracción de bitcoin) como tal.
El proyecto Cadux es un proyecto de aprendizaje online (en Python) en el que vamos a crear blockchain desde cero en formato blog o tutorial con entregas semanales.
Creo que el acceso al conocimiento blockchain gratis y a otras materias técnicas en general debe ser un derecho universal, así pues como la Wikipedia, este curso blockchain online gratis se proporciona tal cual, aunque por supuesto, puedes realizar aportaciones!
El usuario podrá encontrar algún master blockchain o curso especializado en blockchain de pago, pero no es necesario si uno no sabe como formarse en blockchain primero.
Así pues es aconsejable primero un curso de blockchain online gratis para luego ampliar los conocimientos en temas más concretos, específicos y siempre de la mano de centros reconocidos, con experiencia contrastada, de los cuales te podemos aconsejar algunos si realmente ya lo tienes muy claro (deja un comentario o un mensaje de contacto y te enviaremos esa información).
El proyecto Cadux es principalmente un curso especializado en blockchain para perfiles técnicos, es un curso de programación blockchain, que no está orientado a un perfil de negocio o de marketing, aunque puede ser útil para adquirir algunos conceptos pero sin entrar mucho en detalle. Así pues creo que los perfiles técnicos encajarán a la perfección en este curso blockchain online gratis.
Si no conoces nada de Python, puedes dar un vistazo a este tutorial interactivo de Python básico para familiarizarte y ejecutar estos ejercicios de modo interactivo.
Realmente Python no es el lenguaje más óptimo para blockchain, pero es el más indicado para el aprendizaje (y para otros sectores como IA es puntero).
Obviamente también puedes estudiar un curso blockchain en la universidad si estás estudiando o hace pocos años que acabaste la carrera. También puedes encontrar algún curso blockchain en Barcelona o en Madrid, dos ciudades de referencia para este tipo de cursos, aunque curiosamente puede ser que haya alguna charla en un pueblo perdido de España, pero reitero, la mejor oferta de formación en blockchain presencial es Madrid y Barcelona.
El proyecto Cadux consta de varias iteraciones con ejemplos de código diversos que conforman diversas piezas técnicas fundamentales de blockchain.
Encontrarás desde ejemplos de criptografía, de almacenaje de bloques en una base de datos, de redes P2P, de algún algoritmo de consenso, y de creación de una api rest.
Estos ejemplos de código Python tienen el copyright de Tutoriales Online con una licencia MIT
En esta primera iteración, se utilizan los conceptos principales:
un Bloque que contiene ciertos datos como la altura (el número del bloque), el timestamp, los datos del bloque, el hash del bloque previo y el hash del bloque actual.
una blockchain como una lista de bloques.
¿Que es el hash? Este es un concepto que hay que entender, pues es una de las claves de blockchain.
Una función de hash permite transformar un dato de entrada (como una cadena de texto) en un dato de salida de longitud fija y diferente para cada dato de entrada diferente.
Además es prácticamente imposible obtener el dato de entrada conociendo sólo el data de salida.
Y también es muy poco probable que dos datos de entrada diferentes den como resultado el mismo dato de salida.
Son funciones que "digieren" la información de entrada para sacar un dato de salida de longitud fija, habitualmente de 256 bits (32 bytes), función hash256 o de 160 bits (20 bytes) función ripemd160.
Hash256 (dato entrada) := dato salida de longitud fija 32 bytes
Ripemd160 (dato entrada) := dato salida de longitud fija 20 bytes
Como decía anteriormente para llevar a cabo ciertas acciones como la transferencia de un registro de la "propiedad" de un determinado "asset" o activo en la blockchain, se utiliza criptografía asimétrica: pares de claves públicas y privadas para firmar digitalmente las transacciones.
Las siglas ECDSA significan "Elliptic Curve Digital Signature Algorithm" y es un algoritmo de generación de claves y de firma digital utilizado frecuentemente en los protocolos blockchain.
Se utiliza habitualmente dado que las claves se generan rápido y tienen menor tamaño que otros algoritmos como el algoritmo RSA (también de criptografía asimétrica) y eso es conveniente para firmar transacciones y enviarlas por la red P2P (recuerda que se van compartiendo los bloques entre los diversos nodos), de ese modo el ecdsa históricamente se ha venido utilizando en bitcoin y en posteriores protocolos blockchain.
Como el nombre parece indicar este algoritmo ecdsa se basa en operaciones matemáticas sobre una curva elíptica. Parten de la generación de un número entero aleatorio, un número entero muy grande, que corresponde a una clave privada (que sólo debe ser conocida por la persona que lo genera), y una clave pública que se genera a partir de esa clave privada y que se comparte con el resto de usuarios de la blockchain, cuando se firman transacciones por ejemplo.
En el caso de bitcoin se utiliza la curva elíptica secp256k1.
De todos modos, habitualmente los protocolos blockchain transforman la clave pública en algo más corto que se suele llamar "address" o direcciones.
Esta transformación suele hacerse mediante la aplicación la función hash256 (varias veces) en la clave pública y mediante la aplicación de otro algoritmo como el RIPEMD-160
La transformación final (que es lo que se conoce como dirección bitcoin) usa una codificación en Base58 (que no usa la letra O, ni la I, ni el número 0) de este modo se hace más fácil la gestión de las direcciones para no confundirnos con algunas letras que son similares a los números.
En esta segunda iteración uso una librería de ecdsa para Python.
La idea del ejercicio de esta iteración 1 es generar una dirección de bitcoin (una pubkey hash que empieza por 1) a partir de la curva elíptica:
se genera una curva SECP256k1,
se generan un par de claves,
se aplican varias funciones de hash a la clave pública,
se añade la "versión" (un 00 para bitcoin),
se extrae un checksum,
se codifica en base58,
y finalmente se imprime la dirección final
El árbol de Merkle fue creado por el Sr. Merkle hace ya bastantes años (1979) y es muy curioso como se ha aplicado su diseño a la tecnología blockchain.
El árbol de Merkle se usa en bitcoin y en ethereum y muy probablemente en el resto de protocolos blockchain.
Extras: Como curiosidad, si eres programador, seguramente conoces una herramienta que también utiliza árboles de Merkle. Se trata de git. Utiliza un DAG (grafo acíclico dirigido) donde cada nodo (etiqueta, commit, ...) se etiqueta con el hash (usa SHA-1, aunque en las nuevas versiones creo que ya es SHA-256) de su contenido. Así que cada vez que usas git en local, tienes una "blockchain" (salvando las diferencias! como la prueba de trabajo, los algoritmos de consenso, las recompensas de bloques, etc...).
Para optimizar el espacio en disco y el tamaño de los paquetes de información que se comparten por la red P2P, se utilizan estructuras de datos "compactadas" para los bloques.Para simular las transacciones voy a usar cadenas de texto de Python. En realidad estas transacciones tendrán el remitente, el destinatario, la cantidad, el tipo de activo, y un "payload" de datos genéricos.
Pero para simplificarlo sólo pongo un texto.
Luego se aplica la función hash a cada transacción, y se van sumando por pares, al resultado se vuelve a aplicar la función hash hasta finalmente obtener el hash raíz.
Una característica importante del árbol de Merkle es que se puede verificar rápidamente si una transacción está en árbol.
La palabra UTXO viene del inglés (Unspent Transaction Output).
Cada UTXO es una transacción no gastada en la red de Bitcoin (y Litecoin, Bitcoin cash, NEO, ...).
Un UTXO contiene una serie de entradas (inputs) y de salidas (outputs).
De este modo, en una transacción UTXO, puede haber más de un traspaso entre direcciones. De una entrada a varias salidas, o de varias entradas a una sola salida, o de varias entradas a varias salidas.
No sería muy óptimo crear una transacción para cada satoshi (la unidad mínima de bitcoin) que se fuera a transferir, pues el número de transacciones a registrar sería enorme.
Por eso Bitcoin utiliza los UTXOs. Cuando la suma de los bitcoins de las entradas es igual a la suma de los bitcoins de las salidas, se considera un UTXO gastado.
Ejemplo:
En una transacción, Alicia que tiene 10 bitcoin, envía 5 bitcoin a Roberto. Se crea un UTXO con dos salidas, una de 5 bitcoin a Roberto y una de 5 bitcoin a otra dirección UTXO que pertenece a Alicia. Es algo así como devolver el cambio o el remanente a otra dirección.
Cada bloque de bitcoin puede contener miles de transacciones.
Inicialmente los primeros bloques que se minaron solo tenían una transacción llamada coinbase, que es la primera de cada bloque y determina que minero (que dirección) se lleva la recompensa por resolver el bloque (que inicialmente era de 50 bitcoin). Son monedas creadas nuevas.
En este caso, no hay entradas y hay una salida (la dirección del minero).
Todo este sistema de UTXOs optimiza, pero no controla que una dirección que tenga 5 bitcoin pueda realizar un doble gasto, es decir que envie 5 bitcoin a Roberto y los mismos 5 bitcoin a Alicia.
Para evitar el doble gasto Bitcoin utiliza la prueba de trabajo (PoW), que es un puzzle que hay que resolver, y que consiste en generar un hash para el bloque que empiece por un número determinado de 0000.
El minero que antes consigue encontrar ese hash, y publicar el bloque, se lleva el gato al agua y los bitcoins gratis.
Esta prueba de trabajo hace extremadamente difícil que un atacante cambie los bloques anteriores, ya que tendría que encontrar ese hash del bloque anterior, y del anterior, y del anterior,... lo que sería necesario disponer de una potencia de cálculo mayor que la mayoría de los nodos.
Si UTXO es la base de Bitcoin, la cuenta es la base de Ethereum. Podemos decir que la mayoría de protocolos blockchain usas uno, otro o los dos modelos. En el modelo de cuenta, es más simple, ya que a partir de una cuenta se obtienen las transacciones y el saldo. Es muy fácil seguir la pistas de los traspasos por tanto es difícil mantener el anonimato.
Como en muchos campos de la informática, cuando se trata de enviar datos por la red, o almacenar datos en disco, lo más óptimo es usar datos en formato binario.
Para ello, los protocolos blockchain hacen uso de mecanismos de serialización y deserialización de datos en este formato.
Como estamos usando Python para programar los ejemplos, voy a escoger el módulo "pickle" que permite serializar y deserializar estructuras de datos de Python a un formato de bytes para su posterior almacenaje o transmisión por la red.
Tiene un inconveniente, y es que si vamos a usar este formato entre varios lenguajes, no sería muy recomendable usar un formato muy ligado a Python. Por otro lado tampoco es totalmente compatible entre varias versiones de Python, así que podría haber problemillas.
Por último habría que tener cuidado de que fuente se obtiene el objeto binario, pues un actor malicioso podría esconder código dañino dentro y se activaría una vez deserializado el objeto.
Con este módulo "pickle" se puede serializar casi todo: cadenas de texto, números, listas, incluso clases. Pero no funciona muy bien con lambdas o generadores.
En este ejemplo se usa la librería pickle para serializar una clase Block que contiene ciertas propiedades y una lista de transacciones. Se muestra como serializar los datos a un fichero y como leerlo posteriormente.
Los protocolos blockchain tienen un módulo especialmente diseñado para la comunicación REST / JSON RPC que permite comunicar por la red a las wallets (o clientes) y a los nodos.
En el caso de Python podemos encontrar varios frameworks que incorporan un servidor json rpc como por ejemplo Django, Flask o aiohttp.
Voy a usar Flask con jsronrpcserver en el ejemplo para el servidor API REST / JSON RPC y 'curl' para hacer de cliente (lo que sería una wallet).
Lo más típico es crear el Hola mundo con el 'ping' y el 'pong'. Yo invoco al método 'ping' y el servidor me responde con un 'pong'.
De hecho todo esto viene de bitcoin que fue la primera blockchain que utilizó métodos RPC del estilo 'getbalance', 'getblockchaininfo', etc... que son varios métodos remotos (RPC) para dotar de diversas funcionalidades como por ejemplo la gestión de wallets, el estado de la blockchain, la gestión de las transacciones, la red...
En el ejemplo de esta iteración voy a simular un método de tipo API REST como 'getblock/{height}' que devolvería los datos de un bloque y un método de tipo JSON RPC como 'getbalance' que devolvería el saldo de la wallet asociada al nodo.
Obviamente estos métodos son de cartón piedra de momento.
Para realizar la prueba es necesario levantar el servidor rest/jsonrpc (Flask), y usar curl con el comando para invocar al método 'getbalance':
curl --data-binary '{"jsonrpc":"2.0","id":"curltext","method":"getbalance","params":[]}' -H 'content-type:text/plain;' http://127.0.0.1:5000
El comando para invocar al api rest 'getblock' sería:
curl http://127.0.0.1:5000/block/3
Cada protocolo blockchain implementa ciertos algoritmos o mecanismos de consenso para funcionar.
¿Para que sirven los mecanismos de consenso? Para estipular que nodos son elegidos para crear, validar y retransmitir un bloque al resto de nodos.
Los algoritmos de consenso como el de bitcoin son tolerantes a fallos bizantinos (BFT) esto es que operan bajo la suposición que una cantidad pequeña de nodos pueden actuar de manera "deshonesta" o "maliciosa".
Este fue el primer protocolo de consenso que se utilizó en una blockchain, en concreto en bitcoin.
Ethereum adoptó un protocolo de trabajo también, y algunas criptomonedas copiadas de bitcoin como litecoin, o bitcoin cash también.
Una prueba de trabajo se apoya en una función de hash como puede ser sha256 o scrypt.
¿Como funciona la prueba de trabajo?
Los mineros compiten entre ellos para ver quien resuelve antes un puzzle matemático, que habitualmente consiste en encontrar un hash del bloque que empieza por un número concreto de 0000.
Para hacer esto los mineros van incrementando un número (nonce) que sumado a los datos del bloque dan un hash del bloque que empieza por 0000.
El minero que resuelve el puzzle gana una recompensa en forma de bitcoins.
Fue la segunda generación de algoritmos de consenso, que se utilizó por ejemplo en Bitshares. Este protocolo no hace uso de un puzzle, sino que da importancia a los nodos que "acumulan" un saldo (elevado) de tokens. Estos nodos pueden optar a "minar" nuevas criptomonedas y a recibir las recompensas.
Estos dos mecanismos de consenso son los más utilizados actualmente, aunque hay versiones de algunos de ellos, en concreto la prueba de participación delegada, que centraliza el "poder" de minar tokens todavía más, ya que permite que la mayoria de nodos "voten" a unos cuantos nodos "elegidos" (cuyo número no es muy elevado) para que se encarguen de crear, validar y retransmitir los bloques.
Reflexiones: crees que estos mecanismos de consenso son democráticos o por el contrario sólo los que poseen dinero pueden actuar de "productores de bloques"?
Nuevas entregas cada semana...