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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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