electrum

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

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:
Melectrum/verifier.py | 17++++++++++-------
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: