annotate src/bitcaviar_plus/search.py @ 34:bd0ec5cb2300 default tip

Move to mercurial
author Dennis C. M. <dennis@denniscm.com>
date Tue, 03 Jun 2025 14:24:28 +0100
parents 30535f42d0ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
32061555853c refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 """
32061555853c refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 Search methods for LEVELDB database
28
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
3 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
4
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
5 try:
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
6 # noinspection PyUnresolvedReferences
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
7 import plyvel
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
8 except ImportError:
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
9 # Avoid import error running unit tests
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
10 print("Couldn't import plyvel package. Are you running unit tests?")
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
11
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
12 import tempfile
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
13
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
14
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
15 def search_block_with(block_hash):
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
16 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
17 Search block with a given hash and get value
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
18 :param block_hash: string, required
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
19 :return: string
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
20 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
21
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
22 db = level_db_connect()
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
23 search_type = bytes.fromhex('62') # 'b' (block) in hex is 62
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
24 block_hash = bytes.fromhex(block_hash)[::-1]
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
25 key = search_type + block_hash
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
26 value = db.get(key)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
27 db.close()
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
28
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
29 return value.hex()
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
30
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
31
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
32 # ---- SECONDARY METHODS ----
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
33
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
34 def deserialize_block_search(f):
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
35 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
36 Deserialize value (block search)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
37 More info: https://bitcoin.stackexchange.com/questions/67515/format-of-a-block-keys-contents-in-bitcoinds-leveldb
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
38 :param f: buffer, required
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
39 :return: dict
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
40 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
41
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
42 client_number = f.read(3)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
43 print('Client number: {}'.format(client_number.hex()))
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
44 block_height = f.read(1) # Var int 128?
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
45 print('Block height: {}'.format(block_height.hex()))
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
46 status = f.read(1) # var int 128?
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
47 print('Status: {}'.format(status.hex()))
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
48 number_of_transactions = f.read(1) # var int 128?
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
49 print('Number of transactions: {}'.format(number_of_transactions.hex()))
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
50
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
51
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
52 def create_file_with(binary):
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
53 with tempfile.TemporaryFile() as fp:
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
54 fp.write(binary)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
55 fp.seek(0)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
56
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
57 return fp
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
58
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
59
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
60 # noinspection PyUnresolvedReferences
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
61 def level_db_connect():
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
62 db = plyvel.DB('/bitcoin-node/.bitcoin/blocks/index/', create_if_missing=False)
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
63
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
64 return db
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
65
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
66
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
67 def get_128_var_int(f):
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
68 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
69 This var int is different from helpers.get_var_int
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
70 :param f:
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
71 :return: string
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
72 """
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
73
30535f42d0ff refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
74 pass