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