Spaces:
Runtime error
Runtime error
File size: 4,666 Bytes
6b57175 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# -*- coding: utf-8 -*-
"""Blockchain.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1wfXS6MTMX2J77EP5X1qFiKQzdo_eh511
"""
import datetime
import hashlib
import json
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 print_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()
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
def create_chain():
global blockchain
blockchain = Blockchain()
return "Chain Instantiated"
def del_chain():
global blockchain
del blockchain
return "Chain Deleted"
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 response
def hack_block(index,value):
index=int(index.split(" ")[1])-1
blockchain.chain[index]['proof']=value
return f"block modified at index:{index+1}"
def display_chain():
try:
response = {'chain': blockchain.chain,'length': len(blockchain.chain)}
except:
response = "No chain found"
return response
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 response
import gradio as gr
with gr.Blocks(title='Blockchain Simulator') as demo:
gr.Image(value="./Blockchain.jpg",show_label=False,shape=(1500,300))
with gr.Row():
with gr.Column(scale=3):
display = gr.Textbox(label="Blockchain Output",lines=5)
dblock = gr.Button("Display/Refresh Blockchain")
with gr.Column(scale=2):
cblock = gr.Button("Instantiate Blockchain")
mblock = gr.Button("Mine a Block")
vblock = gr.Button("Validate Blockchain")
delblock = gr.Button("Delete Blockchain")
with gr.Column(scale=2):
index = gr.Radio(choices=["index 1", "index 2", "index 3"],label="Choose an Index to hack")
value = gr.Textbox(label="New Value", placeholder = "Enter a Value")
hblock = gr.Button("Hack a Block")
dblock.click(fn=display_chain, inputs=[], outputs=[display],show_progress=True)
cblock.click(fn=create_chain, inputs=[], outputs=[display],show_progress=True)
mblock.click(fn=mine_block, inputs=[], outputs=[display],show_progress=True)
vblock.click(fn=valid, inputs=[], outputs=[display],show_progress=True)
delblock.click(fn=del_chain, inputs=[], outputs=[display],show_progress=True)
hblock.click(fn=hack_block, inputs=[index,value], outputs=[display],show_progress=True)
demo.launch() |