0% found this document useful (0 votes)
52 views

Module 1 - Blockchain

This document provides instructions for creating a basic blockchain using Flask and Python. It includes importing necessary libraries, defining a Blockchain class to manage the chain, functions for proof of work, hashing blocks, and validating the chain. A web app is created using Flask to allow mining new blocks and retrieving the full blockchain or checking if it is valid.

Uploaded by

asf
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
52 views

Module 1 - Blockchain

This document provides instructions for creating a basic blockchain using Flask and Python. It includes importing necessary libraries, defining a Blockchain class to manage the chain, functions for proof of work, hashing blocks, and validating the chain. A web app is created using Flask to allow mining new blocks and retrieving the full blockchain or checking if it is valid.

Uploaded by

asf
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 5

# Module 1 - Create a Blockchain

# To be installed:

# Flask==0.12.2: pip install Flask==0.12.2

# Postman HTTP Client: https://www.getpostman.com/

# Importing the libraries

import datetime

import hashlib

import json

from flask import Flask, jsonify

# 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 # to increment each 1 after

check_proof = False

while check_proof is False:

hash_operation = hashlib.sha256(str(new_proof**2 - previous_proof**2).encode()).hexdigest()

if hash_operation[:4] == '0000': # to mine the problem easily

"""

of the problem, meaning we are gonna check

if the first four characters

of this hash operation are four zeros

that's the four leading zeros I've been talking about.

And if these first four characters

of four zeros, well, we win."""

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):

"""First, we're gonna check that the previous hash

of each block is equal to the hash of its previous block.

And the second thing we'll check

is that the proof of each block is valid according

to our proof of work problem that we defined

in this proof of work function."""

previous_block = chain[0] #first time , the block number will be 0

block_index = 1 #looping Variable,each block has index

while block_index < len(chain): # will stop if the conditon blockindex is less than length of chain , we
will not stop till we reach last block

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__)

# 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():

is_valid = blockchain.is_chain_valid(blockchain.chain)

if is_valid:

response = {'message': 'All good. The Blockchain is valid.'}

else:

response = {'message': 'Houston, we have a problem. The Blockchain is not valid.'}

return jsonify(response), 200

# Running the app

app.run(host = '0.0.0.0', port = 5000)

You might also like