commit 1b95cced5d9251919b98f2a116bc79caaaf9f8bc
parent e5e3ac0364a9eefcef8ad6c6cfe4a14e2e6a9b6b
Author: SomberNight <somber.night@protonmail.com>
Date: Mon, 17 Sep 2018 18:31:25 +0200
verifier: perf optimisations
blockchain.read_header is expensive. do cheap tests first
on a wallet with 11k txns, that is synced except for spv proofs,
finishing sync now takes 80 sec instead of 180 sec
Diffstat:
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/electrum/verifier.py b/electrum/verifier.py
@@ -70,19 +70,22 @@ class SPV(PrintError):
unverified = self.wallet.get_unverified_txs()
for tx_hash, tx_height in unverified.items():
- # do not request merkle branch before headers are available
+ # do not request merkle branch if we already requested it
+ if tx_hash in self.requested_merkle or tx_hash in self.merkle_roots:
+ continue
+ # or before headers are available
if tx_height <= 0 or tx_height > local_height:
continue
-
+ # if it's in the checkpoint region, we still might not have the header
header = blockchain.read_header(tx_height)
if header is None:
if tx_height < constants.net.max_checkpoint():
await 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)
- self.requested_merkle.add(tx_hash)
- await group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height)
+ continue
+ # request now
+ self.print_error('requested merkle', tx_hash)
+ self.requested_merkle.add(tx_hash)
+ await group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height)
async def _request_and_verify_single_proof(self, tx_hash, tx_height):
try: