Mercurial > public > bitcaviar-plus
comparison src/puppy/block.py @ 8:4d259e84160d
fix OverFlow bug
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Sun, 24 Oct 2021 17:38:23 +0200 |
parents | |
children | e218f70e19e9 |
comparison
equal
deleted
inserted
replaced
7:e4afde8d5a7e | 8:4d259e84160d |
---|---|
1 from puppy.block_structure import * | |
2 from puppy.helpers import get_var_int | |
3 from puppy.helpers import compute_hash | |
4 | |
5 """ | |
6 Deserialize methods | |
7 """ | |
8 | |
9 | |
10 def deserialize_block(f): | |
11 """ | |
12 Deserialize block | |
13 :param f: buffer, required | |
14 :return: dict | |
15 """ | |
16 | |
17 block = Block() | |
18 block.magic_number = f.read(4).hex() | |
19 block.block_size = f.read(4)[::-1].hex() | |
20 block_header, block.block_hash = deserialize_header(f) | |
21 block.number_of_transactions = get_var_int(f) | |
22 | |
23 transactions = [] | |
24 for transaction_number in range(int(block.number_of_transactions, 16)): | |
25 transactions.append(deserialize_transaction_data(f, block.block_size)) | |
26 | |
27 block_dict = block.__dict__ | |
28 block_dict['header'] = block_header | |
29 block_dict['transactions'] = transactions | |
30 | |
31 return block_dict | |
32 | |
33 | |
34 def deserialize_header(f): | |
35 """ | |
36 Deserialize block header | |
37 More info: https://learnmeabitcoin.com/technical/block-header | |
38 :param f: buffer, required | |
39 :return: (dict, string) | |
40 """ | |
41 | |
42 # Compute block hash | |
43 before = f.tell() | |
44 header = f.read(80) | |
45 block_hash = compute_hash(header) | |
46 f.seek(before) | |
47 | |
48 header = Header() | |
49 header.version = f.read(4)[::-1].hex() | |
50 header.previous_block_hash = f.read(32)[::-1].hex() | |
51 header.merkle_root = f.read(32)[::-1].hex() | |
52 header.time = f.read(4)[::-1].hex() | |
53 header.bits = f.read(4)[::-1].hex() | |
54 header.nonce = f.read(4)[::-1].hex() | |
55 | |
56 return header.__dict__, block_hash | |
57 | |
58 | |
59 def deserialize_transaction_data(f, block_size): | |
60 """ | |
61 Deserialize transaction data | |
62 More info: https://learnmeabitcoin.com/technical/transaction-data | |
63 :param f: buffer, required | |
64 :param block_size: string, required | |
65 :return: dict | |
66 """ | |
67 | |
68 start_transaction_data = f.tell() | |
69 | |
70 transaction = Transaction() | |
71 transaction.version = f.read(4)[::-1].hex() | |
72 transaction.number_of_inputs = get_var_int(f) | |
73 | |
74 transaction_inputs = [] | |
75 for input_number in range(int(transaction.number_of_inputs, 16)): | |
76 transaction_input = TransactionInput() | |
77 transaction_input.id = f.read(32)[::-1].hex() | |
78 transaction_input.vout = f.read(4)[::-1].hex() | |
79 transaction_input.script_sig_size = get_var_int(f) | |
80 transaction_input.script_sig = f.read(int(transaction_input.script_sig_size, 16)).hex() | |
81 transaction_input.sequence = f.read(4)[::-1].hex() | |
82 transaction_inputs.append(transaction_input.__dict__) | |
83 | |
84 transaction.number_of_outputs = get_var_int(f) | |
85 | |
86 transaction_outputs = [] | |
87 for output_number in range(int(transaction.number_of_outputs, 16)): | |
88 transaction_output = TransactionOutput() | |
89 transaction_output.value = f.read(8)[::-1].hex() | |
90 transaction_output.script_pub_key_size = get_var_int(f) | |
91 transaction_output.script_pub_key = f.read(int(transaction_output.script_pub_key_size, 16)).hex() | |
92 transaction_outputs.append(transaction_output.__dict__) | |
93 | |
94 transaction.lock_time = f.read(4)[::-1].hex() | |
95 | |
96 # Compute transaction id | |
97 end_transaction_data = f.tell() | |
98 transaction_data_size = end_transaction_data - start_transaction_data | |
99 f.seek(start_transaction_data) | |
100 transaction_data = f.read(transaction_data_size) | |
101 f.seek(end_transaction_data) | |
102 transaction.id = compute_hash(transaction_data) | |
103 | |
104 transaction_dict = transaction.__dict__ | |
105 transaction_dict['inputs'] = transaction_inputs | |
106 transaction_dict['outputs'] = transaction_outputs | |
107 | |
108 return transaction_dict |