-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblockchain.py
More file actions
119 lines (83 loc) · 2.78 KB
/
Copy pathblockchain.py
File metadata and controls
119 lines (83 loc) · 2.78 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
import datetime
import hashlib
import json
from flask import Flask, jsonify
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()
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()
@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 = {
"success": True,
"index": block["index"],
"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)
response = {
"valid": valid,
}
return jsonify(response), 200
app.run(host="0.0.0.0", port=5001)