Armando una Blockchain (16)

Published on Author lopez

Anterior Post

En estos meses he estado bastante ocupado trabajando en el proyecto RSK. Es hora de volver a escribir sobre mis proyectos personales de blockchain:

https://github.com/ajlopez/BlockchainSharp
https://github.com/ajlopez/SimpleBlockchain
https://github.com/ajlopez/RskSharp

En estos días, el más activo es el de C#, y agregué otro en Java:

https://github.com/ajlopez/BlockchainJ

La experiencia que gané escribiendo estos códigos (usando TDD como es habitual) me ha dada una clara idea de qué elementos componen una blockchain, de cuales son las partes necesarias y sus relaciones. Al escribir mis propias implementaciones, gano en entendimiento del problema y de las posibles soluciones. Y ahora que el proyecto RSK (con implementación de código abierto en Java) es público, tengo más libertad para relacionar estos intentos míos con un proyecto de implementación completa.

Las principales partes son:

  • Entidades
  • Estados
  • Máquina virtual para ejecutar contratos inteligentes
  • Encodear/Decodear
  • Algoritmo de consenso
  • Lógica de validación
  • Comunicación entre nodos
  • Exponer el nodo a aplicaciones externas

Las entidades base son:

  • Bloque
  • Transacción
  • Cuenta

Tengo cuenta con estado porque mis proyectos se orientan a una implementación tipo Ethereum, donde no hay UTXOs como en Bitcoin. Los estados a mantener sonThe states to be kept are:

  • La Blockchain
  • Estado de cuentas
  • Estado de contratos

Mis proyectos están orientados a ejecutar contratos como en Ethereum. Una razón para tener una máquina virtual es ser agnóstico del lenguaje de programación de implementación. Pienso que teniendo una manera de ejecutar contratos inteligentes que sea independiente del lenguaje de programación anfitrión de cada proyectos, es una característica interesante que permite reimplementar la misma blockchain en otras tecnologías. Entonces, para ejecutar contratos, tengo que definir:

  • Los opcodes de la máquina virtual
  • Almacenamiento temporar en memoria
  • Almacenamiento persistente

Necesito encodeadores de bloques, transacciones y estados de cuenta. Las entidades encodeadas a bytes son usadas en la comunicación por red, en el almacenamiento local, y algo no menos importante, en el cálculo de hash. De ahí que el pasar de una entidad a bytes y de bytes a una entidad debe estar bien definido y no depender de la tecnología. Por ejemplo, nunca usaria serialización Java o .NET para eso..

La comunicación entre nodos incluye:

  • Definición de los mensajes del protocolo
  • Protocolo a seguir en el orden y aparición de los mensajes
  • Un protocolo de descubrimiento de nodos en la red a los que conectarse

La lógica de validación refiere a:

  • Validación de las transacciones, y su firma
  • Validación de los bloques

La lógica de consenso debe abarcar:

  • Una forma de seleccionar al próximo bloque a agregar a la blockchain
  • La ejecución de las transacciones con el actualizado de los estados de cuentas y contratos

La exposición del nodo a otras aplicaciones es implementado en Bitcoin y en Ethereumusando JSON RPC (Remote Procedure Call), usualmente expuesto usando http. De esta forma, el nodo puede ser accedido por otras aplicaciones implementadas en otras tecnologías. El ecosistema de JavaScript es el más popular en uso para este tipo de aplicaciones.

Siguiendo las ideas de Ethereum, he tenido oportunidad de implementar un trie, varias veces, en distintos lenguajes. Pienso que las implementaciones que conseguí son simples y efectivas, habiendo seguido TDD en cada paso. Es uno de los temas a los que quiero volver en los próximos posts.

Nos leemos!

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