Browse Source

lnrouter: blacklist channels for a limited time (see #6124)

master
ThomasV 5 years ago
parent
commit
526c75ad53
  1. 16
      electrum/lnrouter.py

16
electrum/lnrouter.py

@ -26,7 +26,7 @@
import queue import queue
from collections import defaultdict from collections import defaultdict
from typing import Sequence, List, Tuple, Optional, Dict, NamedTuple, TYPE_CHECKING, Set from typing import Sequence, List, Tuple, Optional, Dict, NamedTuple, TYPE_CHECKING, Set
import time
import attr import attr
from .util import bh2u, profiler from .util import bh2u, profiler
@ -135,16 +135,24 @@ def is_fee_sane(fee_msat: int, *, payment_amount_msat: int) -> bool:
return False return False
BLACKLIST_DURATION = 3600
class LNPathFinder(Logger): class LNPathFinder(Logger):
def __init__(self, channel_db: ChannelDB): def __init__(self, channel_db: ChannelDB):
Logger.__init__(self) Logger.__init__(self)
self.channel_db = channel_db self.channel_db = channel_db
self.blacklist = set() self.blacklist = dict() # short_chan_id -> timestamp
def add_to_blacklist(self, short_channel_id: ShortChannelID): def add_to_blacklist(self, short_channel_id: ShortChannelID):
self.logger.info(f'blacklisting channel {short_channel_id}') self.logger.info(f'blacklisting channel {short_channel_id}')
self.blacklist.add(short_channel_id) now = int(time.time())
self.blacklist[short_channel_id] = now
def is_blacklisted(self, short_channel_id: ShortChannelID) -> bool:
now = int(time.time())
t = self.blacklist.get(short_channel_id, 0)
return now - t < BLACKLIST_DURATION
def _edge_cost(self, short_channel_id: bytes, start_node: bytes, end_node: bytes, def _edge_cost(self, short_channel_id: bytes, start_node: bytes, end_node: bytes,
payment_amt_msat: int, ignore_costs=False, is_mine=False, *, payment_amt_msat: int, ignore_costs=False, is_mine=False, *,
@ -221,7 +229,7 @@ class LNPathFinder(Logger):
continue continue
for edge_channel_id in self.channel_db.get_channels_for_node(edge_endnode, my_channels=my_channels): for edge_channel_id in self.channel_db.get_channels_for_node(edge_endnode, my_channels=my_channels):
assert isinstance(edge_channel_id, bytes) assert isinstance(edge_channel_id, bytes)
if edge_channel_id in self.blacklist: if self.is_blacklisted(edge_channel_id):
continue continue
channel_info = self.channel_db.get_channel_info(edge_channel_id, my_channels=my_channels) channel_info = self.channel_db.get_channel_info(edge_channel_id, my_channels=my_channels)
edge_startnode = channel_info.node2_id if channel_info.node1_id == edge_endnode else channel_info.node1_id edge_startnode = channel_info.node2_id if channel_info.node1_id == edge_endnode else channel_info.node1_id

Loading…
Cancel
Save