Skip to content

Commit

Permalink
Merge pull request spesmilo#285 from zebra-lucky/fix_tx_deltas_cache
Browse files Browse the repository at this point in the history
address_synchronizer: add _tx_deltas_related_txs (fix spesmilo#282)
  • Loading branch information
akhavr committed Aug 16, 2021
2 parents d673120 + 6f62b5a commit b41b74c
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion electrum_dash/address_synchronizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ def __init__(self, db: 'WalletDB'):
self.protx_manager = ProTxManager(self)

self._addrs_with_coins_cache = set()
self._tx_deltas_cache = defaultdict(int)
self._tx_deltas_cache = defaultdict(int) # txid -> delta
self._tx_deltas_related_txs = defaultdict(set) # addr -> set(txids)
self._get_addr_balance_cache = {}

self.load_and_cleanup()
Expand Down Expand Up @@ -546,16 +547,31 @@ def update_tx_deltas_cache_on_tx(self, txid, tx, *, is_added):
if not is_added:
return
mine_addrs = set()
if not tx:
tx = self.db.get_transaction(txid)
if not tx:
return
for txin in tx.inputs():
addr = self.get_txin_address(txin)
if not addr:
prevout_hash = txin.prevout.txid.hex()
if (prevout_hash in self.unverified_tx
or prevout_hash in self.db.verified_tx):
self._tx_deltas_related_txs[prevout_hash].add(txid)
continue
if self.is_mine(addr):
mine_addrs.add(addr)
for o in tx.outputs():
addr = o.address
if not addr:
continue
if self.is_mine(addr):
mine_addrs.add(addr)
for addr in mine_addrs:
self._tx_deltas_cache[txid] += self.get_tx_delta(txid, addr)
related = self._tx_deltas_related_txs.pop(txid, [])
for rtxid in related:
self.update_tx_deltas_cache_on_tx(rtxid, None, is_added=True)

def is_addr_with_coins(self, addr, local_height):
addr_outputs = self.get_addr_outputs(addr)
Expand Down Expand Up @@ -600,6 +616,7 @@ def clear_history(self):
self._history_local.clear()
self._get_addr_balance_cache = {} # invalidate cache
self._tx_deltas_cache = defaultdict(int)
self._tx_deltas_related_txs = defaultdict(set)
self._addrs_with_coins_cache = set()

def get_txpos(self, tx_hash, islock):
Expand Down

0 comments on commit b41b74c

Please sign in to comment.