URI: 
       trevert 175bfae9e6f26968c0c89e0de1852b75115c232b. store last known height in wallet instead - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 233fd8ed77b92204e5edac175bfd5fb31c2cb204
   DIR parent 1d517abf39b1c521d838ac1e1e0ea90e19db4bed
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Fri,  8 May 2015 13:43:42 +0200
       
       revert 175bfae9e6f26968c0c89e0de1852b75115c232b. store last known height in wallet instead
       
       Diffstat:
         M lib/blockchain.py                   |      29 ++++++++++++++++++++---------
         M lib/network.py                      |       2 +-
         M lib/simple_config.py                |      19 ++-----------------
         M lib/wallet.py                       |       7 ++++---
       
       4 files changed, 27 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/lib/blockchain.py b/lib/blockchain.py
       t@@ -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:
       t@@ -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
       t@@ -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()
       t@@ -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')
       t@@ -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()
       t@@ -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!
       t@@ -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:
   DIR diff --git a/lib/network.py b/lib/network.py
       t@@ -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()
   DIR diff --git a/lib/simple_config.py b/lib/simple_config.py
       t@@ -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
       t@@ -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):
       t@@ -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
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -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))
       t@@ -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. """
       t@@ -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