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:
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