build reverse history index, to know when a transaction can be removed

This commit is contained in:
ThomasV 2015-07-02 16:07:04 +02:00
parent 616becd9a8
commit 65e7667eba
1 changed files with 23 additions and 12 deletions

View File

@ -163,6 +163,7 @@ class Abstract_Wallet(object):
self.load_accounts()
self.load_transactions()
self.build_reverse_history()
# load requests
self.receive_requests = self.storage.get('payment_requests', {})
@ -217,8 +218,20 @@ class Abstract_Wallet(object):
self.txi = {}
self.txo = {}
self.pruned_txo = {}
self.history = {}
self.save_transactions()
with self.lock:
self.history = {}
self.tx_addr_hist = {}
self.storage.put('addr_history', self.history, True)
@profiler
def build_reverse_history(self):
self.tx_addr_hist = {}
for addr, hist in self.history.items():
for tx_hash, h in hist:
s = self.tx_addr_hist.get(tx_hash, set())
s.add(addr)
self.tx_addr_hist[tx_hash] = s
# wizard action
def get_action(self):
@ -746,23 +759,21 @@ class Abstract_Wallet(object):
old_hist = self.history.get(addr, [])
for tx_hash, height in old_hist:
if (tx_hash, height) not in hist:
self.remove_transaction(tx_hash, height)
# fix: maybe remove only at the end, tx that have only unspent outputs
# bug: if tx is used by many addresses, not clear what we should do..
# we should remove tx iff it is completely unreferenced
# note about balance bug: on fist sync, it downloaded a lot of new tx, and I had a wrong balance.
# after one reconnection it was fixed. (probably after changing server, going from pruned to long)
# this could be related to the 'download missing tx' behaviour, that kicks in on startup
# remove tx if it's not referenced in histories
self.tx_addr_hist[tx_hash].remove(addr)
if not self.tx_addr_hist[tx_hash]:
self.remove_transaction(tx_hash, height)
self.history[addr] = hist
self.storage.put('addr_history', self.history, True)
for tx_hash, tx_height in hist:
# add it in case it was previously unconfirmed
self.add_unverified_tx (tx_hash, tx_height)
self.add_unverified_tx(tx_hash, tx_height)
# add reference in tx_addr_hist
s = self.tx_addr_hist.get(tx_hash, set())
s.add(addr)
self.tx_addr_hist[tx_hash] = s
# if addr is new, we have to recompute txi and txo
tx = self.transactions.get(tx_hash)
if tx is not None and self.txi.get(tx_hash, {}).get(addr) is None and self.txo.get(tx_hash, {}).get(addr) is None: