Ejemplo n.º 1
0
    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:]
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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:]
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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)