electrum

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

commit ab94a47b8e5a84fc9735e840903f728f30d15d14
parent 1635bc8cb3aa217668c3ed60a9b6b60b98909eaf
Author: SomberNight <somber.night@protonmail.com>
Date:   Sun, 16 Sep 2018 06:09:14 +0200

network: mv request_chunk to interface

this is a bugfix: the old code always tried to connect the chunk to
network.blockchain(). the correct behaviour is to connect to the
blockchain of the interface.

Diffstat:
Melectrum/interface.py | 23++++++++++++++++++++---
Melectrum/network.py | 22++--------------------
2 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/electrum/interface.py b/electrum/interface.py @@ -142,6 +142,7 @@ class Interface(PrintError): self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) self.blockchain = None + self._requested_chunks = set() self.network = network self._set_proxy(proxy) @@ -317,9 +318,25 @@ class Interface(PrintError): res = await self.session.send_request('blockchain.block.header', [height], timeout=timeout) return blockchain.deserialize_header(bytes.fromhex(res), height) - async def request_chunk(self, start_height, tip): - self.print_error("requesting chunk from height {}".format(start_height)) - return await self.network.request_chunk(start_height, tip, self.session) + async def request_chunk(self, height, tip=None, *, can_return_early=False): + index = height // 2016 + if can_return_early and index in self._requested_chunks: + return + self.print_error("requesting chunk from height {}".format(height)) + size = 2016 + if tip is not None: + size = min(size, tip - index * 2016) + size = max(size, 0) + try: + self._requested_chunks.add(index) + res = await self.session.send_request('blockchain.block.headers', [index * 2016, size]) + finally: + try: self._requested_chunks.remove(index) + except KeyError: pass + conn = self.blockchain.connect_chunk(index, res['hex']) + if not conn: + return conn, 0 + return conn, res['count'] async def open_session(self, sslc, exit_early): header_queue = asyncio.Queue() diff --git a/electrum/network.py b/electrum/network.py @@ -223,7 +223,6 @@ class Network(PrintError): self.interfaces = {} # note: needs self.interface_lock self.auto_connect = self.config.get('auto_connect', True) self.connecting = set() - self.requested_chunks = set() self.server_queue = None self.server_queue_group = None self.asyncio_loop = asyncio.get_event_loop() @@ -700,25 +699,8 @@ class Network(PrintError): return False, "error: " + out return True, out - async def request_chunk(self, height, tip, session=None, can_return_early=False): - if session is None: session = self.interface.session - index = height // 2016 - if can_return_early and index in self.requested_chunks: - return - size = 2016 - if tip is not None: - size = min(size, tip - index * 2016) - size = max(size, 0) - try: - self.requested_chunks.add(index) - res = await session.send_request('blockchain.block.headers', [index * 2016, size]) - finally: - try: self.requested_chunks.remove(index) - except KeyError: pass - conn = self.blockchain().connect_chunk(index, res['hex']) - if not conn: - return conn, 0 - return conn, res['count'] + async def request_chunk(self, height, tip=None, *, can_return_early=False): + return await self.interface.request_chunk(height, tip=tip, can_return_early=can_return_early) @with_interface_lock def blockchain(self):