BlockChain in Python

 Fuente: https://www.geeksforgeeks.org/create-simple-blockchain-using-python/

 

Crea una Blockchain simple usando Python

Última actualización: 14 de febrero de 2023



Blockchain es una serie descentralizada de registros fijos con marca de tiempo que contiene datos de cualquier tamaño y está controlado 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. 

 

Crear Blockchain usando Python, extraer nuevos bloques y mostrar toda la cadena de bloques:

  • Los datos se almacenarán en formato JSON, que es muy fácil de implementar y de leer. Los datos se almacenan en un bloque y el bloque contiene varios datos. Cada minuto se añaden múltiples bloques y para diferenciar uno del otro usaremos la toma de huellas dactilares.
  • La toma de huellas dactilares se realiza mediante hash y, en particular, 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 encadenar los bloques. Cada bloque se adjuntará al bloque anterior con su hash y al siguiente bloque dando su hash.
  • La extracción del nuevo bloque se realiza encontrando 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 dura como para ser explotada.
  • Después de extraer el bloque con éxito, el bloque se agregará a la cadena.
  • Después de extraer varios bloques, se debe verificar la validez de la cadena para evitar cualquier tipo de manipulación de la cadena de bloques.
  • Luego, la aplicación web se creará utilizando Flask y se implementará local o públicamente según las necesidades del usuario. 
  •  
 # 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)

Comentarios

Entradas más populares de este blog

TEST DE VARIABLES EN PYTHON

PySDR: una guía para SDR y DSP usando Python by Dr. Marc Lichtman. Introducciòn.

LEER Y CONVERTIR AUDIOS CON PYTHON EN GOOGLE COLAB