-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblockchain.py
More file actions
executable file
·120 lines (81 loc) · 3.31 KB
/
Copy pathblockchain.py
File metadata and controls
executable file
·120 lines (81 loc) · 3.31 KB
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
import datetime
import hashlib
import json
from flask import Flask, jsonify, request
# Building BlockChain
class Blockchain:
def __init__(self):
self.chain = []
self.create_block(proof = 1, previous_hash = '0', data = 'zero')
def create_block(self, proof, previous_hash, data):
block = {'index' : len(self.chain) + 1,
'timestamp' : str(datetime.datetime.now()),
'proof' : proof,
'data' : data,
'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()
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
app = Flask(__name__)
blockchain = Blockchain()
#http://localhost:5000/mine_block/name=bharath
@app.route('/mine_block/name=<username>/address=<address>', methods = ['GET', 'POST'])
def mine_block(username, address):
previous_block = blockchain.get_previous_block()
previous_proof = previous_block['proof']
proof = blockchain.proof_of_work(previous_proof)
previous_hash = blockchain.hash(previous_block)
data = "Name : " + username + ", Address : " + address
block = blockchain.create_block(proof, previous_hash, data)
response = {'message' : 'Congo You just Mined a block',
'index' : block['index'],
'data' : block['data'],
'timestamp' : block['timestamp'],
'proof' : block['proof'],
'previous_hash' : block['previous_hash'],
}
return jsonify(response), 200
@app.route('/get_chain', methods = ['GET'])
def get_chain():
response = {'chain' : blockchain.chain,
'length' : len(blockchain.chain)
}
return jsonify(response), 200
@app.route('/is_valid', methods = ['GET'])
def is_valid():
valid = blockchain.is_chain_valid(blockchain.chain)
if valid:
response = {'message' : 'Chain is valid.'}
else:
response = {'message' : 'Chain is not valid.'}
return jsonify(response), 200
app.run(port = 5000)