mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-30 17:01:34 +00:00
lnrouter: change edge cost estimate (distance metric)
Old estimate was heavily biased towards simply minimising CLTV sum. (fees had a too low weight; typically they were ~noise) Now also take payment_amount into account.
This commit is contained in:
parent
367d30d6c0
commit
cdb72509a7
2 changed files with 16 additions and 10 deletions
|
@ -131,7 +131,7 @@ class LNPathFinder(Logger):
|
||||||
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, *,
|
||||||
my_channels: Dict[ShortChannelID, 'Channel'] = None) -> Tuple[float, int]:
|
my_channels: Dict[ShortChannelID, 'Channel'] = None) -> Tuple[float, int]:
|
||||||
"""Heuristic cost of going through a channel.
|
"""Heuristic cost (distance metric) of going through a channel.
|
||||||
Returns (heuristic_cost, fee_for_edge_msat).
|
Returns (heuristic_cost, fee_for_edge_msat).
|
||||||
"""
|
"""
|
||||||
channel_info = self.channel_db.get_channel_info(short_channel_id, my_channels=my_channels)
|
channel_info = self.channel_db.get_channel_info(short_channel_id, my_channels=my_channels)
|
||||||
|
@ -157,12 +157,20 @@ class LNPathFinder(Logger):
|
||||||
return float('inf'), 0 # payment amount too large
|
return float('inf'), 0 # payment amount too large
|
||||||
if not route_edge.is_sane_to_use(payment_amt_msat):
|
if not route_edge.is_sane_to_use(payment_amt_msat):
|
||||||
return float('inf'), 0 # thanks but no thanks
|
return float('inf'), 0 # thanks but no thanks
|
||||||
fee_msat = route_edge.fee_for_edge(payment_amt_msat) if not ignore_costs else 0
|
|
||||||
# TODO revise
|
# Distance metric notes: # TODO constants are ad-hoc
|
||||||
# paying 10 more satoshis ~ waiting one more block
|
# ( somewhat based on https://github.com/lightningnetwork/lnd/pull/1358 )
|
||||||
fee_cost = fee_msat / 1000 / 10
|
# - Edges have a base cost. (more edges -> less likely none will fail)
|
||||||
cltv_cost = route_edge.cltv_expiry_delta if not ignore_costs else 0
|
# - The larger the payment amount, and the longer the CLTV,
|
||||||
return cltv_cost + fee_cost + 1, fee_msat
|
# the more irritating it is if the HTLC gets stuck.
|
||||||
|
# - Paying lower fees is better. :)
|
||||||
|
base_cost = 500 # one more edge ~ paying 500 msat more fees
|
||||||
|
if ignore_costs:
|
||||||
|
return base_cost, 0
|
||||||
|
fee_msat = route_edge.fee_for_edge(payment_amt_msat)
|
||||||
|
cltv_cost = route_edge.cltv_expiry_delta * payment_amt_msat * 15 / 1_000_000_000
|
||||||
|
overall_cost = base_cost + fee_msat + cltv_cost
|
||||||
|
return overall_cost, fee_msat
|
||||||
|
|
||||||
@profiler
|
@profiler
|
||||||
def find_path_for_payment(self, nodeA: bytes, nodeB: bytes,
|
def find_path_for_payment(self, nodeA: bytes, nodeB: bytes,
|
||||||
|
|
|
@ -96,9 +96,7 @@ class Test_LNRouter(TestCaseForTestnet):
|
||||||
cdb.add_channel_update({'short_channel_id': bfh('0000000000000006'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': o(10), 'htlc_minimum_msat': o(250), 'fee_base_msat': o(100), 'fee_proportional_millionths': o(150), 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': b'\x00\x00\x00\x00'})
|
cdb.add_channel_update({'short_channel_id': bfh('0000000000000006'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': o(10), 'htlc_minimum_msat': o(250), 'fee_base_msat': o(100), 'fee_proportional_millionths': o(150), 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': b'\x00\x00\x00\x00'})
|
||||||
path = path_finder.find_path_for_payment(b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 100000)
|
path = path_finder.find_path_for_payment(b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 100000)
|
||||||
self.assertEqual([(b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', b'\x00\x00\x00\x00\x00\x00\x00\x03'),
|
self.assertEqual([(b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', b'\x00\x00\x00\x00\x00\x00\x00\x03'),
|
||||||
(b'\x02cccccccccccccccccccccccccccccccc', b'\x00\x00\x00\x00\x00\x00\x00\x01'),
|
(b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', b'\x00\x00\x00\x00\x00\x00\x00\x02'),
|
||||||
(b'\x02dddddddddddddddddddddddddddddddd', b'\x00\x00\x00\x00\x00\x00\x00\x04'),
|
|
||||||
(b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', b'\x00\x00\x00\x00\x00\x00\x00\x05')
|
|
||||||
], path)
|
], path)
|
||||||
start_node = b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
|
start_node = b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
|
||||||
route = path_finder.create_route_from_path(path, start_node)
|
route = path_finder.create_route_from_path(path, start_node)
|
||||||
|
|
Loading…
Add table
Reference in a new issue