forked from theQRL/QRL
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfork.py
More file actions
47 lines (42 loc) · 1.7 KB
/
fork.py
File metadata and controls
47 lines (42 loc) · 1.7 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
import json
#Initializers to be decided
pending_blocks = {}
last_bk_time = None
last_ph_time = None
epoch_minimum_blocknumber = None
def set_epoch(blocknumber):
epoch_minimum_blocknumber = blocknumber - blocknumber % 10000
def fork_recovery(blocknumber, chain, randomize_headerhash_fetch):
set_epoch(blocknumber)
global pending_blocks
pending_blocks = {}
randomize_headerhash_fetch(blocknumber-1)
chain.state.update('forked')
def verify(suffix, peerIdentity, chain, randomize_headerhash_fetch):
mini_block = json.loads(suffix)
blocknumber = mini_block['blocknumber']
if blocknumber in pending_blocks and pending_blocks[blocknumber][0] == peerIdentity:
printL (( 'Found in Fork Pending List' ))
try: pending_blocks[blocknumber][3].cancel()
except Exception: pass
del pending_blocks[blocknumber]
if mini_block['headerhash'] == chain.m_get_block(blocknumber).blockheader.headerhash: #Matched so fork root is the block next to it
unfork(blocknumber+1, chain)
return
if blocknumber >= epoch_minimum_blocknumber:
randomize_headerhash_fetch(blocknumber-1)
else:
printL (( '******Seems like chain has been forked in previous epoch... Manual intervention is required!!!!!******' ))
def unfork(blocknumber, chain):
sl = chain.stake_list_get()
for blocknum in xrange(blocknumber, chain.height()+1):
stake_selector = chain.m_blockchain[blocknum].blockheader.stake_selector
for s in sl:
if stake_selector == s[0]:
s[2]-=1
del chain.m_blockchain[blocknumber:]
chain.stake_list_put(sl)
printL (( 'Forked chain has been removed from blocknumber ', blocknumber ))
chain.state.update('unsynced')
#def headerhash_lookup(blocknumber):
#reactor.callLater(15,