Mercurial > public > bitcaviar-plus
annotate src/bitcaviar_plus/search.py @ 28:30535f42d0ff
refactor code
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Wed, 02 Feb 2022 21:16:10 +0100 |
parents | 32061555853c |
children |
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 |