예제 #1
0
def process_new_txos(message):
    try:
        serialized_utxos = bytes(message["txos"])
        txos_hashes = bytes(message["txos_hashes"])
        num = message["num"]
        #txos_hashes = [txos_hashes[i*65:(i+1)*65)] for i in range(0,num)]
        txos_lengths = message["txos_lengths"]
        #TODO we should use txos_hashes and txos_lengths to proccess only unknown txos
        for i in range(num):
            utxo = IOput()
            serialized_utxos = utxo.deserialize_raw(serialized_utxos)
            storage_space.txos_storage.mempool[utxo.serialized_index] = utxo
        storage_space.blockchain.update(reason="downloaded new txos")
    except Exception as e:
        raise e  #XXX "DoS messages should be returned"
예제 #2
0
def process_new_txos(message, wtx, core):
    try:
        serialized_utxos = bytes(message["txos"])
        txos_hashes = bytes(message["txos_hashes"])
        num = message["num"]
        txos_lengths = message["txos_lengths"]
        txos_hashes = [txos_hashes[i * 65:(i + 1) * 65] for i in range(0, num)]
        txos_lengths = [
            int.from_bytes(txos_lengths[i * 2:(i + 1) * 2], "big")
            for i in range(0, num)
        ]
        for i in range(num):
            txo_len, txo_hash = txos_lengths[i], txos_hashes[i]
            if txo_hash in core.storage_space.txos_storage.mempool:
                serialized_utxos = serialized_utxos[txo_len:]
                continue
            utxo = IOput()
            serialized_utxos = utxo.deserialize_raw(serialized_utxos)
            core.storage_space.txos_storage.mempool[
                utxo.serialized_index] = utxo
        core.storage_space.blockchain.update(wtx=wtx,
                                             reason="downloaded new txos")
    except Exception as e:
        raise DOSException()  #TODO add info
예제 #3
0
    def deserialize_raw(self, serialized, storage_space=None):
        if len(serialized) < 1:
            raise Exception("Not enough bytes for tx skeleton version marker")
        serialized, ser_version = serialized[1:], serialized[0]
        rich_format = ser_version & 1
        self.version = ser_version >> 1
        if not self.version in [0]:
            raise Exception("Unknown tx_sceleton version")
        if len(serialized) < 2:
            raise Exception("Not enough bytes for tx skeleton inputs len")
        serialized, _len_i = serialized[2:], int.from_bytes(
            serialized[:2], "big")
        if len(serialized) < 2:
            raise Exception("Not enough bytes for tx skeleton outputs len")
        serialized, _len_o = serialized[2:], int.from_bytes(
            serialized[:2], "big")

        if len(serialized) < 2:
            raise Exception(
                "Not enough bytes for tx skeleton additional excesses len")
        serialized, _len_ae = serialized[2:], int.from_bytes(
            serialized[:2], "big")

        serialized_index_len = IOput().index_len
        for i in range(_len_i):
            if len(serialized) < serialized_index_len:
                raise Exception(
                    "Not enough bytes for tx skeleton' input index %d len" % i)
            _input_index, serialized = serialized[:
                                                  serialized_index_len], serialized[
                                                      serialized_index_len:]
            self.input_indexes.append(_input_index)
        for i in range(_len_o):
            if len(serialized) < serialized_index_len:
                raise Exception(
                    "Not enough bytes for tx skeleton' output index %d len" %
                    i)
            _output_index, serialized = serialized[:
                                                   serialized_index_len], serialized[
                                                       serialized_index_len:]
            self.output_indexes.append(_output_index)

        for i in range(_len_o):
            if len(serialized) < 4:
                raise Exception(
                    "Not enough bytes for tx skeleton' output relay fee %d len"
                    % i)
            ser_relay_fee, serialized = serialized[:4], serialized[4:]
            self.output_relay_fees.append(int.from_bytes(ser_relay_fee, "big"))

        for i in range(_len_ae):
            e = Excess()
            serialized = e.deserialize_raw(serialized)
            self.additional_excesses.append(e)
        for i in range(_len_i):
            e = Excess()
            serialized = e.deserialize_raw(serialized)
            self.updated_excesses[self.input_indexes[i]] = e
        if len(serialized) < 32:
            raise Exception("Not enough bytes for mixer offset")
        self.mixer_offset, serialized = int.from_bytes(serialized[:32],
                                                       "big"), serialized[32:]

        if not self.verify():
            #TODO consider renmaing verify to validate_excesses or make exception text more general
            raise Exception("Additional excesses are not signed properly")

        if rich_format and storage_space:
            txouts_num_serialized, serialized = serialized[:2], serialized[2:]
            txouts_num = int.from_bytes(txouts_num_serialized, "big")
            for _ in range(txouts_num):
                output = IOput()
                serialized = output.deserialize_raw(serialized)
                if not (output.serialized_index in self.output_indexes):
                    raise Exception("Unknown output in rich txskel data")
                storage_space.txos_storage.mempool[
                    output.serialized_index] = output

        return serialized
예제 #4
0
    def deserialize_raw(self, serialized, storage_space=None):
        if len(serialized) < 1:
            raise Exception(
                "Not enough bytes for tx skeleton rich format marker")
        serialized, rich_format = serialized[1:], bool(serialized[0])
        if len(serialized) < 2:
            raise Exception("Not enough bytes for tx skeleton inputs len")
        serialized, _len_i = serialized[2:], int.from_bytes(
            serialized[:2], "big")
        if len(serialized) < 2:
            raise Exception("Not enough bytes for tx skeleton outputs len")
        serialized, _len_o = serialized[2:], int.from_bytes(
            serialized[:2], "big")

        if len(serialized) < 2:
            raise Exception(
                "Not enough bytes for tx skeleton additional excesses len")
        serialized, _len_ae = serialized[2:], int.from_bytes(
            serialized[:2], "big")

        serialized_index_len = IOput().index_len
        for i in range(_len_i):
            if len(serialized) < serialized_index_len:
                raise Exception(
                    "Not enough bytes for tx skeleton' input index %d len" % i)
            _input_index, serialized = serialized[:
                                                  serialized_index_len], serialized[
                                                      serialized_index_len:]
            self.input_indexes.append(_input_index)
        for i in range(_len_o):
            if len(serialized) < serialized_index_len:
                raise Exception(
                    "Not enough bytes for tx skeleton' output index %d len" %
                    i)
            _output_index, serialized = serialized[:
                                                   serialized_index_len], serialized[
                                                       serialized_index_len:]
            self.output_indexes.append(_output_index)

        for i in range(_len_ae):
            e = Excess()
            serialized = e.deserialize_raw(serialized)
            self.additional_excesses.append(e)

        if not self.verify():
            #TODO consider renmaing verify to validate_excesses or make exception text more general
            raise Exception("Additional excesses are not signed properly")

        if rich_format and storage_space:
            txouts_num_serialized, serialized = serialized[:2], serialized[2:]
            txouts_num = int.from_bytes(txouts_num_serialized, "big")
            for _ in range(txouts_num):
                output = IOput()
                serialized = output.deserialize_raw(serialized)
                if not (output.serialized_index in self.output_indexes):
                    raise Exception("Unknown output in rich txskel data")
                storage_space.txos_storage.mempool[
                    output.serialized_index] = output

        if not GLOBAL_TEST['skip combined excesses']:
            raise NotImplemented
        return serialized