-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathchain.py
75 lines (60 loc) · 2.02 KB
/
chain.py
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
from block import Block
import datetime
import copy
import json
import jsonpickle
import enum
class BlockChain:
def __init__(self, data):
self.blocks = [self.get_genesis_block(data)]
def get_genesis_block(self, data):
return Block(0, datetime.datetime.utcnow(), data, "arbitrary")
def fork(self):
c = copy.deepcopy(self)
c.blocks = c.blocks[0 : len(self.blocks)]
return c
def add_block(self, data):
chain2 = self.fork()
block = Block(
len(self.blocks),
datetime.datetime.utcnow(),
data,
self.blocks[len(self.blocks) - 1].hash,
)
if block.pos == False:
print("proof of stake invalid. block wont be inserted")
else:
self.blocks.append(block)
flag = self.verify()
if not flag:
print("there is a conflict with the block. aborting!")
self.blocks = self.blocks[0 : len(self.blocks - 1)]
else:
print("Block with index " + str(len(self.blocks)) + " added")
def get_block(self):
return self.blocks[len(self.blocks) - 1]
def get_chain_length(self):
return self.blocks[len(self.blocks)]
def verify(self):
flag = True
for i in range(1, len(self.blocks)):
if self.blocks[i].index != i:
flag = False
if self.blocks[i - 1].hash != self.blocks[i].previous_hash:
flag = False
if self.blocks[i].hash != self.blocks[i].hashing():
flag = False
if self.blocks[i - 1].timestamp >= self.blocks[i].timestamp:
flag = False
return flag
def toJSON(self):
return jsonpickle.encode(self)
"""map = {
"block_data": [
{"id": 123, "curr_x": 123,"curr_y"=123, "final_coordinates": 123,"status" : "picked", "owner_bot_id":123}
],
"bot_data": [
{"id": 123, "block_id": 123, "curr_x": 123,"curr_y":123}
],
"total_blocks": 1234,
}"""