Browse Source

wallet.try_detecting_internal_addresses_corruption: check more addrs

related https://github.com/spesmilo/electrum/issues/8202

For a HD wallet, instead of checking the first 10 addrs + 10 additional random ones,
we now check the first 10 addrs + 10 random used addrs + 10 random unused addrs.
Checking unused addresses is useful to prevent getting money sent there,
and checking used addresses is useful to inform people of already lost money.
master
SomberNight 3 years ago
parent
commit
8a53a3201c
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 27
      electrum/wallet.py

27
electrum/wallet.py

@ -3085,9 +3085,14 @@ class Imported_Wallet(Simple_Wallet):
@profiler
def try_detecting_internal_addresses_corruption(self):
# we check only a random sample, for performance
addresses = self.get_addresses()
addresses = random.sample(addresses, min(len(addresses), 10))
for addr_found in addresses:
addresses_all = self.get_addresses()
# some random *used* addresses (note: we likely have not synced yet)
addresses_used = [addr for addr in addresses_all if self.adb.is_used(addr)]
sample1 = random.sample(addresses_used, min(len(addresses_used), 10))
# some random *unused* addresses
addresses_unused = [addr for addr in addresses_all if not self.adb.is_used(addr)]
sample2 = random.sample(addresses_unused, min(len(addresses_unused), 10))
for addr_found in itertools.chain(sample1, sample2):
self.check_address_for_corruption(addr_found)
def check_address_for_corruption(self, addr):
@ -3167,12 +3172,16 @@ class Deterministic_Wallet(Abstract_Wallet):
@profiler
def try_detecting_internal_addresses_corruption(self):
addresses_all = self.get_addresses()
# sample 1: first few
addresses_sample1 = addresses_all[:10]
# sample2: a few more randomly selected
addresses_rand = addresses_all[10:]
addresses_sample2 = random.sample(addresses_rand, min(len(addresses_rand), 10))
for addr_found in itertools.chain(addresses_sample1, addresses_sample2):
# first few addresses
nfirst_few = 10
sample1 = addresses_all[:nfirst_few]
# some random *used* addresses (note: we likely have not synced yet)
addresses_used = [addr for addr in addresses_all[nfirst_few:] if self.adb.is_used(addr)]
sample2 = random.sample(addresses_used, min(len(addresses_used), 10))
# some random *unused* addresses
addresses_unused = [addr for addr in addresses_all[nfirst_few:] if not self.adb.is_used(addr)]
sample3 = random.sample(addresses_unused, min(len(addresses_unused), 10))
for addr_found in itertools.chain(sample1, sample2, sample3):
self.check_address_for_corruption(addr_found)
def check_address_for_corruption(self, addr):

Loading…
Cancel
Save