Armando una Blockchain (1)

Published on Author lopezLeave a comment

Siguiente Post

El mes pasado, febrero 2016, comencé a trabajar en el equipo de desarrollo de Rootstock, en un proyecto muy interesante que tiene “smart contracts” en una “blockchain” distribuida. En las semanas que pasaron, estudié las ideas e implementaciones de  Bitcoin, Ethereum, y criptomonedas. Estuve leyendo varios “papers”, libros, artículos y código. Mis enlaces:

http://delicious.com/ajlopez/bitcoin
http://delicious.com/ajlopez/ethereum
http://delicious.com/ajlopez/blockchain

Quisiera describir los elementos esenciales de una blockchain distribuida, y su importancia. Espero ir escribiendo código implementando estas ideas, de una manera simple, para captar el núcleo de estas implementaciones.

Una blockchain es una lista de bloques, comenzando por el primero, llamado bloque génesis:

Cada bloque tiene información. En las implementaciones de criptomonedas, se suele llamar a esa información, transacciones:

Una transacción describe, en esos dominios, una transferenca de criptomoneda, llámese bitcoin, ether o como quieran. Pero la esencia de la transacción es información que describe el cambio del estado del mundo. Por ejemplo, en Ethereum, el estado del mundo incluye el saldo actual de cada cuenta en el sistema. Una transferencia altera ese estado.

Hay un estado inicial luego de la aparición del bloque génesis, y luego, cada bloque, conteniendo cero o más transacciones, va alterando ese estado (usualmente un bloque también tiene una transacción de finalización del bloque, implícita):

Las transacciones deben ser válidas: no se permiten transacciones que transformen el estado del mundo de forma incorrecta. Un ejemplo de transacción inválida: aquella que saca fondos de una cuenta inexistente, o de una cuenta que no tiene el suficiente saldo.

El sistema no se ejecuta en un solo servidor, sino en una red de máquinas independientes, llamadas nodos, que corren lo que se llama el software cliente (este denominación, “cliente”, para mí es algo confusa, porque parece como que hay software servidor; pero no, los nodos son clientes de otros nodos).

Los nodos están conectados con algunos de los otros, no necesariamente con todos. Una red puede estar compuesta por cientos o miles de nodos conectados de esta manera.

Cuando una nueva transacción es ingresada al sistema (generalmente por la operación de algún usuario que quiere hacer un pago), esa transferencia es inyectada a un nodo, y éste se encarga de transmitirla a los demás nodos de la red, en principio a sus vecinos, pero éstos a su vez se encargarn de retransmitir la nueva transacción:

Algunos nodos especializados, teniendo todos los recursos para validad y ejecutar transacciones, agrupan a éstas en un bloque, que puede contener cero o más transacciones. En sistemas como Bitcoin hay incentivos económicos para que estos nodos generen nuevos bloques. Estos nodos especializados se llaman mineros. Y en Bitcoin y otros sistemas, ganan criptomoneda por minar nuevos bloques y por “fees” de las transacciones que colocan en un bloque.

Cuando un minero, digamos N2, produce un nuevo bloque, lo envía a sus nodos vecino, y eventualmente el bloque se reparte entre todos los nodos de la red:

Muchos nodos mantienen la blockchain completa, y al recibir un nuevo bloque, lo agregan a esa blockchain, siempre y cuando el bloque sea válido, y tenga un número inmediato al mejor bloque de la blockchain actual. A veces, a un nodo llegan varios bloques diferentes que compiten por agregarse a la blockchain:

Y hasta puede suceder que otra parte de la red tenga una blockchain diferente de la que tengan otros nodos:

En estos cosos, hay un algoritmo para alcanzar el consenso. Cuando el consenso se alcanza, la blockchain termina siendo la misma, y distribuida como copias en los nodos que alcanzaron el consenso. Eso es lo que hace que la blockchain se mantenga consistente y distribuida.

Hay varios detalles para discutir:

– ¿Cuándo un bloque es válido?
– ¿Cuándo una transacción es válida?
– ¿Cómo generar una transacción? Por ejemplo, en sistemas como Bitcoin, no cualquiera puede transferir fondos, sólos los dueños de las cuentas de donde salen los fondos. Hay que asegurarse que no cualquiera pueda transferir valores
– En caso de bloques y cadenas competidoras ¿cómo conseguir el consenso distribuido?
– ¿Cómo almacenar la blockchain en cada nodo?
– ¿Cómo almacenar el estado luego de la ejecución de las transacciones?
– ¿Cómo se descubren los nodos entre sí? ¿Cómo se transmite la información?

Quiero agregar código de ejemplo, con lo mínimo y esencial. Estoy escribiendo una librería en C#, usando  TDD (Test-Driven Development):

https://github.com/ajlopez/BlockchainSharp

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *