Browse Source

verifier: don't try to request same chunk multiple times

3.3.3.1
SomberNight 6 years ago
parent
commit
77d86f074f
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 11
      electrum/network.py
  2. 2
      electrum/verifier.py

11
electrum/network.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

2
electrum/verifier.py

@ -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)

Loading…
Cancel
Save