comparison src/block.py @ 3:3d83609e12a1

get value in output
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sun, 17 Oct 2021 17:33:26 +0200
parents 5b16e6df6a59
children e7a84094bf07
comparison
equal deleted inserted replaced
2:5b16e6df6a59 3:3d83609e12a1
26 class Transaction: 26 class Transaction:
27 id = str() 27 id = str()
28 version = int() 28 version = int()
29 number_of_inputs = int() 29 number_of_inputs = int()
30 inputs = [] 30 inputs = []
31 number_of_outputs = int()
32 outputs = []
31 33
32 class Inputs: 34 class TransactionInput:
33 pass 35 id = str()
36 is_coinbase = False
37 vout = int()
38 script_sig_size = int()
39 script_sig = str()
40 sequence = int()
41
42 class TransactionOutput:
43 value = float()
44 script_pub_key_size = int()
45 script_pub_key = str()
34 46
35 47
36 def read_block(file): 48 def read_block(file):
37 """ 49 """
38 Deserialize block 50 Deserialize block
61 header.nonce = int.from_bytes(header_bytes[76:80], 'little') 73 header.nonce = int.from_bytes(header_bytes[76:80], 'little')
62 74
63 # Number of transactions (varInt) 75 # Number of transactions (varInt)
64 block.number_of_transactions = get_variable_int(file) 76 block.number_of_transactions = get_variable_int(file)
65 77
66 # Compute transaction ID 78 for transaction_number in range(block.number_of_transactions):
67 # Get remaining bytes until the end of the block 79 transaction = Transaction()
68 transaction = Transaction() 80 transaction.version = int.from_bytes(read_bytes(file, 4), 'big')
69 bytes_read = file.tell() 81 transaction.number_of_inputs = get_variable_int(file)
70 whole_block_size = block.size + 8 # Plus magic number and block size
71 transaction_data_size = whole_block_size - bytes_read
72 transaction_data = file.read(transaction_data_size)
73 file.seek(bytes_read) # Set position to where 'transaction data' starts
74 transaction_id = hashlib.sha256(transaction_data).digest()
75 transaction_id = hashlib.sha256(transaction_id).digest()
76 transaction.id = transaction_id[::-1].hex()
77 82
78 transaction.version = int.from_bytes(read_bytes(file, 4), 'little') 83 for input_number in range(transaction.number_of_inputs):
79 transaction.number_of_inputs = get_variable_int(file) 84 transaction_input = transaction.TransactionInput()
85 transaction_input.id = read_bytes(file, 32).hex()
86 if transaction_input.id == '0000000000000000000000000000000000000000000000000000000000000000':
87 transaction_input.is_coinbase = True
80 88
89 transaction_input.vout = int.from_bytes(read_bytes(file, 4), 'little')
90 transaction_input.script_sig_size = get_variable_int(file)
91 transaction_input.script_sig = read_bytes(file, transaction_input.script_sig_size, 'forward').hex()
92 transaction_input.sequence = int.from_bytes(read_bytes(file, 4), 'little')
81 93
94 transaction.number_of_outputs = get_variable_int(file)
82 95
96 for output_number in range(transaction.number_of_outputs):
97 transaction_output = transaction.TransactionOutput()
98 transaction_output.value = float.fromhex(read_bytes(file, 8).hex())
99 transaction_output.value /= 100000000 # Satoshis to BTC