URI: 
       tlnworker: re-enable dns seeds for peer-finding bootstrap - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 59a428ea7f404545198ba975a371dceef06c2974
   DIR parent c986e522bfc254285ff0a43c9241cb97b61383f8
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Tue,  3 Mar 2020 20:12:12 +0100
       
       lnworker: re-enable dns seeds for peer-finding bootstrap
       
       but only for mainnet
       
       Diffstat:
         M electrum/constants.py               |       6 +++---
         M electrum/lnworker.py                |      30 ++++++++++++++++++++----------
       
       2 files changed, 23 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/electrum/constants.py b/electrum/constants.py
       t@@ -124,9 +124,9 @@ class BitcoinTestnet(AbstractNet):
            XPUB_HEADERS_INV = inv_dict(XPUB_HEADERS)
            BIP44_COIN_TYPE = 1
            LN_REALM_BYTE = 1
       -    LN_DNS_SEEDS = [
       -        'test.nodes.lightning.directory.',
       -        'lseed.bitcoinstats.com.',
       +    LN_DNS_SEEDS = [  # TODO investigate this again
       +        #'test.nodes.lightning.directory.',  # times out.
       +        #'lseed.bitcoinstats.com.',  # ignores REALM byte and returns mainnet peers...
            ]
        
        
   DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py
       t@@ -19,6 +19,7 @@ from concurrent import futures
        
        import dns.resolver
        import dns.exception
       +from aiorpcx import run_in_thread
        
        from . import constants
        from . import keystore
       t@@ -270,17 +271,24 @@ class LNWorker(Logger):
                        #self.logger.info('taking random ln peer from our channel db')
                        return [peer]
        
       -        # TODO remove this. For some reason the dns seeds seem to ignore the realm byte
       -        # and only return mainnet nodes. so for the time being dns seeding is disabled:
       +        # getting desperate... let's try hardcoded fallback list of peers
                if constants.net in (constants.BitcoinTestnet, ):
       -            return [random.choice(FALLBACK_NODE_LIST_TESTNET)]
       +            fallback_list = FALLBACK_NODE_LIST_TESTNET
                elif constants.net in (constants.BitcoinMainnet, ):
       -            return [random.choice(FALLBACK_NODE_LIST_MAINNET)]
       +            fallback_list = FALLBACK_NODE_LIST_MAINNET
                else:
       -            return []
       +            return []  # regtest??
       +
       +        fallback_list = [peer for peer in fallback_list if peer not in self._last_tried_peer]
       +        if fallback_list:
       +            return [random.choice(fallback_list)]
       +
       +        # last resort: try dns seeds (BOLT-10)
       +        return await run_in_thread(self._get_peers_from_dns_seeds)
        
       -        # try peers from dns seed.
       -        # return several peers to reduce the number of dns queries.
       +    def _get_peers_from_dns_seeds(self) -> Sequence[LNPeerAddr]:
       +        # NOTE: potentially long blocking call, do not run directly on asyncio event loop.
       +        # Return several peers to reduce the number of dns queries.
                if not constants.net.LN_DNS_SEEDS:
                    return []
                dns_seed = random.choice(constants.net.LN_DNS_SEEDS)
       t@@ -291,6 +299,7 @@ class LNWorker(Logger):
                    srv_answers = resolve_dns_srv('r{}.{}'.format(
                        constants.net.LN_REALM_BYTE, dns_seed))
                except dns.exception.DNSException as e:
       +            self.logger.info(f'failed querying (1) dns seed "{dns_seed}" for ln peers: {repr(e)}')
                    return []
                random.shuffle(srv_answers)
                num_peers = 2 * NUM_PEERS_TARGET
       t@@ -301,7 +310,8 @@ class LNWorker(Logger):
                    try:
                        # note: this might block for several seconds
                        answers = dns.resolver.query(srv_ans['host'])
       -            except dns.exception.DNSException:
       +            except dns.exception.DNSException as e:
       +                self.logger.info(f'failed querying (2) dns seed "{dns_seed}" for ln peers: {repr(e)}')
                        continue
                    try:
                        ln_host = str(answers[0])
       t@@ -310,9 +320,9 @@ class LNWorker(Logger):
                        pubkey = get_compressed_pubkey_from_bech32(bech32_pubkey)
                        peers.append(LNPeerAddr(ln_host, port, pubkey))
                    except Exception as e:
       -                self.logger.info('error with parsing peer from dns seed: {}'.format(e))
       +                self.logger.info(f'error with parsing peer from dns seed: {repr(e)}')
                        continue
       -        self.logger.info('got {} ln peers from dns seed'.format(len(peers)))
       +        self.logger.info(f'got {len(peers)} ln peers from dns seed')
                return peers
        
            @staticmethod