Cree Blockchain simple usando Python

Una string de bloques es una serie descentralizada de registros fijos con marca de tiempo que contiene datos de cualquier tamaño y está controlada por una gran red de computadoras que se encuentran dispersas por todo el mundo y no son propiedad de una sola organización. Cada bloque está protegido y conectado entre sí mediante tecnología hash que lo protege de ser manipulado por una persona no autorizada. 

Creando Blockchain usando Python, extrayendo nuevos bloques y mostrando toda la string de bloques: 

  • Los datos se almacenarán en formato JSON, que es muy fácil de implementar y fácil de leer. Los datos se almacenan en un bloque y el bloque contiene varios datos. Todos y cada uno de los minutos se agregan múltiples bloques y para diferenciar uno de otro usaremos huellas dactilares.
  • La toma de huellas dactilares se realiza mediante hash y, para ser más concretos, utilizaremos el algoritmo hash SHA256. Cada bloque contendrá su propio hash y también el hash de la función anterior para que no pueda ser manipulado.
  • Esta toma de huellas dactilares se utilizará para enstringr los bloques. Cada bloque se adjuntará al bloque anterior que tenga su hash y al siguiente bloque dando su hash.
  • La extracción del nuevo bloque se realiza al encontrar con éxito la respuesta a la prueba de trabajo. Para que la minería sea difícil, la prueba de trabajo debe ser lo suficientemente difícil como para ser explotada.
  • Después de extraer el bloque con éxito, el bloque se agregará a la string.
  • Después de extraer varios bloques, se debe verificar la validez de la string para evitar cualquier tipo de manipulación de la string de bloques.
  • Luego, la aplicación web se creará utilizando Flask y se implementará de forma local o pública según la necesidad del usuario.

Python3

# Python program to create Blockchain
 
# For timestamp
import datetime
 
# Calculating the hash
# in order to add digital
# fingerprints to the blocks
import hashlib
 
# To store data
# in our blockchain
import JSON
 
# Flask is for creating the web
# app and jsonify is for
# displaying the blockchain
from flask import Flask, jsonify
 
 
class Blockchain:
   
    # This function is created
    # to create the very first
    # block and set its hash to "0"
    def __init__(self):
        self.chain = []
        self.create_block(proof=1, previous_hash='0')
 
    # This function is created
    # to add further blocks
    # into the chain
    def create_block(self, proof, previous_hash):
        block = {'index': len(self.chain) + 1,
                 'timestamp': str(datetime.datetime.now()),
                 'proof': proof,
                 'previous_hash': previous_hash}
        self.chain.append(block)
        return block
       
    # This function is created
    # to display the previous block
    def print_previous_block(self):
        return self.chain[-1]
       
    # This is the function for proof of work
    # and used to successfully mine the block
    def proof_of_work(self, previous_proof):
        new_proof = 1
        check_proof = False
         
        while check_proof is False:
            hash_operation = hashlib.sha256(
                str(new_proof**2 - previous_proof**2).encode()).hexdigest()
            if hash_operation[:5] == '00000':
                check_proof = True
            else:
                new_proof += 1
                 
        return new_proof
 
    def hash(self, block):
        encoded_block = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(encoded_block).hexdigest()
 
    def chain_valid(self, chain):
        previous_block = chain[0]
        block_index = 1
         
        while block_index < len(chain):
            block = chain[block_index]
            if block['previous_hash'] != self.hash(previous_block):
                return False
               
            previous_proof = previous_block['proof']
            proof = block['proof']
            hash_operation = hashlib.sha256(
                str(proof**2 - previous_proof**2).encode()).hexdigest()
             
            if hash_operation[:5] != '00000':
                return False
            previous_block = block
            block_index += 1
         
        return True
 
 
# Creating the Web
# App using flask
app = Flask(__name__)
 
# Create the object
# of the class blockchain
blockchain = Blockchain()
 
# Mining a new block
@app.route('/mine_block', methods=['GET'])
def mine_block():
    previous_block = blockchain.print_previous_block()
    previous_proof = previous_block['proof']
    proof = blockchain.proof_of_work(previous_proof)
    previous_hash = blockchain.hash(previous_block)
    block = blockchain.create_block(proof, previous_hash)
     
    response = {'message': 'A block is MINED',
                'index': block['index'],
                'timestamp': block['timestamp'],
                'proof': block['proof'],
                'previous_hash': block['previous_hash']}
     
    return jsonify(response), 200
 
# Display blockchain in json format
@app.route('/get_chain', methods=['GET'])
def display_chain():
    response = {'chain': blockchain.chain,
                'length': len(blockchain.chain)}
    return jsonify(response), 200
 
# Check validity of blockchain
@app.route('/valid', methods=['GET'])
def valid():
    valid = blockchain.chain_valid(blockchain.chain)
     
    if valid:
        response = {'message': 'The Blockchain is valid.'}
    else:
        response = {'message': 'The Blockchain is not valid.'}
    return jsonify(response), 200
 
 
# Run the flask server locally
app.run(host='127.0.0.1', port=5000)

Salida (mine_block):

{
"index":2,
"message":"A block is MINED",
"previous_hash":"2d83a826f87415edb31b7e12b35949b9dbf702aee7e383cbab119456847b957c",
"proof":533,
"timestamp":"2020-06-01 22:47:59.309000"
}

Salida (get_chain):

{
"chain":[{"index":1,
"previous_hash":"0",
"proof":1,
"timestamp":"2020-06-01 22:47:05.915000"},{"index":2,
"previous_hash":"2d83a826f87415edb31b7e12b35949b9dbf702aee7e383cbab119456847b957c",
"proof":533,
"timestamp":"2020-06-01 22:47:59.309000"}],
"length":2
}

Salida (válida):

{"message":"The Blockchain is valid."}

Publicación traducida automáticamente

Artículo escrito por gluttony777 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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