Browse Source
verifier: don't try to request same chunk multiple times
3.3.3.1
SomberNight
6 years ago
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
2 changed files with
10 additions and
3 deletions
-
electrum/network.py
-
electrum/verifier.py
|
|
@ -751,14 +751,21 @@ class Network(PrintError): |
|
|
|
return False, "error: " + out |
|
|
|
return True, out |
|
|
|
|
|
|
|
async def request_chunk(self, height, tip, session=None): |
|
|
|
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) |
|
|
|
res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) |
|
|
|
try: |
|
|
|
self.requested_chunks.add(index) |
|
|
|
res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) |
|
|
|
finally: |
|
|
|
try: self.requested_chunks.remove(index) |
|
|
|
except KeyError: pass |
|
|
|
conn = self.blockchain().connect_chunk(index, res['hex']) |
|
|
|
if not conn: |
|
|
|
return conn, 0 |
|
|
|
|
|
@ -70,7 +70,7 @@ class SPV(ThreadJob): |
|
|
|
if header is None: |
|
|
|
index = tx_height // 2016 |
|
|
|
if index < len(blockchain.checkpoints): |
|
|
|
await interface.group.spawn(self.network.request_chunk, tx_height, None) |
|
|
|
await interface.group.spawn(self.network.request_chunk(tx_height, None, can_return_early=True)) |
|
|
|
elif (tx_hash not in self.requested_merkle |
|
|
|
and tx_hash not in self.merkle_roots): |
|
|
|
self.print_error('requested merkle', tx_hash) |
|
|
|