1
0

Speed up freezing and unfreezing of many addresses

Speedup mainly from writing to storage only once.
Make frozen_addresses a set in memory, as sets give cleaner
code and are more efficient.

Minor change in behaviour: command line freezing used to return
False if the address isn't in the wallet OR the address was already
frozen.  Now it returns more like a success code: it returns False
only if the address isn't in the wallet regardless of frozen state.
Similarly for unfreezing.
This commit is contained in:
Neil Booth
2015-05-31 10:37:43 +09:00
parent d6f4b57d64
commit 0f29984f07
4 changed files with 18 additions and 31 deletions

View File

@@ -322,10 +322,10 @@ class Commands:
return {'address':address, 'redeemScript':redeem_script}
def freeze(self,addr):
return self.wallet.freeze(addr)
return self.wallet.set_frozen_state([addr], True)
def unfreeze(self,addr):
return self.wallet.unfreeze(addr)
return self.wallet.set_frozen_state([addr], False)
def getprivatekeys(self, addr):
return self.wallet.get_private_key(addr, self.password)

View File

@@ -149,7 +149,7 @@ class Abstract_Wallet(object):
self.use_encryption = storage.get('use_encryption', False)
self.seed = storage.get('seed', '') # encrypted
self.labels = storage.get('labels', {})
self.frozen_addresses = storage.get('frozen_addresses',[])
self.frozen_addresses = set(storage.get('frozen_addresses',[]))
self.stored_height = storage.get('stored_height', 0) # last known height (for offline mode)
self.history = storage.get('addr_history',{}) # address -> list(txid, height)
@@ -1016,21 +1016,16 @@ class Abstract_Wallet(object):
def is_frozen(self, addr):
return addr in self.frozen_addresses
def freeze(self,addr):
if self.is_mine(addr) and self.is_frozen(addr):
self.frozen_addresses.append(addr)
self.storage.put('frozen_addresses', self.frozen_addresses, True)
def set_frozen_state(self, addrs, freeze):
'''Set frozen state of the addresses to FREEZE, True or False'''
if all(self.is_mine(addr) for addr in addrs):
if freeze:
self.frozen_addresses |= set(addrs)
else:
self.frozen_addresses -= set(addrs)
self.storage.put('frozen_addresses', list(self.frozen_addresses), True)
return True
else:
return False
def unfreeze(self,addr):
if self.is_mine(addr) and self.is_frozen(addr):
self.frozen_addresses.remove(addr)
self.storage.put('frozen_addresses', self.frozen_addresses, True)
return True
else:
return False
return False
def set_verifier(self, verifier):
self.verifier = verifier