def unserialize(data, as_coinbase=False): k = len(data) tr = Transaction() tr.version = struct.unpack('<L', data[:4])[0] num_inputs, data = Bitcoin.unserialize_variable_int(data[4:]) for i in range(num_inputs): txn_input, data = TransactionInput.unserialize(data, as_coinbase=as_coinbase) tr.inputs.append(txn_input) num_outputs, data = Bitcoin.unserialize_variable_int(data) for i in range(num_outputs): try: txn_output, data = TransactionOutput.unserialize(data) except: raise tr.outputs.append(txn_output) tr.lock_time = struct.unpack("<L", data[:4])[0] tr.real_size = k - len(data) + 4 if any(i.signed and (i.signed_hash_type & SIGHASH_ANYONECANPAY) != 0 for i in tr.inputs): tr.type = Transaction.TRANSACTION_TYPE_PAYMENT_ANYONECANPAY return tr, data[4:]
def unserialize(data): txn_output = TransactionOutput() txn_output.amount = struct.unpack("<Q", data[:8])[0] script_size, data = Bitcoin.unserialize_variable_int(data[8:]) txn_output.scriptPubKey, data = Script.unserialize(data, script_size) txn_output.extractAddressFromOutputScript() return txn_output, data
def handle_addr(self, payload): count, payload = Bitcoin.unserialize_variable_int(payload) for i in range(min(count, 100)): addr, services, when, payload = Bitcoin.unserialize_network_address( payload, with_timestamp=self.peer_version >= 31402) self.bitcoin_network.discovered_peer_address( '{}:{}'.format(*addr), when, services)
def unserialize(data, as_coinbase=False): txn_input = TransactionInput() txn_input.tx_hash = data[:32] txn_input.n = struct.unpack("<L", data[32:36])[0] script_size, data = Bitcoin.unserialize_variable_int(data[36:]) txn_input.scriptSig, data = Script.unserialize(data, script_size, as_coinbase=as_coinbase) txn_input.extractAddressFromInputScript() txn_input.sequence = struct.unpack("<L", data[:4])[0] return txn_input, data[4:]
def handle_inv(self, payload): count, payload = Bitcoin.unserialize_variable_int(payload) for i in range(count): inv, payload = Bitcoin.unserialize_inv(payload) if inv['type'] == BitcoinNetwork.MSG_ERROR: continue elif inv['type'] == BitcoinNetwork.MSG_TX: #print('got inv for tx {}'.format(Bitcoin.bytes_to_hexstring(inv['hash']))) self.known_transactions.add((inv['hash'], time.time())) elif inv['type'] == BitcoinNetwork.MSG_BLOCK: #print('got inv for block {}'.format(Bitcoin.bytes_to_hexstring(inv['hash']))) pass
def handle_inv(self, payload): count, payload = Bitcoin.unserialize_variable_int(payload) for i in range(count): inv, payload = Bitcoin.unserialize_inv(payload) if inv['type'] == BitcoinNetwork.MSG_ERROR: continue elif inv['type'] == BitcoinNetwork.MSG_TX: #print('got inv for tx {}'.format(Bitcoin.bytes_to_hexstring(inv['hash']))) self.known_transactions.add((inv['hash'], time.time())) elif inv['type'] == BitcoinNetwork.MSG_BLOCK: #print('got inv for block {}'.format(Bitcoin.bytes_to_hexstring(inv['hash']))) pass
def handle_addr(self, payload): count, payload = Bitcoin.unserialize_variable_int(payload) for i in range(min(count, 100)): addr, services, when, payload = Bitcoin.unserialize_network_address(payload, with_timestamp=self.peer_version >= 31402) self.bitcoin_network.discovered_peer_address('{}:{}'.format(*addr), when, services)