tfix auto-connect: do not use a random interface - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 59bc22085627c2ffe21cfb021f59064a8fad814e DIR parent 8c6866fb910b9f54056bdf97796c293e505d2227 HTML Author: ThomasV <thomasv@electrum.org> Date: Sun, 26 Mar 2017 20:22:30 +0200 fix auto-connect: do not use a random interface Diffstat: M lib/network.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) --- DIR diff --git a/lib/network.py b/lib/network.py t@@ -227,9 +227,7 @@ class Network(util.DaemonThread): self.banner = '' self.donation_address = '' self.relay_fee = None - self.heights = {} - self.merkle_roots = {} - self.utxo_roots = {} + self.headers = {} # callbacks passed with subscriptions self.subscriptions = defaultdict(list) self.sub_cache = {} t@@ -297,7 +295,8 @@ class Network(util.DaemonThread): pass def get_server_height(self): - return self.heights.get(self.default_server, 0) + h = self.headers.get(self.default_server) + return h['block_height'] if h else 0 def server_is_lagging(self): sh = self.get_server_height() t@@ -494,7 +493,12 @@ class Network(util.DaemonThread): if suggestion and self.protocol == deserialize_server(suggestion)[2]: self.switch_to_interface(suggestion) else: - self.switch_to_random_interface() + # switch to one that has the correct header (not height) + header = self.get_header(self.get_local_height()) + filtered = map(lambda x:x[0], filter(lambda x: x[1]==header, self.headers.items())) + if filtered: + choice = random.choice(filtered) + self.switch_to_interface(choice) def switch_to_interface(self, server): '''Switch to server as our interface. If no connection exists nor t@@ -676,7 +680,7 @@ class Network(util.DaemonThread): self.set_status('disconnected') if server in self.interfaces: self.close_interface(self.interfaces[server]) - self.heights.pop(server, None) + self.headers.pop(server, None) self.notify('interfaces') def new_interface(self, server, socket): t@@ -857,9 +861,7 @@ class Network(util.DaemonThread): height = header.get('block_height') if not height: return - self.heights[i.server] = height - self.merkle_roots[i.server] = header.get('merkle_root') - self.utxo_roots[i.server] = header.get('utxo_root') + self.headers[i.server] = header # Queue this interface's height for asynchronous catch-up self.bc_requests.append((i, {'if_height': height}))