Merge with Bitcoin v0.6.3
[novacoin.git] / bitcointools / blocks.py
1 #
2 # Code for parsing the blkindex.dat file
3 #
4
5 from bsddb.db import *
6 import logging
7 from operator import itemgetter
8 import sys
9 import time
10
11 from BCDataStream import *
12 from base58 import public_key_to_bc_address
13 from util import short_hex
14 from deserialize import *
15
16 def _read_CDiskTxPos(stream):
17   n_file = stream.read_uint32()
18   n_block_pos = stream.read_uint32()
19   n_tx_pos = stream.read_uint32()
20   return (n_file, n_block_pos, n_tx_pos)
21
22 def dump_blockindex(db_env, owner=None, n_to_dump=1000):
23   db = DB(db_env)
24   r = db.open("blkindex.dat", "main", DB_BTREE, DB_THREAD|DB_RDONLY)
25   if r is not None:
26     logging.error("Couldn't open blkindex.dat/main")
27     sys.exit(1)
28
29   kds = BCDataStream()
30   vds = BCDataStream()
31
32   wallet_transactions = []
33
34   for (i, (key, value)) in enumerate(db.items()):
35     if i > n_to_dump:
36       break
37
38     kds.clear(); kds.write(key)
39     vds.clear(); vds.write(value)
40
41     type = kds.read_string()
42
43     if type == "tx":
44       hash256 = kds.read_bytes(32)
45       version = vds.read_uint32()
46       tx_pos = _read_CDiskTxPos(vds)
47       print("Tx(%s:%d %d %d)"%((short_hex(hash256),)+tx_pos))
48       n_tx_out = vds.read_compact_size()
49       for i in range(0,n_tx_out):
50         tx_out = _read_CDiskTxPos(vds)
51         if tx_out[0] != 0xffffffffL:  # UINT_MAX means no TxOuts (unspent)
52           print("  ==> TxOut(%d %d %d)"%tx_out)
53       
54     else:
55       logging.warn("blkindex: type %s"%(type,))
56       continue
57
58   db.close()
59