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