-
Notifications
You must be signed in to change notification settings - Fork 621
/
LastBlockHash.py
63 lines (53 loc) · 1.5 KB
/
LastBlockHash.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
import sys
sys.argv.append('--nologging')
from armoryengine import BTC_HOME_DIR
from utilities.ArmoryUtils import binary_to_int, LITTLEENDIAN, sha256, \
binary_to_hex, BIGENDIAN
import hashlib
import os
BLOCK_SIZE_LENGTH = 4
MAGIC_NUMBER_LENGTH = 4
HEADER_LENGTH = 80
def getLastBlockFile():
# the current last block file number
i = 80
blkFilePath = os.path.join(BTC_HOME_DIR, 'blocks', 'blk%05d.dat' % i)
lastFile = None
while True:
try:
with open(blkFilePath, 'rb') as f:
lastFile = blkFilePath
except IOError:
break
i += 1
blkFilePath = os.path.join(BTC_HOME_DIR, 'blocks', 'blk%05d.dat' % i)
return lastFile
def getFileSize(f):
pos = f.tell()
# Go to the end to get the file length
f.seek(0,2)
result = f.tell()
f.seek(pos)
return result
def getNextBlockHash(f):
fileOffset = f.tell()
f.seek(MAGIC_NUMBER_LENGTH, 1)
blkSize = binary_to_int(f.read(BLOCK_SIZE_LENGTH), LITTLEENDIAN)
result = None
if blkSize > 0:
blkString = f.read(blkSize)
blkHdrBinary = blkString[:HEADER_LENGTH]
result = sha256(sha256(blkHdrBinary))
else:
f.seek(0,2)
return result
def getLastBlockHash(blkFile):
result = None
with open(blkFile, 'rb') as f:
fSize = getFileSize(f)
while f.tell() < fSize:
blockHash = getNextBlockHash(f)
if blockHash != None:
result = blockHash
return result
print binary_to_hex(getLastBlockHash(getLastBlockFile()), BIGENDIAN)