build reverse history index, to know when a transaction can be removed
This commit is contained in:
parent
616becd9a8
commit
65e7667eba
|
@ -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:
|
||||
# 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)
|
||||
|
||||
# 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
|
||||
|
||||
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:
|
||||
|
|
Loading…
Reference in New Issue