Browse Source

request_force_close_from_backup:

- for an onchain backups, if the channel is with a
   hardcoded trampoline, try first without gossip DB.
 - for imported backups, fallback to gossip DB if we
   fail to connect with the provided network address.
master
ThomasV 3 years ago
parent
commit
36a6fd6311
  1. 33
      electrum/lnworker.py

33
electrum/lnworker.py

@ -2526,16 +2526,19 @@ class LNWallet(LNWorker):
node_id = cb.node_id node_id = cb.node_id
privkey = cb.privkey privkey = cb.privkey
addresses = [(cb.host, cb.port, 0)] addresses = [(cb.host, cb.port, 0)]
# TODO also try network addresses from gossip db (as it might have changed)
else: else:
assert isinstance(cb, OnchainChannelBackupStorage) assert isinstance(cb, OnchainChannelBackupStorage)
if not self.channel_db:
raise Exception('Enable gossip first')
node_id = self.network.channel_db.get_node_by_prefix(cb.node_id_prefix)
privkey = self.node_keypair.privkey privkey = self.node_keypair.privkey
addresses = self.network.channel_db.get_node_addresses(node_id) for pubkey, peer_addr in trampolines_by_id().items():
if not addresses: if pubkey.startswith(cb.node_id_prefix):
raise Exception('Peer not found in gossip database') node_id = pubkey
addresses = [(peer_addr.host, peer_addr.port, 0)]
break
else:
# we will try with gossip (see below)
addresses = []
async def _request_fclose(addresses):
for host, port, timestamp in addresses: for host, port, timestamp in addresses:
peer_addr = LNPeerAddr(host, port, node_id) peer_addr = LNPeerAddr(host, port, node_id)
transport = LNTransport(privkey, peer_addr, proxy=self.network.proxy) transport = LNTransport(privkey, peer_addr, proxy=self.network.proxy)
@ -2544,11 +2547,25 @@ class LNWallet(LNWorker):
async with OldTaskGroup(wait=any) as group: async with OldTaskGroup(wait=any) as group:
await group.spawn(peer._message_loop()) await group.spawn(peer._message_loop())
await group.spawn(peer.request_force_close(channel_id)) await group.spawn(peer.request_force_close(channel_id))
return return True
except Exception as e: except Exception as e:
self.logger.info(f'failed to connect {host} {e}') self.logger.info(f'failed to connect {host} {e}')
continue continue
else: else:
return False
# try first without gossip db
success = await _request_fclose(addresses)
if success:
return
# try with gossip db
if not self.channel_db:
raise Exception(_('Please enable gossip'))
node_id = self.network.channel_db.get_node_by_prefix(cb.node_id_prefix)
addresses_from_gossip = self.network.channel_db.get_node_addresses(node_id)
if not addresses_from_gossip:
raise Exception('Peer not found in gossip database')
success = await _request_fclose(addresses_from_gossip)
if not success:
raise Exception('failed to connect') raise Exception('failed to connect')
def maybe_add_backup_from_tx(self, tx): def maybe_add_backup_from_tx(self, tx):

Loading…
Cancel
Save