electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 233fd8ed77b92204e5edac175bfd5fb31c2cb204
parent 1d517abf39b1c521d838ac1e1e0ea90e19db4bed
Author: ThomasV <thomasv@gitorious>
Date:   Fri,  8 May 2015 13:43:42 +0200

revert 175bfae9e6f26968c0c89e0de1852b75115c232b. store last known height in wallet instead

Diffstat:
Mlib/blockchain.py | 29++++++++++++++++++++---------
Mlib/network.py | 2+-
Mlib/simple_config.py | 19++-----------------
Mlib/wallet.py | 7++++---
4 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/lib/blockchain.py b/lib/blockchain.py @@ -32,10 +32,15 @@ class Blockchain(util.DaemonThread): self.lock = threading.Lock() self.headers_url = 'http://headers.electrum.org/blockchain_headers' self.queue = Queue.Queue() + self.local_height = 0 + self.set_local_height() + + def height(self): + return self.local_height def run(self): self.init_headers_file() - self.print_error("%d blocks" % self.config.height) + self.print_error("%d blocks" % self.local_height) while self.is_running(): try: @@ -48,12 +53,12 @@ class Blockchain(util.DaemonThread): if not header: continue height = header.get('block_height') - if height <= self.config.height: + if height <= self.local_height: continue - if height > self.config.height + 50: + if height > self.local_height + 50: if not self.get_and_verify_chunks(i, header, height): continue - if height > self.config.height: + if height > self.local_height: # get missing parts from interface (until it connects to my chain) chain = self.get_chain( i, header ) # skip that server if the result is not consistent @@ -155,7 +160,7 @@ class Blockchain(util.DaemonThread): return rev_hex(Hash(self.header_to_string(header).decode('hex')).encode('hex')) def path(self): - return self.config.headers_filename() + return os.path.join(self.config.path, 'blockchain_headers') def init_headers_file(self): filename = self.path() @@ -178,7 +183,7 @@ class Blockchain(util.DaemonThread): f.seek(index*2016*80) h = f.write(chunk) f.close() - self.config.refresh_height() + self.set_local_height() def save_header(self, header): data = self.header_to_string(header).decode('hex') @@ -189,7 +194,14 @@ class Blockchain(util.DaemonThread): f.seek(height*80) h = f.write(data) f.close() - self.config.refresh_height() + self.set_local_height() + + def set_local_height(self): + name = self.path() + if os.path.exists(name): + h = os.path.getsize(name)/80 - 1 + if self.local_height != h: + self.local_height = h def read_header(self, block_height): name = self.path() @@ -202,7 +214,6 @@ class Blockchain(util.DaemonThread): h = self.header_from_string(h) return h - def get_target(self, index, chain=None): if chain is None: chain = [] # Do not use mutables as default values! @@ -307,7 +318,7 @@ class Blockchain(util.DaemonThread): def get_and_verify_chunks(self, i, header, height): queue = Queue.Queue() - min_index = (self.config.height + 1)/2016 + min_index = (self.local_height + 1)/2016 max_index = (height + 1)/2016 n = min_index while n < max_index + 1: diff --git a/lib/network.py b/lib/network.py @@ -562,4 +562,4 @@ class Network(util.DaemonThread): return self.blockchain.read_header(tx_height) def get_local_height(self): - return self.config.height + return self.blockchain.height() diff --git a/lib/simple_config.py b/lib/simple_config.py @@ -71,16 +71,12 @@ class SimpleConfig(object): # update the current options with the command line options last (to # override both others). self.read_only_options.update(options) - # init path self.init_path() - # user config. self.user_config = read_user_config_function(self.path) - - self.refresh_height() - - set_config(self) # Make a singleton instance of 'self' + # Make a singleton instance of 'self' + set_config(self) def init_path(self): # Read electrum path in the command line configuration @@ -106,7 +102,6 @@ class SimpleConfig(object): self.user_config[key] = value if save: self.save_user_config() - return def get(self, key, default=None): @@ -124,16 +119,6 @@ class SimpleConfig(object): return False return True - def headers_filename(self): - return os.path.join(self.path, 'blockchain_headers') - - def refresh_height(self): - name = self.headers_filename() - if os.path.exists(name): - self.height = os.path.getsize(name) / 80 - 1 - else: - self.height = 0 - def save_user_config(self): if not self.path: return diff --git a/lib/wallet.py b/lib/wallet.py @@ -139,6 +139,7 @@ class Abstract_Wallet(object): self.seed = storage.get('seed', '') # encrypted self.labels = storage.get('labels', {}) self.frozen_addresses = 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) self.fee_per_kb = int(storage.get('fee_per_kb', RECOMMENDED_FEE)) @@ -397,9 +398,8 @@ class Abstract_Wallet(object): return txs def get_local_height(self): - """ todo: fetch height in offline mode """ - return self.network.get_local_height() if self.network else 0 - + """ return last known height if we are offline """ + return self.network.get_local_height() if self.network else self.stored_height def get_confirmations(self, tx): """ return the number of confirmations of a monitored transaction. """ @@ -1088,6 +1088,7 @@ class Abstract_Wallet(object): if self.network: self.verifier.stop() self.synchronizer.stop() + self.storage.put('stored_height', self.get_local_height(), True) def restore(self, cb): pass