Guia para construir una blockchain. Parte 1

En este post y los siguientes, examinaremos los componentes que son necesarios para crear aplicaciones blockchain. Veremos como funcionan componentes como blockchains, Arboles de Merkle, redes peer-to-peer, transacciones, minería, etc. A medida que avanzamos, estaremos construyendo una criptomoneda llamada BlanCoin desde cero en Python. Los post que siguen estarán emparejados.

Entendiendo blockchain

Una cadena de bloques es una colección de bloques de datos ordenada, inmutable y a prueba de manipulaciones donde cada bloque, excepto el primero, está relacionado con su bloque predecesor usando técnicas criptográficas
Observe la Figura de abajo:

Una blockchain

Cada bloque contiene datos específicos dentro de la blockchain. Además, cada bloque es inmutable una vez creado. Cada bloque es también a prueba de manipulaciones; sus datos no pueden ser cambiados por un intruso malintencionado. Aparte del primer bloque, cada bloque se relaciona con su bloque anterior a través de una relación criptográfica. Los bloques están ordenados, lo que significa que se suceden en un orden lineal fijo. Esta colección ordenada e inmutable de bloques con relaciones criptográficas se denomina blockchain.
A medida que se crean más bloques, se agregan al encabezado (lado derecho) de la blockchain. En una aplicación de blockchain canónica, la cadena de bloques sigue aumentando de tamaño a medida que se agregan más bloques en el lado derecho. Por ejemplo, la blockchain de Bitcoin tiene más de 250 GB y creciendo.
Las aplicaciones canónicas de blockchain mantienen una blockchain distribuida. Esto significa que hay entidades en Internet que tienen una copia del blockchain. Estas
las copias no necesitan ser idénticas entre sí, en cuyo caso es responsabilidad de
cada entidad sincronizar su copia de la blockchain. Esta sincronización requiere un mecanismo de consenso distribuido que resuelve las diferencias entre estas copias.
Tenga en cuenta que esta sincronización no requiere ninguna entidad centralizada.
Los algoritmos de consenso son una parte muy importante de las aplicaciones blockchain. Examinaremos el consenso distribuido de cerca en posts posteriores. Dado que la blockchain es de caracter distribuida, una blockchain a veces se describe como un libro mayor distribuido. El consenso distribuido tiene implicaciones importantes. No hay necesidad de una autoridad central para mantener la integridad de la blockchain. Esto significa que una blockchain y abierto al mundo en general. El consenso distribuido resuelve uno de los principales obstáculos en la creación de una moneda distribuida, el problema del doble gasto. Este problema se refiere a un escenario en el que una persona que posee un determinada cantidad de una criptomoneda intenta gastarla dos veces. En los sistemas centralizados de dinero fiduciario, es trivial evitar el doble gasto ya que los billetes o monedas son un elemento físico y no puede estar en dos lugares diferentes a la vez evitando el doble gasto. Sin embargo, es un obstáculo importante cuando estamos creando una criptomoneda distribuida. Este concepto se volverá más claro cuando
entremos en la mecánica de la creación de nuestra criptomoneda, Blancoin.
En Bitcoin, el tiempo no es un factor importante. Las transacciones no están ordenadas por tiempo y no hay un cronometro central para sincronizar los tiempos de las transacciones. Las transacciones pueden ocurrir en cualquier orden, y el algoritmo de consenso distribuido resolverá todo. Esto es una idea poderosa. Por el contrario, en un sistema bancario de dinero fiduciario, el tiempo es muy importante y la validez de la transacción generalmente está ligada a qué transacción ocurrió primero.
Las blockchains generalmente están destinadas a sobrevivir con el tiempo, por lo que generalmente se almacenan en un disco duro o algún otro medio. Por último, en una aplicación típica de blockchain, Cualquiera puede examinar la blockchain, pero esto no tiene por qué ser necesariamente así.

el bloque genesis

El primer bloque de una blockchain se llama bloque génesis. Normalmente es iniciada por la aplicación para comenzar la blockchain. Por ejemplo, en una criptomoneda el bloque de génesis incluirá típicamente una distribución inicial con la que el creador de la misma pueda iniciar alguna transaccion.

la base de datos de blockchain

Puedes estar inclinado a concluir que una cadena de bloques debe implementarse utilizando un base de datos como PostgreSQL, Cassandra o Redis. Esta no es la mejor idea. Una blockchain es una aplicación que debe mantener su implementación en el nivel más simple y transparente. Eso es posible, especialmente porque las aplicaciones de criptomonedas involucran dinero. Su implementacion en una base de datos introduce demasiada complejidad. ¿Qué hacemos si la base de datos está dañada o la base de datos falla?
Los bloques en una blockchain se almacenan como un texto simple o como archivos binarios. El sistema operativo subyacente se utiliza para escribir bloques en
disco. Un bloque es un archivo de una sola escritura y de multiples lecturas.
Esto no significa que una aplicación blockchain no utilice bases de datos Por ejemplo, Bitcoin usa bases de datos de LevelDB para indexar los bloques y ahorrar memoria RAM. En una aplicación de blockchain, estas bases de datos siempre juegan un papel auxiliar al
blockchain, y los datos siempre se deben construir desde cero para ser agregadas.

punteros hash

Ahora examinaremos cómo se asocian los bloques en una blockchain a través de
relaciones criptográficas. Cada bloque de una blockchain, además del bloque génesis, se asemeja a esto:

Bloque en una blockchain

Un bloque consta de algunos datos específicos de la aplicación y una estructura llamada puntero hash. Se puede visualizar un puntero hash como se muestra aqui:

Estructura de un puntero Hash

Un puntero hash es una estructura de datos que

  • Señala la ubicación del bloque anterior
  • Contiene el hash del mensaje de los datos del bloque anterior

El puntero a la ubicación del bloque anterior es la dirección del bloque anterior.
en una lista. El puntero depende de cómo se representen los bloques. Ya que el bloque génesis no tiene un bloque anterior, simplemente establecemos su puntero hash en null.

Para el cálculo del hash del mensaje, podemos usar SHA-256. Por lo tanto, dado un puntero hash, podemos recuperar los datos y el hash del mensaje del
bloque anterior. Esto nos permite verificar que los datos del bloque anterior no hayan sido manipulados.
Ahora podemos representar una cadena de bloques con punteros hash como se muestra en la imagen:

Estructura de una blockchain

inmutabilidad de la blockchain

Es bastante fácil detectar si una cadena de bloques ha sido manipulada. Considere la blockchain representada arriba. Suponga además que el puntero hash para cada bloque (excepto para el bloque génesis) incluye el resumen del mensaje SHA-256 de los datos del bloque anterior y puntero hash.
Suponga que una parte malintencionada cambia los datos o el puntero hash en el segundo
bloque. Una entidad que verifica que la blockchain no ha sido alterada calculará
el hash del mensaje SHA-256 del segundo bloque. Luego comparará este valor con el
hash del mensaje SHA-256 contenido en el puntero hash del tercer bloque. Dado que estos
dos resúmenes no coinciden, la entidad concluirá que el segundo bloque ha sido
alterado o el hash del mensaje en el tercer bloque ha sido alterado.
Dado que la parte malintencionada ha manipulado el segundo bloque, también tendrá
para cambiar el hash criptográfico en el tercer bloque para que coincida con el calculado
hash del segundo bloque. Pero entonces el hash criptográfico en el cuarto bloque no
coincidirá con el hash calculado para el tercer bloque. Este cambio de puntero hash hace que los punteros hash de los bloques posteriores no coincidan. Además, dado que una blockchain es una estructura de datos distribuida, los bloques modificados
deben transmitirse a todos los demás nodos de la red blockchain para que
puedan modificar sus copias de la blockchain. Estos nodos detectarán la manipulación y
se negarán a cambiar sus copias.

creando una simple blockchain

Construyamos una cadena de bloques muy simple en Python. Nuestro blockchain será una estructura de lista:

blockchain = []


Estableceremos que los datos de cada bloque sean el siguiente número en la secuencia de Fibonacci (0, 1, 1, 2, 3, 5, 8, 13, 21…). Para cada bloque excepto el bloque génesis, los datos y el puntero hash se representará como el siguiente elemento del diccionario :

{
 'ptr': índice del elemento de lista anterior
 'hash': hash SHA-256 del bloque anterior como una cadena hexadecimal
 'datos': número de Fibonacci
}

El hash del mensaje SHA-256 de un bloque se calculará convirtiendo la lista
valor del elemento a una cadena JSON y luego calcular el valor hexadecimal del resumen del mensaje SHA256 de esta cadena.
Dada la especificación anterior, el bloque de génesis es

blockchain[0] = {
'ptr': None
'hash': None
'datos': 0
}


El segundo bloque de esta cadena de bloques es

blockchain[1] = {
'ptr': 0
'hash': una cadena hexadecimal
'datos': 1
}


Etcétera.
Una observación que debe hacerse es que dado que esta blockchain es una lista, el puntero al bloque anterior se puede representar simplemente como el índice del elemento de la lista anterior.

el universo blockchain

Hasta ahora, hemos rasgado la superficie en la teoría de las cadenas de bloques; es hora de mirar algunas de las aplicaciones de blockchains. Como principio general, podemos afirmar que cualquier aplicación que requiere consenso distribuido para la toma de decisiones es potencialmente un candidato adecuado para la implementación de una blockchain.
El primer uso de una blockchain fue en la criptomoneda Bitcoin. Las criptomonedas todavía constituyen un dominio de aplicación importante para las blockchain. Otro dominio importante son las criptomonedas de contrato inteligente, como Ethereum. Estas criptomonedas permiten la especificación de contratos que especifican bajo qué condiciones el valor se transferirá. Estos contratos se concretan mediante un lenguaje de programación que interpreta una máquina virtual blockchain.
Proyectos como Ripple se preocupan por automatizar partes de la industria de servicios financieros con el objetivo de reducir los costos de las transacciones y el tiempo requerido para su realización. En este post analizamos el navegador Brave que propone un modelo radical para la distribución de publicidad digital. El proyecto Brave mejora la privacidad en Internet y también premia a todas las partes interesadas en la distribución de publicidad digital: los creadores de contenido, las personas que ven este contenido y el navegador que aloja el contenido. Todos estos intereses ​​son recompensados ​​con unidades de la criptomoneda BAT.

Otro dominio de aplicaciones son los juegos y el contenido digital. TRON es un ejemplo de
tal proyecto. TRON está diseñado para democratizar la distribución de dicho contenido mediante la eliminación de los intermediarios centralizados que alojan este contenido. El proyecto TRON usa el protocolo BitTorrent para distribuir y recuperar dicho contenido Otros dominios de aplicación para la tecnología blockchain incluyen las cadenas de suministro, las cadenas de gestión, sistemas de votación a prueba de manipulaciones, sistemas de identificación distribuida y sin permiso, sistemas de custodia. Y por supuesto, existen muchos más dominios de aplicación potenciales para este
tecnología

referencias

Antonopoulos, Andreas. Mastering Bitcoin, 2nd ed., O’Reilly Media Inc., 2017


Iyer, Kedar and Dannen, Kris. Building Games with Ethereum Smart Contracts,
Apress, 2018

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s