Avoid change address reuse if possible

As discussed on #electrum yesterday.
Increase change gap limit to 6.
Choose the next unused change address, if any, otherwise pick
one at random from the gap limit.
This commit is contained in:
Neil Booth 2015-05-29 09:46:53 +09:00
parent 48f98f75db
commit 4eaff5678d
1 changed files with 14 additions and 7 deletions

View File

@ -142,7 +142,7 @@ class Abstract_Wallet(object):
def __init__(self, storage): def __init__(self, storage):
self.storage = storage self.storage = storage
self.electrum_version = ELECTRUM_VERSION self.electrum_version = ELECTRUM_VERSION
self.gap_limit_for_change = 3 # constant self.gap_limit_for_change = 6 # constant
# saved fields # saved fields
self.seed_version = storage.get('seed_version', NEW_SEED_VERSION) self.seed_version = storage.get('seed_version', NEW_SEED_VERSION)
self.use_change = storage.get('use_change',True) self.use_change = storage.get('use_change',True)
@ -887,10 +887,17 @@ class Abstract_Wallet(object):
# send change to one of the accounts involved in the tx # send change to one of the accounts involved in the tx
address = inputs[0].get('address') address = inputs[0].get('address')
account, _ = self.get_address_index(address) account, _ = self.get_address_index(address)
if not self.use_change or not self.accounts[account].has_change(): if self.use_change and self.accounts[account].has_change():
change_addr = address # New change addresses are created only after a few confirmations.
# Choose an unused change address if any, otherwise take one at random
change_addrs = self.accounts[account].get_addresses(1)[-self.gap_limit_for_change:]
for change_addr in change_addrs:
if self.get_num_tx(change_addr) == 0:
break
else: else:
change_addr = self.accounts[account].get_addresses(1)[-self.gap_limit_for_change] change_addr = random.choice(change_addrs)
else:
change_addr = address
# if change is above dust threshold, add a change output. # if change is above dust threshold, add a change output.
change_amount = total - ( amount + fee ) change_amount = total - ( amount + fee )