Browse Source

lnworker: re-enable dns seeds for peer-finding bootstrap

but only for mainnet
master
SomberNight 6 years ago
parent
commit
59a428ea7f
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 6
      electrum/constants.py
  2. 30
      electrum/lnworker.py

6
electrum/constants.py

@ -124,9 +124,9 @@ class BitcoinTestnet(AbstractNet):
XPUB_HEADERS_INV = inv_dict(XPUB_HEADERS) XPUB_HEADERS_INV = inv_dict(XPUB_HEADERS)
BIP44_COIN_TYPE = 1 BIP44_COIN_TYPE = 1
LN_REALM_BYTE = 1 LN_REALM_BYTE = 1
LN_DNS_SEEDS = [ LN_DNS_SEEDS = [ # TODO investigate this again
'test.nodes.lightning.directory.', #'test.nodes.lightning.directory.', # times out.
'lseed.bitcoinstats.com.', #'lseed.bitcoinstats.com.', # ignores REALM byte and returns mainnet peers...
] ]

30
electrum/lnworker.py

@ -19,6 +19,7 @@ from concurrent import futures
import dns.resolver import dns.resolver
import dns.exception import dns.exception
from aiorpcx import run_in_thread
from . import constants from . import constants
from . import keystore from . import keystore
@ -270,17 +271,24 @@ class LNWorker(Logger):
#self.logger.info('taking random ln peer from our channel db') #self.logger.info('taking random ln peer from our channel db')
return [peer] return [peer]
# TODO remove this. For some reason the dns seeds seem to ignore the realm byte # getting desperate... let's try hardcoded fallback list of peers
# and only return mainnet nodes. so for the time being dns seeding is disabled:
if constants.net in (constants.BitcoinTestnet, ): 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, ): elif constants.net in (constants.BitcoinMainnet, ):
return [random.choice(FALLBACK_NODE_LIST_MAINNET)] fallback_list = FALLBACK_NODE_LIST_MAINNET
else: 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)]
# try peers from dns seed. # last resort: try dns seeds (BOLT-10)
# return several peers to reduce the number of dns queries. return await run_in_thread(self._get_peers_from_dns_seeds)
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: if not constants.net.LN_DNS_SEEDS:
return [] return []
dns_seed = random.choice(constants.net.LN_DNS_SEEDS) dns_seed = random.choice(constants.net.LN_DNS_SEEDS)
@ -291,6 +299,7 @@ class LNWorker(Logger):
srv_answers = resolve_dns_srv('r{}.{}'.format( srv_answers = resolve_dns_srv('r{}.{}'.format(
constants.net.LN_REALM_BYTE, dns_seed)) constants.net.LN_REALM_BYTE, dns_seed))
except dns.exception.DNSException as e: except dns.exception.DNSException as e:
self.logger.info(f'failed querying (1) dns seed "{dns_seed}" for ln peers: {repr(e)}')
return [] return []
random.shuffle(srv_answers) random.shuffle(srv_answers)
num_peers = 2 * NUM_PEERS_TARGET num_peers = 2 * NUM_PEERS_TARGET
@ -301,7 +310,8 @@ class LNWorker(Logger):
try: try:
# note: this might block for several seconds # note: this might block for several seconds
answers = dns.resolver.query(srv_ans['host']) 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 continue
try: try:
ln_host = str(answers[0]) ln_host = str(answers[0])
@ -310,9 +320,9 @@ class LNWorker(Logger):
pubkey = get_compressed_pubkey_from_bech32(bech32_pubkey) pubkey = get_compressed_pubkey_from_bech32(bech32_pubkey)
peers.append(LNPeerAddr(ln_host, port, pubkey)) peers.append(LNPeerAddr(ln_host, port, pubkey))
except Exception as e: 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 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 return peers
@staticmethod @staticmethod

Loading…
Cancel
Save