@@ -361,6 +361,14 @@ pub struct ProbabilisticScoringParameters {
361
361
///
362
362
/// Default value: 256 msat
363
363
pub amount_penalty_multiplier_msat : u64 ,
364
+
365
+ /// This penalty is applied so we prefer nodes with a smaller `htlc_maximum_msat`, which makes
366
+ /// balance discovery attacks harder to execute. As this improves privacy network-wide, we
367
+ /// treat such nodes preferentially and hence create an incentive to restrict
368
+ /// `htlc_maximum_msat`.
369
+ ///
370
+ /// Default value: 10000 msat
371
+ pub anti_probing_penalty_msat : u64 ,
364
372
}
365
373
366
374
/// Accounting for channel liquidity balance uncertainty.
@@ -461,6 +469,7 @@ impl ProbabilisticScoringParameters {
461
469
liquidity_penalty_multiplier_msat : 0 ,
462
470
liquidity_offset_half_life : Duration :: from_secs ( 3600 ) ,
463
471
amount_penalty_multiplier_msat : 0 ,
472
+ anti_probing_penalty_msat : 0 ,
464
473
}
465
474
}
466
475
}
@@ -472,6 +481,7 @@ impl Default for ProbabilisticScoringParameters {
472
481
liquidity_penalty_multiplier_msat : 40_000 ,
473
482
liquidity_offset_half_life : Duration :: from_secs ( 3600 ) ,
474
483
amount_penalty_multiplier_msat : 256 ,
484
+ anti_probing_penalty_msat : 10_000 ,
475
485
}
476
486
}
477
487
}
@@ -672,12 +682,22 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for Probabilis
672
682
fn channel_penalty_msat (
673
683
& self , short_channel_id : u64 , source : & NodeId , target : & NodeId , usage : ChannelUsage
674
684
) -> u64 {
675
- if let EffectiveCapacity :: ExactLiquidity { liquidity_msat } = usage. effective_capacity {
676
- if usage. amount_msat > liquidity_msat {
677
- return u64:: max_value ( ) ;
678
- } else {
679
- return self . params . base_penalty_msat ;
680
- } ;
685
+
686
+ let mut anti_probing_penalty_msat = 0 ;
687
+ match usage. effective_capacity {
688
+ EffectiveCapacity :: ExactLiquidity { liquidity_msat } => {
689
+ if usage. amount_msat > liquidity_msat {
690
+ return u64:: max_value ( ) ;
691
+ } else {
692
+ return self . params . base_penalty_msat ;
693
+ }
694
+ } ,
695
+ EffectiveCapacity :: Total { capacity_msat, htlc_maximum_msat : Some ( htlc_maximum_msat) } => {
696
+ if htlc_maximum_msat* 2 >= capacity_msat {
697
+ anti_probing_penalty_msat = self . params . anti_probing_penalty_msat ;
698
+ }
699
+ } ,
700
+ _ => { } ,
681
701
}
682
702
683
703
let liquidity_offset_half_life = self . params . liquidity_offset_half_life ;
@@ -689,6 +709,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for Probabilis
689
709
. unwrap_or ( & ChannelLiquidity :: new ( ) )
690
710
. as_directed ( source, target, capacity_msat, liquidity_offset_half_life)
691
711
. penalty_msat ( amount_msat, self . params )
712
+ . saturating_add ( anti_probing_penalty_msat)
692
713
}
693
714
694
715
fn payment_path_failed ( & mut self , path : & [ & RouteHop ] , short_channel_id : u64 ) {
@@ -1512,7 +1533,7 @@ mod tests {
1512
1533
let usage = ChannelUsage {
1513
1534
amount_msat : 1_024 ,
1514
1535
inflight_htlc_msat : 0 ,
1515
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024_000 } ,
1536
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1516
1537
} ;
1517
1538
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 0 ) ;
1518
1539
let usage = ChannelUsage { amount_msat : 10_240 , ..usage } ;
@@ -1525,7 +1546,7 @@ mod tests {
1525
1546
let usage = ChannelUsage {
1526
1547
amount_msat : 128 ,
1527
1548
inflight_htlc_msat : 0 ,
1528
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 } ,
1549
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 , htlc_maximum_msat : Some ( 1_000 ) } ,
1529
1550
} ;
1530
1551
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 58 ) ;
1531
1552
let usage = ChannelUsage { amount_msat : 256 , ..usage } ;
@@ -1562,7 +1583,7 @@ mod tests {
1562
1583
let usage = ChannelUsage {
1563
1584
amount_msat : 39 ,
1564
1585
inflight_htlc_msat : 0 ,
1565
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 100 } ,
1586
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 100 , htlc_maximum_msat : Some ( 1_000 ) } ,
1566
1587
} ;
1567
1588
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 0 ) ;
1568
1589
let usage = ChannelUsage { amount_msat : 50 , ..usage } ;
@@ -1586,7 +1607,7 @@ mod tests {
1586
1607
let usage = ChannelUsage {
1587
1608
amount_msat : 500 ,
1588
1609
inflight_htlc_msat : 0 ,
1589
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1610
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1590
1611
} ;
1591
1612
let failed_path = payment_path_for_amount ( 500 ) ;
1592
1613
let successful_path = payment_path_for_amount ( 200 ) ;
@@ -1616,7 +1637,7 @@ mod tests {
1616
1637
let usage = ChannelUsage {
1617
1638
amount_msat : 250 ,
1618
1639
inflight_htlc_msat : 0 ,
1619
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1640
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1620
1641
} ;
1621
1642
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 128 ) ;
1622
1643
let usage = ChannelUsage { amount_msat : 500 , ..usage } ;
@@ -1650,7 +1671,7 @@ mod tests {
1650
1671
let usage = ChannelUsage {
1651
1672
amount_msat : 250 ,
1652
1673
inflight_htlc_msat : 0 ,
1653
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1674
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1654
1675
} ;
1655
1676
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 128 ) ;
1656
1677
let usage = ChannelUsage { amount_msat : 500 , ..usage } ;
@@ -1684,7 +1705,7 @@ mod tests {
1684
1705
let usage = ChannelUsage {
1685
1706
amount_msat : 250 ,
1686
1707
inflight_htlc_msat : 0 ,
1687
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1708
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1688
1709
} ;
1689
1710
let path = payment_path_for_amount ( 500 ) ;
1690
1711
@@ -1715,7 +1736,7 @@ mod tests {
1715
1736
let usage = ChannelUsage {
1716
1737
amount_msat : 0 ,
1717
1738
inflight_htlc_msat : 0 ,
1718
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 } ,
1739
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 , htlc_maximum_msat : Some ( 1_000 ) } ,
1719
1740
} ;
1720
1741
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 0 ) ;
1721
1742
let usage = ChannelUsage { amount_msat : 1_024 , ..usage } ;
@@ -1793,7 +1814,7 @@ mod tests {
1793
1814
let usage = ChannelUsage {
1794
1815
amount_msat : 256 ,
1795
1816
inflight_htlc_msat : 0 ,
1796
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 } ,
1817
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 , htlc_maximum_msat : Some ( 1_000 ) } ,
1797
1818
} ;
1798
1819
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 125 ) ;
1799
1820
@@ -1824,7 +1845,7 @@ mod tests {
1824
1845
let usage = ChannelUsage {
1825
1846
amount_msat : 512 ,
1826
1847
inflight_htlc_msat : 0 ,
1827
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 } ,
1848
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 , htlc_maximum_msat : Some ( 1_000 ) } ,
1828
1849
} ;
1829
1850
1830
1851
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 300 ) ;
@@ -1868,7 +1889,7 @@ mod tests {
1868
1889
let usage = ChannelUsage {
1869
1890
amount_msat : 500 ,
1870
1891
inflight_htlc_msat : 0 ,
1871
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1892
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1872
1893
} ;
1873
1894
1874
1895
scorer. payment_path_failed ( & payment_path_for_amount ( 500 ) . iter ( ) . collect :: < Vec < _ > > ( ) , 42 ) ;
@@ -1904,7 +1925,7 @@ mod tests {
1904
1925
let usage = ChannelUsage {
1905
1926
amount_msat : 500 ,
1906
1927
inflight_htlc_msat : 0 ,
1907
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
1928
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1908
1929
} ;
1909
1930
1910
1931
scorer. payment_path_failed ( & payment_path_for_amount ( 500 ) . iter ( ) . collect :: < Vec < _ > > ( ) , 42 ) ;
@@ -1941,47 +1962,47 @@ mod tests {
1941
1962
let usage = ChannelUsage {
1942
1963
amount_msat : 100_000_000 ,
1943
1964
inflight_htlc_msat : 0 ,
1944
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 950_000_000 } ,
1965
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
1945
1966
} ;
1946
1967
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 3613 ) ;
1947
1968
let usage = ChannelUsage {
1948
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_950_000_000 } , ..usage
1969
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1949
1970
} ;
1950
1971
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 1977 ) ;
1951
1972
let usage = ChannelUsage {
1952
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 2_950_000_000 } , ..usage
1973
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 2_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1953
1974
} ;
1954
1975
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 1474 ) ;
1955
1976
let usage = ChannelUsage {
1956
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 3_950_000_000 } , ..usage
1977
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 3_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1957
1978
} ;
1958
1979
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 1223 ) ;
1959
1980
let usage = ChannelUsage {
1960
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 4_950_000_000 } , ..usage
1981
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 4_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1961
1982
} ;
1962
1983
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 877 ) ;
1963
1984
let usage = ChannelUsage {
1964
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 5_950_000_000 } , ..usage
1985
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 5_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1965
1986
} ;
1966
1987
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 845 ) ;
1967
1988
let usage = ChannelUsage {
1968
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 6_950_000_000 } , ..usage
1989
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 6_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1969
1990
} ;
1970
1991
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 500 ) ;
1971
1992
let usage = ChannelUsage {
1972
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 7_450_000_000 } , ..usage
1993
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 7_450_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1973
1994
} ;
1974
1995
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 500 ) ;
1975
1996
let usage = ChannelUsage {
1976
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 7_950_000_000 } , ..usage
1997
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 7_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1977
1998
} ;
1978
1999
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 500 ) ;
1979
2000
let usage = ChannelUsage {
1980
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 8_950_000_000 } , ..usage
2001
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 8_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1981
2002
} ;
1982
2003
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 500 ) ;
1983
2004
let usage = ChannelUsage {
1984
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 9_950_000_000 } , ..usage
2005
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 9_950_000_000 , htlc_maximum_msat : Some ( 1_000 ) } , ..usage
1985
2006
} ;
1986
2007
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 500 ) ;
1987
2008
}
@@ -1995,7 +2016,7 @@ mod tests {
1995
2016
let usage = ChannelUsage {
1996
2017
amount_msat : 128 ,
1997
2018
inflight_htlc_msat : 0 ,
1998
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 } ,
2019
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024 , htlc_maximum_msat : Some ( 1_000 ) } ,
1999
2020
} ;
2000
2021
2001
2022
let params = ProbabilisticScoringParameters {
@@ -2006,7 +2027,8 @@ mod tests {
2006
2027
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 58 ) ;
2007
2028
2008
2029
let params = ProbabilisticScoringParameters {
2009
- base_penalty_msat : 500 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
2030
+ base_penalty_msat : 500 , liquidity_penalty_multiplier_msat : 1_000 ,
2031
+ anti_probing_penalty_msat : 0 , ..Default :: default ( )
2010
2032
} ;
2011
2033
let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
2012
2034
assert_eq ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , 558 ) ;
@@ -2021,7 +2043,7 @@ mod tests {
2021
2043
let usage = ChannelUsage {
2022
2044
amount_msat : 512_000 ,
2023
2045
inflight_htlc_msat : 0 ,
2024
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024_000 } ,
2046
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_024_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
2025
2047
} ;
2026
2048
2027
2049
let params = ProbabilisticScoringParameters {
@@ -2073,7 +2095,7 @@ mod tests {
2073
2095
let usage = ChannelUsage {
2074
2096
amount_msat : 750 ,
2075
2097
inflight_htlc_msat : 0 ,
2076
- effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 } ,
2098
+ effective_capacity : EffectiveCapacity :: Total { capacity_msat : 1_000 , htlc_maximum_msat : Some ( 1_000 ) } ,
2077
2099
} ;
2078
2100
assert_ne ! ( scorer. channel_penalty_msat( 42 , & source, & target, usage) , u64 :: max_value( ) ) ;
2079
2101
0 commit comments