SISTEMAS

¿Cómo crear una cadena de bloques con Python?

¿Sabías que Bitcoin se basa en la cadena de bloques? Hoy construiremos una cadena de bloques en Python desde cero.

¿Qué es la cadena de bloques?

Año 2008 papel bitcoin Publicado por un individuo o grupo desconocido llamado Satoshi Nakamoto. Bitcoin surgió como una versión peer-to-peer de dinero electrónico, lo que permite realizar transacciones sin pasar por una autoridad central (un banco). Sin el conocimiento de la mayoría, en el mismo documento, Satoshi Nakamoto definió una forma distribuida de almacenar información, ahora llamada blockchain.

tecnología de cadena de bloques

En pocas palabras, una cadena de bloques es un libro de contabilidad digital compartido e inmutable que almacena transacciones en una red descentralizada de computadoras.

Podemos dividir blockchain en dos términos simples:

  • Bloques: El espacio donde almacenamos las transacciones
  • cadena: un conjunto de registros enlazados

Esto define una cadena de bloques como una cadena de bloques vinculados, donde cada bloque almacena transacciones realizadas con parámetros específicos.

Cada bloque se construye sobre otro, creando una cadena de bloques irreversible. En otras palabras, cada bloque depende del otro. Esto se convierte en un sistema robusto e inmutable donde cualquier persona con los permisos correctos puede auditar la integridad.

Blockchain presenta un conjunto interesante de características:

  • invariancia histórica
  • persistencia de la información
  • No hay ningún error en el almacenamiento de los datos.

Actualmente, muchos sistemas dependen de blockchain, como las criptomonedas, las transferencias de activos (NFT) y posiblemente la votación en un futuro próximo.

Vale la pena mencionar que una cadena de bloques de Python no tiene que ser un programa complejo con miles de líneas de código. En su núcleo es una lista de transacciones interconectadas.

Por supuesto, esta es una breve explicación, pero si desea la guía completa, hemos creado un tutorial completo de blockchain para principiantes. Asegúrese de comprobarlo.

Sin más preámbulos, construyamos una cadena de bloques simple en Python.

Construyendo una cadena de bloques con Python

Antes de comenzar, definamos lo que haremos en este tutorial:

  • Construyendo un sistema blockchain simple escrito en Python
  • Usa nuestra blockchain con transacciones preestablecidas representadas como cadenas
  • Prueba la inmutabilidad de nuestra cadena de bloques

No usaremos JSON, sino listas de Python. Esto nos permitirá simplificar el proceso y enfocarnos en aplicar los conceptos clave de blockchain.

Tienes que seguir este tutorial:

Crear clase de bloque

Abre tu editor de código favorito y crea un archivo principal documento. Este será el archivo que usaremos.

Ahora, importa biblioteca hash, un módulo que nos permite crear mensajes encriptados unidireccionales. Las técnicas criptográficas como el hashing permiten que las cadenas de bloques creen transacciones seguras.

Una función hash es un algoritmo que toma algunos datos (generalmente una cadena codificada) y devuelve un identificador único, a menudo llamado «resumen» o «firma». La última parte es crucial. Para una función hash, ligeras diferencias en la entrada producen un identificador completamente diferente al de la salida. Veremos esto más tarde.

Ahora, solo importe el módulo integrado hashlib:

# main.py file
"""
A simple Blockchain in Python
"""

import hashlib

Este módulo contiene la mayoría de los algoritmos hash que necesita.Recuerda que usaremos hashlib.sha256() Características.

Ahora, vayamos a GeekCoinBlock, el nombre de nuestra cadena de bloques completamente original.

class GeekCoinBlock:
    
    def __init__(self, previous_block_hash, transaction_list):

        self.previous_block_hash = previous_block_hash
        self.transaction_list = transaction_list

        self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}"
        self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

Sé que esto puede conducir a un fragmento de código torpe. Analicemos cada parte en la siguiente sección.

Descripción del bloque GeekCoin

Primero, creamos un archivo llamado Bloque de monedas geekun envoltorio para un objeto con ciertas características (propiedades) y comportamientos (métodos).

Entonces definimos __dentro__ (también llamado constructor), que se llama cada vez que se crea un objeto GeekCoinBlock.

Este método tiene tres parámetros:

  • Propio (instancia de cada objeto)
  • anterior_bloque_hash (referencia al bloque anterior)
  • lista de transacciones (una lista de transacciones realizadas en el bloque actual).

Almacenamos el hash anterior y la lista de transacciones y creamos una variable de instancia bloquear datos como una cadena. Esto no sucede en las criptomonedas reales, almacenamos este tipo de datos como otro hash, pero para simplificar almacenamos cada bloque de datos como una cadena.

Finalmente, creamos hash de bloque, otros bloques lo usarán para continuar la cadena.Aquí es donde hashlib resulta útil; en lugar de crear funciones hash personalizadas, podemos usar funciones preconstruidas sha256 Hacer bloques inmutables.

Esta función recibe una cadena codificada (o bytes) como parámetro.Esta es la razón por la que usamos block_data.encode() método.Después de eso, llamamos resumen hexadecimal() Devuelve datos codificados en formato hexadecimal.

Sé que todo esto puede ser abrumador, así que usemos hashlib en el shell de Python.

In [1]: import hashlib

In [2]: message = "Python is great"

In [3]: h1 = hashlib.sha256(message.encode())

In [4]: h1
Out[4]: 

In [5]: h1.hexdigest()
Out[5]: 'a40cf9cca ... 42ab97'

In [6]: h2 = hashlib.sha256(b"Python is not great")

In [7]: h2
Out[7]: 

In [8]: h2.hexdigest()
Out[8]: 'fefe510a6a ... 97e010c0ea34'

Como puede ver, un pequeño cambio en la entrada como «Python es genial» a «Python no es tan bueno» produce hashes completamente diferentes. Esto tiene que ver con la integridad de la cadena de bloques. Si introduce algunos pequeños cambios en la cadena de bloques, su valor hash cambiará drásticamente. Es por eso que la frase «no puedes romper la cadena de bloques» es cierta.

Usa nuestra clase de bloque

Construiremos una clase de cadena de bloques completa más adelante, pero por ahora, usemos nuestra clase Block para crear una cadena de bloques.

En el mismo archivo, cree varias transacciones que consistan en cadenas simples almacenadas en variables, por ejemplo:

class GeekCoinBlock:
    ...

t1 = "Noah sends 5 GC to Mark"
t2 = "Mark sends 2.3 GC to James"
t3 = "James sends 4.2 GC to Alisson"
t4 = "Alisson sends 1.1 GC to Noah"

Por supuesto, GC se refiere a GeekCoin

Ahora, use la clase GeekCoinBlock para construir el primer bloque de nuestra cadena de bloques e imprimir sus propiedades.considerando hash anterior El argumento del bloque de génesis (el primer bloque antes de otros bloques) siempre será una cadena arbitraria o hash, en este caso «primer bloque».

block1 = GeekCoinBlock('firstblock', [t1, t2])

print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_hash}")

Luego, hacemos lo mismo con el segundo bloque, pero hacemos hash del primer bloque como hash anterior debate.

block2 = GeekCoinBlock(block1.block_hash, [t3, t4])

print(f"Block 2 data: {block2.block_data}")
print(f"Block 2 hash: {block2.block_hash}")

Ejecutemos y analicemos el resultado que obtenemos de este código. Escriba en la terminal de nuevo:

❯ python main.py
Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock
Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

Actualmente, solo puede ver texto y algunos hashes de 64 caracteres, pero esto prácticamente restaura la mecánica de la cadena de bloques.

Comienza con un bloque de génesis, que es la base de todos los demás bloques.

Cualquiera puede verificar la integridad de la cadena, razón por la cual blockchain es un sistema tan seguro. Por ejemplo, si modificamos ligeramente el contenido de la transacción, digamos:

t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James" 

Vemos un gran cambio en el hash del bloque.

Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock
Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

Puedes ver los proyectos actuales aquí repositorio GitHub.

codificando la cadena de bloques

No es tan inteligente basar la integridad de nuestro sistema en variables codificadas a mano, por lo que necesitamos otro enfoque.

Tenemos bloques. Es hora de construir una clase que los agregue a la cadena de bloques.

Comencemos eliminando la transacción anterior y bloqueemos los objetos y usemos el código a continuación.

# main.py

class Blockchain:
    def __init__(self):
        self.chain = []
        self.generate_genesis_block()

    def generate_genesis_block(self):
        self.chain.append(GeekCoinBlock("0", ['Genesis Block']))
    
    def create_block_from_transaction(self, transaction_list):
        previous_block_hash = self.last_block.block_hash
        self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list))

    def display_chain(self):
        for i in range(len(self.chain)):
            print(f"Data {i + 1}: {self.chain[i].block_data}")
            print(f"Hash {i + 1}: {self.chain[i].block_hash}\n")

    @property
    def last_block(self):
        return self.chain[-1]

Esta es otra gran pieza de código. Desglosemos cada parte:

  • auto-encadenamiento — Registre una lista de todos los bloques. Podemos acceder a cada bloque por el índice de la lista.
  • generar_genesis_bloque — Añadir la génesis o primer bloque a la cadena. El hash anterior del bloque es «0», y la lista de transacciones es el «bloque de génesis».
  • create_block_from_transaction — Esto nos permite agregar bloques a la cadena solo a través de la lista de transacciones.Sería molesto crear manualmente un bloque cada vez que queramos registrar una transacción
  • cadena de visualización — Imprime la cadena de bloques usando un bucle for
  • último bloque — un atributo que nos permite acceder al último elemento de la cadena.estamos en create_block_from_transaction método.

Probemos esta cadena de bloques.

# main.py

import hashlib

class GeekCoinBlock:
    ...


class Blockchain:
    ...

t1 = "George sends 3.1 GC to Joe"
t2 = "Joe sends 2.5 GC to Adam"
t3 = "Adam sends 1.2 GC to Bob"
t4 = "Bob sends 0.5 GC to Charlie"
t5 = "Charlie sends 0.2 GC to David"
t6 = "David sends 0.1 GC to Eric"

myblockchain = Blockchain()

myblockchain.create_block_from_transaction([t1, t2])
myblockchain.create_block_from_transaction([t3, t4])
myblockchain.create_block_from_transaction([t5, t6])

myblockchain.display_chain()

Ahora, corre archivo principal documento.

Data 1: Genesis Block - 0
Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e

Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e
Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5

Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5
Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589

Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589
Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

¡Felicidades! 🙌 Acabas de crear una cadena de bloques de Python simple desde cero.

Ahora puede mejorar la inmutabilidad de la cadena de bloques mediante el uso de captadores y definidores, e implementar otras funciones como prueba de trabajo, minería o cualquiera de los otros conceptos que explicamos en nuestro artículo básico de minería de Bitcoin.

en conclusión

Blockchain es la tecnología detrás de Bitcoin, Ethereum y cualquier otra criptomoneda.En este artículo, aprendió a usar Python para crear una cadena de bloques usando algoritmos hash como sha256clases y objetos.

Su desafío es crear un sistema de minería, ¿por qué no implementarlo a través de una API REST utilizando un marco como Django o Flask?

Muchas personas han hecho su fortuna con las criptomonedas. Imagina lo que podrías hacer si crearas uno tú mismo. 🤑

¡Sigue codificando! 👨‍💻

Artículo Recomendado:  Las 10 GPU Nvidia más importantes de todos los tiempos

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *