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