faster spend_utxo

This commit is contained in:
Jack Robison 2021-07-24 14:29:01 -04:00 committed by Victor Shyba
parent c81c0d9480
commit 085ce1ff16

View file

@ -1327,27 +1327,22 @@ class BlockProcessor:
if cache_value: if cache_value:
return cache_value return cache_value
prefix = Prefixes.hashX_utxo.pack_partial_key(tx_hash[:4]) txin_num = self.db.transaction_num_mapping[tx_hash]
candidates = {db_key: hashX for db_key, hashX in self.db.db.iterator(prefix=prefix)} hdb_key = Prefixes.hashX_utxo.pack_key(tx_hash[:4], txin_num, nout)
for hdb_key, hashX in candidates.items(): hashX = self.db.db.get(hdb_key)
key = Prefixes.hashX_utxo.unpack_key(hdb_key) if hashX:
if len(candidates) > 1: udb_key = Prefixes.utxo.pack_key(hashX, txin_num, nout)
hash = self.db.total_transactions[key.tx_num]
if hash != tx_hash:
assert hash is not None # Should always be found
continue
if key.nout != nout:
continue
udb_key = Prefixes.utxo.pack_key(hashX, key.tx_num, nout)
utxo_value_packed = self.db.db.get(udb_key) utxo_value_packed = self.db.db.get(udb_key)
if utxo_value_packed is None: if utxo_value_packed is None:
self.logger.warning( self.logger.warning(
"%s:%s is not found in UTXO db for %s", hash_to_hex_str(tx_hash), nout, hash_to_hex_str(hashX) "%s:%s is not found in UTXO db for %s", hash_to_hex_str(tx_hash), nout, hash_to_hex_str(hashX)
) )
raise ChainError(f"{hash_to_hex_str(tx_hash)}:{nout} is not found in UTXO db for {hash_to_hex_str(hashX)}") raise ChainError(
f"{hash_to_hex_str(tx_hash)}:{nout} is not found in UTXO db for {hash_to_hex_str(hashX)}"
)
# Remove both entries for this UTXO # Remove both entries for this UTXO
self.touched_hashXs.add(hashX) self.touched_hashXs.add(hashX)
self.db_op_stack.extend([ self.db_op_stack.extend_ops([
RevertableDelete(hdb_key, hashX), RevertableDelete(hdb_key, hashX),
RevertableDelete(udb_key, utxo_value_packed) RevertableDelete(udb_key, utxo_value_packed)
]) ])