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"
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
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
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