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