Mercurial > public > bitcaviar-plus
annotate src/bitcaviar_plus/block.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 |
rev | line source |
---|---|
23
32061555853c
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
19
diff
changeset
|
1 """ |
32061555853c
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
19
diff
changeset
|
2 Deserialize methods for blocks |
32061555853c
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
19
diff
changeset
|
3 """ |
32061555853c
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
19
diff
changeset
|
4 |
12
6a0a8cce058e
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
10
diff
changeset
|
5 from bitcaviar_plus.block_structure import * |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
6 from bitcaviar_plus.helpers import get_var_int |
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
7 from bitcaviar_plus.helpers import compute_hash |
19
905b6fdc5e1b
handle invalid magic bytes
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
12
diff
changeset
|
8 from bitcaviar_plus.errors import InvalidMagicBytes |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
9 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
10 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
11 def deserialize_block(f): |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
12 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
13 Deserialize block |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
14 :param f: buffer, required |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
15 :return: dict |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
16 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
17 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
18 block = Block() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
19 block.magic_number = f.read(4).hex() |
19
905b6fdc5e1b
handle invalid magic bytes
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
12
diff
changeset
|
20 |
905b6fdc5e1b
handle invalid magic bytes
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
12
diff
changeset
|
21 if block.magic_number != 'f9beb4d9': |
905b6fdc5e1b
handle invalid magic bytes
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
12
diff
changeset
|
22 raise InvalidMagicBytes(block.magic_number) |
905b6fdc5e1b
handle invalid magic bytes
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
12
diff
changeset
|
23 |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
24 block.size = f.read(4)[::-1].hex() |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
25 block_header, block.id = deserialize_header(f) |
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
26 block.transaction_count = get_var_int(f) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
28 transactions = [] |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
29 for transaction_number in range(int(block.transaction_count, 16)): |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
30 transactions.append(deserialize_transaction_data(f)) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
32 block_dict = block.__dict__ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
33 block_dict['header'] = block_header |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
34 block_dict['transactions'] = transactions |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
35 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
36 return block_dict |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
37 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
38 |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
39 # ---- SECONDARY METHODS ---- |
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 def deserialize_header(f): |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
43 Deserialize block header |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
44 More info: https://learnmeabitcoin.com/technical/block-header |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
45 :param f: buffer, required |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
46 :return: (dict, string) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
47 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
48 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
49 # Compute block hash |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
50 before = f.tell() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
51 header = f.read(80) |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
52 block_hash = compute_hash(header) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
53 f.seek(before) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
54 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
55 header = Header() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
56 header.version = f.read(4)[::-1].hex() |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
57 header.previous_block_id = f.read(32)[::-1].hex() |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 header.merkle_root = f.read(32)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
59 header.time = f.read(4)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
60 header.bits = f.read(4)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
61 header.nonce = f.read(4)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
62 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
63 return header.__dict__, block_hash |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
64 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
65 |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
66 def deserialize_transaction_data(f): |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
67 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
68 Deserialize transaction data |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
69 More info: https://learnmeabitcoin.com/technical/transaction-data |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
70 :param f: buffer, required |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 :return: dict |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
72 """ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
74 transaction = Transaction() |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 start_transaction_data = f.tell() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
76 transaction.version = f.read(4)[::-1].hex() |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
77 transaction.input_count = get_var_int(f) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
78 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
79 transaction_inputs = [] |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
80 for input_number in range(int(transaction.input_count, 16)): |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
81 transaction_input = TransactionInput() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
82 transaction_input.id = f.read(32)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
83 transaction_input.vout = f.read(4)[::-1].hex() |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
84 transaction_input.script_sig_size = get_var_int(f) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
85 transaction_input.script_sig = f.read(int(transaction_input.script_sig_size, 16)).hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
86 transaction_input.sequence = f.read(4)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
87 transaction_inputs.append(transaction_input.__dict__) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
88 |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
89 transaction.output_count = get_var_int(f) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 transaction_outputs = [] |
9
e218f70e19e9
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
8
diff
changeset
|
92 for output_number in range(int(transaction.output_count, 16)): |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
93 transaction_output = TransactionOutput() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
94 transaction_output.value = f.read(8)[::-1].hex() |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
95 transaction_output.script_pub_key_size = get_var_int(f) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
96 transaction_output.script_pub_key = f.read(int(transaction_output.script_pub_key_size, 16)).hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
97 transaction_outputs.append(transaction_output.__dict__) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
98 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 transaction.lock_time = f.read(4)[::-1].hex() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
101 # Compute transaction id |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
102 end_transaction_data = f.tell() |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
103 transaction_data_size = end_transaction_data - start_transaction_data |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
104 f.seek(start_transaction_data) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
105 transaction_data = f.read(transaction_data_size) |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
106 f.seek(end_transaction_data) |
28
30535f42d0ff
refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
23
diff
changeset
|
107 transaction.id = compute_hash(transaction_data) |
8
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
108 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
109 transaction_dict = transaction.__dict__ |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
110 transaction_dict['inputs'] = transaction_inputs |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
111 transaction_dict['outputs'] = transaction_outputs |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
112 |
4d259e84160d
fix OverFlow bug
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
113 return transaction_dict |