forked from tuxsoul/bitcoin-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
coinbase_integers.py
executable file
·73 lines (61 loc) · 1.99 KB
/
coinbase_integers.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
#!/usr/bin/env python
#
# Scan through coinbase transactions
# in the block database intepreting
# bytes 0-3 (and 1-4 if byte 0 is 0x04)
# as a block height, looking for plausible
# future heights.
#
from bsddb.db import *
from datetime import date, datetime
import logging
import os
import re
import sys
from BCDataStream import *
from block import scan_blocks
from collections import defaultdict
from deserialize import parse_Block
from util import determine_db_dir, create_env
def approx_date(height):
timestamp = 1231006505+height*10*60
t = datetime.fromtimestamp(timestamp)
return "%d-%.2d"%(t.year, t.month)
def main():
import optparse
parser = optparse.OptionParser(usage="%prog [options]")
parser.add_option("--datadir", dest="datadir", default=None,
help="Look for files here (defaults to bitcoin default)")
(options, args) = parser.parse_args()
if options.datadir is None:
db_dir = determine_db_dir()
else:
db_dir = options.datadir
try:
db_env = create_env(db_dir)
except DBNoSuchFileError:
logging.error("Couldn't open " + db_dir)
sys.exit(1)
blockfile = open(os.path.join(db_dir, "blk%04d.dat"%(1,)), "rb")
block_datastream = BCDataStream()
block_datastream.map_file(blockfile, 0)
def gather(block_data):
block_datastream.seek_file(block_data['nBlockPos'])
data = parse_Block(block_datastream)
height = block_data['nHeight']
coinbase = data['transactions'][0]
scriptSig = coinbase['txIn'][0]['scriptSig']
if len(scriptSig) < 4:
return True
(n,) = struct.unpack_from('<I', scriptSig[0:4])
if n < 6*24*365.25*100: # 200 years of blocks:
print("%d: %d (%s)"%(height, n, approx_date(n)))
if ord(scriptSig[0]) == 0x03:
(n,) = struct.unpack_from('<I', scriptSig[1:4]+'\0')
if n < 6*24*365.25*100: # 200 years of blocks:
print("%d: PUSH %d (%s)"%(height, n, approx_date(n)))
return True
scan_blocks(db_dir, db_env, gather)
db_env.close()
if __name__ == '__main__':
main()