From 7f3b627aa4d9e55e25a445de47b5badd9ed5d304 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 27 Jan 2018 17:33:26 +0100 Subject: [PATCH] make wallet.get_address_index faster by storing an addr->index dict --- gui/qt/main_window.py | 2 ++ lib/wallet.py | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index fb66005e..59367321 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -62,6 +62,7 @@ from .fee_slider import FeeSlider from .util import * +from electrum.util import profiler class StatusBarButton(QPushButton): def __init__(self, icon, tooltip, func): @@ -325,6 +326,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.print_error('close_wallet', self.wallet.storage.path) run_hook('close_wallet', self.wallet) + @profiler def load_wallet(self, wallet): wallet.thread = TaskThread(self, self.on_error) self.wallet = wallet diff --git a/lib/wallet.py b/lib/wallet.py index a9dc646b..11337bc9 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -340,6 +340,8 @@ class Abstract_Wallet(PrintError): return address in self.change_addresses def get_address_index(self, address): + if hasattr(self, '_addr_to_addr_index'): + return self._addr_to_addr_index[address] if address in self.receiving_addresses: return False, self.receiving_addresses.index(address) if address in self.change_addresses: @@ -1029,8 +1031,10 @@ class Abstract_Wallet(PrintError): def is_used(self, address): h = self.history.get(address,[]) + if len(h) == 0: + return False c, u, x = self.get_addr_balance(address) - return len(h) > 0 and c + u + x == 0 + return c + u + x == 0 def is_empty(self, address): c, u, x = self.get_addr_balance(address) @@ -1647,6 +1651,14 @@ class Deterministic_Wallet(Abstract_Wallet): if n > nmax: nmax = n return nmax + 1 + def load_addresses(self): + super().load_addresses() + self._addr_to_addr_index = {} # key: address, value: (is_change, index) + for i, addr in enumerate(self.receiving_addresses): + self._addr_to_addr_index[addr] = (False, i) + for i, addr in enumerate(self.change_addresses): + self._addr_to_addr_index[addr] = (True, i) + def create_new_address(self, for_change=False): assert type(for_change) is bool addr_list = self.change_addresses if for_change else self.receiving_addresses @@ -1654,6 +1666,7 @@ class Deterministic_Wallet(Abstract_Wallet): x = self.derive_pubkeys(for_change, n) address = self.pubkeys_to_address(x) addr_list.append(address) + self._addr_to_addr_index[address] = (for_change, n) self.save_addresses() self.add_address(address) return address @@ -1685,12 +1698,11 @@ class Deterministic_Wallet(Abstract_Wallet): def is_beyond_limit(self, address, is_change): addr_list = self.get_change_addresses() if is_change else self.get_receiving_addresses() - i = addr_list.index(address) - prev_addresses = addr_list[:max(0, i)] + i = self.get_address_index(address)[1] limit = self.gap_limit_for_change if is_change else self.gap_limit - if len(prev_addresses) < limit: + if i < limit: return False - prev_addresses = prev_addresses[max(0, i - limit):] + prev_addresses = addr_list[max(0, i - limit):max(0, i)] for addr in prev_addresses: if self.history.get(addr): return False