Crear un blockchain con Python: Snakecoin

in #spanish6 years ago

Crearemos una criptodivisa desde cero, incluyendo su blockchain con la intención de tener mejor entendimiento de lo que es un blockchain y como funciona. En su forma mas básica un blockchain o cadena de bloques es eso mismo, una cadena o secuencia de algo que consideramos como un bloque. Ahora un bloque pudo haber sido un paquete, un segmento, un elemento una sección, etc.

Una vez que entendemos esto veamos como las características de un bloque. El bloque debe tener datos estos datos en el caso de criptodivisas son las transacciones que se realizan en ese periodo de generación del bloque. Sin embargo esto es solo datos, para las criptodivisas pueden ser transacciones, si fuera un chat serian entradas o publicaciones, y cuando hablamos de blockchains especificos lo que ingrese puede variar tanto como la informática lo acepte en forma digital.

Regresando a las criptodivisas, estas transacciones se componen de una firma digital y otros contenidos como mandatario destino y cantidad de la transacción. También existen otras opciones que pueden servir para agregar metadatos como OP_Codes.

Aquí es cuando empezaremos con la librería de hash, el cual es llamada hashlib.

import hashlib as hasher

class Block:
  def __init__(self, index, timestamp, data, previous_hash):
    self.index = index
    self.timestamp = timestamp
    self.data = data
    self.previous_hash = previous_hash
    self.hash = self.hash_block()
  
  def hash_block(self):
    sha = hasher.sha256()
    sha.update(str(self.index) + 
               str(self.timestamp) + 
               str(self.data) + 
               str(self.previous_hash))
return sha.hexdigest()

Podemos estudiar el código que estamos metiendo aquí. Nuestra clase de bloque, metemos los argumentos de tiempos, datos y el hash o firma previamente generada. Luego definimos estas variables incluyendo el indice el cual sera nuestro blockheight o número de bloques.

Lo otro importante es el self.hash ya que este contendrá el hash actual así como el previous_hash que tendrá el hash anterior. Esto es lo que creará la cadena ya que ligará un hash con el nuevo. Y finalmente tenemos data o los datos que se tendrán en el bloque. Estos datos pueden ser mas de uno, pero por simpleza solo tendremos uno muy pequeño.

La siguiente función es la de hash_block(self) donde estaremos generando los hashes basados en sha256 que es un método del modulo hashlib, despues actualizamos nuestro número de índice único mas toda la demas información para para generar un nuevo hash.

Pasamos al siguiente etapa de nuestro blockchain con el siguiente código:

import datetime as date

def create_genesis_block():
  # Manually construct a block with
  # index zero and arbitrary previous hash
return Block(0, date.datetime.now(), "Genesis Block", "0")

Algo importante es que necesitamos un bloque inicial, ya que siempre requerimos un hash para generar un nuevo bloque, siempre existirá una dependencia. Sin embargo el bloque genesis o inicial no necesitará un hash previo en su formación. Aquí solo necesitaremos la fecha de generación.

def next_block(last_block):
  this_index = last_block.index + 1
  this_timestamp = date.datetime.now()
  this_data = "Hey! I'm block " + str(this_index)
  this_hash = last_block.hash
return Block(this_index, this_timestamp, this_data, this_hash)

Para los demas bloques tendremos esta función llamada next_block o siguiente bloque, donde estaremos manipulando el índice y lo vamos aumentando en su número de bloque o blockheight. También generamos una nueva huella de tiempo e insertamos datos genéricos con el conteo actual del bloque. Y finalmente generamos el nuevo hash del bloque actual. Esto nos regresará los argumentos que solicitamos en nuestra primer función.

Hemos finalizado todos los elementos de nuestro bloque ahora es solo darle el dinamismo del blockchain para que este vaya de forma secuencial, esto lo haremos gracias a un bucle que agregará los bloques a una lista. Solo generaremos 20 bloques y podrás ver en que bloque vamos al manipular su salida. Estas instrucciones las pondremos así:

# Creamos el blockchain y el bloque genesis
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

# Cuantos bloques debemos agregar a nuestra cadena
# despues del bloque genesis
num_of_blocks_to_add = 20

# Bucle para agregar bloques a la cadena.
for i in range(0, num_of_blocks_to_add):
  block_to_add = next_block(previous_block)
  blockchain.append(block_to_add)
  previous_block = block_to_add
  # Tell everyone about it!
  print "Block #{} has been added to the blockchain!".format(block_to_add.index)
print "Hash: {}\n".format(block_to_add.hash) 

Hemos terminado, si quieres saber como se ve el código completo te recomiendo ver este gist. Ejecutamos el código y podemos ver la siguiente salida.


JZA

About me:
Steemian, crypto fan, like to listen to 90s hip hop, and loves to chat about Linux Python and Free software. Runs a local Tech club in sunny Cancun, and enjoys hopping on planes and landing somewhere else.

Sort:  

que buen tu informacion de mucho interes y ayuda

Muy buena información en todo sentido

Parece un ejercicio de listas enlazadas si lo vez desde otra perspectiva

Asi es, blockchain es una tabla, lista o tupla.

Coin Marketplace

STEEM 0.26
TRX 0.11
JST 0.033
BTC 64014.44
ETH 3064.06
USDT 1.00
SBD 3.86