Mercurial > public > bitcaviar-plus
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 |