Created
July 11, 2024 08:51
-
-
Save tetelie/96afe2807ecb993901a54695a95888f3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
Created on Thu Jan 6 21:27:04 2022 | |
@author: elie | |
""" | |
import datetime | |
import hashlib | |
import json | |
from flask import Flask, jsonify | |
# Module 1 ~ Create a blockchain | |
# Part 1 - Building a Blockchain | |
class Blockchain: | |
def __init__(self): | |
self.chain = [] | |
self.create_block(proof = 1, previous_hash = '0') | |
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 | |
def get_previous_block(self): | |
return self.chain[-1] | |
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() # asymmetric operation | |
if hash_operation[:4] == '0000': | |
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 is_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[:4] != '0000': | |
return False | |
previous_block = block | |
block_index += 1 | |
return True | |
# Part 2 - Mining our Blockchain | |
# Creating a Web App | |
app = Flask(__name__) | |
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False | |
# Creating a Blockchain | |
blockchain = Blockchain() | |
# Mining a new block | |
@app.route('/mine_block', methods = ['GET']) | |
def mine_block(): | |
previous_block = blockchain.get_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': 'Congratulations, you just mined a block!', | |
'index': block['index'], | |
'timestamp': block['timestamp'], | |
'proof': block['proof'], | |
'previous_hash': block['previous_hash']} | |
return jsonify(response), 200 | |
# Getting the full Blockchain | |
@app.route('/get_chain', methods = ['GET']) | |
def get_chain(): | |
response = {'chain': blockchain.chain, | |
'length': len(blockchain.chain)} | |
return jsonify(response), 200 | |
# Checking if the Blockchain is valid | |
@app.route('/is_valid', methods = ['GET']) | |
def is_valid(): | |
if(blockchain.is_chain_valid(blockchain.chain)): | |
response = {'message': 'All good, the Blockchain is valid!'} | |
else: | |
response = {'message': 'Oh shit, something wrong! The Blockchain is not valid!'} | |
return jsonify(response), 200 | |
# Running the app | |
app.run(host = "0.0.0.0", port = 5000) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment