tnetwork: request checkpoint when opening a new connection - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit d371e1c807f3cf8b0a65d03f470f104baf5416cc DIR parent f46b403a8d2ffc382d12b273932bd73d7127df03 HTML Author: ThomasV <thomasv@electrum.org> Date: Wed, 29 Mar 2017 17:21:18 +0200 network: request checkpoint when opening a new connection Diffstat: M lib/blockchain.py | 7 ++++++- M lib/network.py | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) --- DIR diff --git a/lib/blockchain.py b/lib/blockchain.py t@@ -54,12 +54,17 @@ class Blockchain(util.PrintError): t.daemon = True t.start() + def pass_checkpoint(self, header): + if header.get('block_height') != self.checkpoint_height: + return True + return self.hash_header(header) == self.checkpoint_hash + def verify_header(self, header, prev_header, bits, target): prev_hash = self.hash_header(prev_header) _hash = self.hash_header(header) if prev_hash != header.get('prev_block_hash'): raise BaseException("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash'))) - if self.checkpoint_height == header.get('block_height') and self.checkpoint_hash != _hash: + if not self.pass_checkpoint(header): raise BaseException('failed checkpoint') if self.checkpoint_height == header.get('block_height'): self.print_error("validated checkpoint", self.checkpoint_height) DIR diff --git a/lib/network.py b/lib/network.py t@@ -693,6 +693,7 @@ class Network(util.DaemonThread): def new_interface(self, server, socket): self.add_recent_server(server) self.interfaces[server] = interface = Interface(server, socket) + self.queue_request('blockchain.block.get_header', [self.blockchain.checkpoint_height], interface) self.queue_request('blockchain.headers.subscribe', [], interface) if server == self.default_server: self.switch_to_interface(server) t@@ -774,6 +775,11 @@ class Network(util.DaemonThread): def on_get_header(self, interface, response): '''Handle receiving a single block header''' + # close connection if header does not pass checkpoint + if not self.blockchain.pass_checkpoint(response['result']): + interface.print_error("header did not pass checkpoint, dismissing interface", interface.host) + self.connection_down(interface.server) + return if self.blockchain.downloading_headers: return if self.bc_requests: t@@ -790,7 +796,7 @@ class Network(util.DaemonThread): self.notify('updated') else: interface.print_error("header didn't connect, dismissing interface") - interface.close() + self.connection_down(interface.server) else: self.request_header(interface, data, next_height)