miércoles, 1 de mayo de 2024

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)

No hay comentarios.:

Publicar un comentario

Entradas recientes

Thinkcspy 7.7 Condicionales encadenados

  7.7. Condicionales encadenados Python proporciona una forma alternativa de escribir una selección anidada, como la que se muestra en la s...

Entradas Populares