verifier: don't try to request same chunk multiple times
This commit is contained in:
parent
b33b2c0945
commit
77d86f074f
@ -751,14 +751,21 @@ class Network(PrintError):
|
|||||||
return False, "error: " + out
|
return False, "error: " + out
|
||||||
return True, 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
|
if session is None: session = self.interface.session
|
||||||
index = height // 2016
|
index = height // 2016
|
||||||
|
if can_return_early and index in self.requested_chunks:
|
||||||
|
return
|
||||||
size = 2016
|
size = 2016
|
||||||
if tip is not None:
|
if tip is not None:
|
||||||
size = min(size, tip - index * 2016)
|
size = min(size, tip - index * 2016)
|
||||||
size = max(size, 0)
|
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'])
|
conn = self.blockchain().connect_chunk(index, res['hex'])
|
||||||
if not conn:
|
if not conn:
|
||||||
return conn, 0
|
return conn, 0
|
||||||
|
|||||||
@ -70,7 +70,7 @@ class SPV(ThreadJob):
|
|||||||
if header is None:
|
if header is None:
|
||||||
index = tx_height // 2016
|
index = tx_height // 2016
|
||||||
if index < len(blockchain.checkpoints):
|
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
|
elif (tx_hash not in self.requested_merkle
|
||||||
and tx_hash not in self.merkle_roots):
|
and tx_hash not in self.merkle_roots):
|
||||||
self.print_error('requested merkle', tx_hash)
|
self.print_error('requested merkle', tx_hash)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user