@@ -37,6 +37,7 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
37
37
use lightning:: chain:: keysinterface:: { KeysInterface , InMemorySigner } ;
38
38
use lightning:: ln:: { PaymentHash , PaymentPreimage , PaymentSecret } ;
39
39
use lightning:: ln:: channelmanager:: { ChainParameters , ChannelManager , PaymentSendFailure , ChannelManagerReadArgs } ;
40
+ use lightning:: ln:: channel:: CHAN_STUCK_FEE_INCREASE_MULTIPLE ;
40
41
use lightning:: ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
41
42
use lightning:: ln:: msgs:: { CommitmentUpdate , ChannelMessageHandler , DecodeError , UpdateAddHTLC , Init } ;
42
43
use lightning:: util:: enforcing_trait_impls:: { EnforcingSigner , INITIAL_REVOKED_COMMITMENT_NUMBER } ;
@@ -57,16 +58,27 @@ use bitcoin::secp256k1::recovery::RecoverableSignature;
57
58
use bitcoin:: secp256k1:: Secp256k1 ;
58
59
59
60
use std:: mem;
60
- use std:: cmp:: Ordering ;
61
+ use std:: cmp:: { self , Ordering } ;
61
62
use std:: collections:: { HashSet , hash_map, HashMap } ;
62
63
use std:: sync:: { Arc , Mutex } ;
63
64
use std:: sync:: atomic;
64
65
use std:: io:: Cursor ;
65
66
66
- struct FuzzEstimator { }
67
+ const MAX_FEE : u32 = 10_000 ;
68
+ struct FuzzEstimator {
69
+ ret_val : atomic:: AtomicU32 ,
70
+ }
67
71
impl FeeEstimator for FuzzEstimator {
68
- fn get_est_sat_per_1000_weight ( & self , _: ConfirmationTarget ) -> u32 {
69
- 253
72
+ fn get_est_sat_per_1000_weight ( & self , conf_target : ConfirmationTarget ) -> u32 {
73
+ // We force-close channels if our counterparty sends us a feerate which is a small multiple
74
+ // of our HighPriority fee estimate or smaller than our Background fee estimate. Thus, we
75
+ // always return a HighPriority feerate here which is >= the maximum Normal feerate and a
76
+ // Background feerate which is <= the minimum Normal feerate.
77
+ match conf_target {
78
+ ConfirmationTarget :: HighPriority => MAX_FEE ,
79
+ ConfirmationTarget :: Background => 253 ,
80
+ ConfirmationTarget :: Normal => cmp:: min ( self . ret_val . load ( atomic:: Ordering :: Acquire ) , MAX_FEE ) ,
81
+ }
70
82
}
71
83
}
72
84
@@ -131,7 +143,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
131
143
} ;
132
144
let deserialized_monitor = <( BlockHash , channelmonitor:: ChannelMonitor < EnforcingSigner > ) >::
133
145
read ( & mut Cursor :: new ( & map_entry. get ( ) . 1 ) , & * self . keys ) . unwrap ( ) . 1 ;
134
- deserialized_monitor. update_monitor ( & update, & & TestBroadcaster { } , & & FuzzEstimator { } , & self . logger ) . unwrap ( ) ;
146
+ deserialized_monitor. update_monitor ( & update, & & TestBroadcaster { } , & & FuzzEstimator { ret_val : atomic :: AtomicU32 :: new ( 253 ) } , & self . logger ) . unwrap ( ) ;
135
147
let mut ser = VecWriter ( Vec :: new ( ) ) ;
136
148
deserialized_monitor. write ( & mut ser) . unwrap ( ) ;
137
149
map_entry. insert ( ( update. update_id , ser. 0 ) ) ;
@@ -328,14 +340,13 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
328
340
329
341
#[ inline]
330
342
pub fn do_test < Out : test_logger:: Output > ( data : & [ u8 ] , out : Out ) {
331
- let fee_est = Arc :: new ( FuzzEstimator { } ) ;
332
343
let broadcast = Arc :: new ( TestBroadcaster { } ) ;
333
344
334
345
macro_rules! make_node {
335
- ( $node_id: expr) => { {
346
+ ( $node_id: expr, $fee_estimator : expr ) => { {
336
347
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
337
348
let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, rand_bytes_id: atomic:: AtomicU32 :: new( 0 ) , revoked_commitments: Mutex :: new( HashMap :: new( ) ) } ) ;
338
- let monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & keys_manager) ) ) ;
349
+ let monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , $fee_estimator . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & keys_manager) ) ) ;
339
350
340
351
let mut config = UserConfig :: default ( ) ;
341
352
config. channel_options. forwarding_fee_proportional_millionths = 0 ;
@@ -345,16 +356,16 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
345
356
network,
346
357
best_block: BestBlock :: from_genesis( network) ,
347
358
} ;
348
- ( ChannelManager :: new( fee_est . clone( ) , monitor. clone( ) , broadcast. clone( ) , Arc :: clone( & logger) , keys_manager. clone( ) , config, params) ,
359
+ ( ChannelManager :: new( $fee_estimator . clone( ) , monitor. clone( ) , broadcast. clone( ) , Arc :: clone( & logger) , keys_manager. clone( ) , config, params) ,
349
360
monitor, keys_manager)
350
361
} }
351
362
}
352
363
353
364
macro_rules! reload_node {
354
- ( $ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr) => { {
365
+ ( $ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr, $fee_estimator : expr ) => { {
355
366
let keys_manager = Arc :: clone( & $keys_manager) ;
356
367
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
357
- let chain_monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & $keys_manager) ) ) ;
368
+ let chain_monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , $fee_estimator . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & $keys_manager) ) ) ;
358
369
359
370
let mut config = UserConfig :: default ( ) ;
360
371
config. channel_options. forwarding_fee_proportional_millionths = 0 ;
@@ -373,7 +384,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
373
384
374
385
let read_args = ChannelManagerReadArgs {
375
386
keys_manager,
376
- fee_estimator: fee_est . clone( ) ,
387
+ fee_estimator: $fee_estimator . clone( ) ,
377
388
chain_monitor: chain_monitor. clone( ) ,
378
389
tx_broadcaster: broadcast. clone( ) ,
379
390
logger,
@@ -488,11 +499,18 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
488
499
} }
489
500
}
490
501
502
+ let fee_est_a = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
503
+ let mut last_htlc_clear_fee_a = 253 ;
504
+ let fee_est_b = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
505
+ let mut last_htlc_clear_fee_b = 253 ;
506
+ let fee_est_c = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
507
+ let mut last_htlc_clear_fee_c = 253 ;
508
+
491
509
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
492
510
// forwarding.
493
- let ( node_a, mut monitor_a, keys_manager_a) = make_node ! ( 0 ) ;
494
- let ( node_b, mut monitor_b, keys_manager_b) = make_node ! ( 1 ) ;
495
- let ( node_c, mut monitor_c, keys_manager_c) = make_node ! ( 2 ) ;
511
+ let ( node_a, mut monitor_a, keys_manager_a) = make_node ! ( 0 , fee_est_a ) ;
512
+ let ( node_b, mut monitor_b, keys_manager_b) = make_node ! ( 1 , fee_est_b ) ;
513
+ let ( node_c, mut monitor_c, keys_manager_c) = make_node ! ( 2 , fee_est_c ) ;
496
514
497
515
let mut nodes = [ node_a, node_b, node_c] ;
498
516
@@ -630,7 +648,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
630
648
events:: MessageSendEvent :: UpdateHTLCs { node_id, updates: CommitmentUpdate { update_add_htlcs, update_fail_htlcs, update_fulfill_htlcs, update_fail_malformed_htlcs, update_fee, commitment_signed } } => {
631
649
for dest in nodes. iter( ) {
632
650
if dest. get_our_node_id( ) == node_id {
633
- assert!( update_fee. is_none( ) ) ;
634
651
for update_add in update_add_htlcs. iter( ) {
635
652
if !$corrupt_forward {
636
653
dest. handle_update_add_htlc( & nodes[ $node] . get_our_node_id( ) , update_add) ;
@@ -654,6 +671,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
654
671
for update_fail_malformed in update_fail_malformed_htlcs. iter( ) {
655
672
dest. handle_update_fail_malformed_htlc( & nodes[ $node] . get_our_node_id( ) , update_fail_malformed) ;
656
673
}
674
+ if let Some ( msg) = update_fee {
675
+ dest. handle_update_fee( & nodes[ $node] . get_our_node_id( ) , & msg) ;
676
+ }
657
677
let processed_change = !update_add_htlcs. is_empty( ) || !update_fulfill_htlcs. is_empty( ) ||
658
678
!update_fail_htlcs. is_empty( ) || !update_fail_malformed_htlcs. is_empty( ) ;
659
679
if $limit_events != ProcessMessages :: AllMessages && processed_change {
@@ -918,7 +938,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
918
938
node_a_ser. 0 . clear ( ) ;
919
939
nodes[ 0 ] . write ( & mut node_a_ser) . unwrap ( ) ;
920
940
}
921
- let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a, keys_manager_a) ;
941
+ let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a, keys_manager_a, fee_est_a ) ;
922
942
nodes[ 0 ] = new_node_a;
923
943
monitor_a = new_monitor_a;
924
944
} ,
@@ -937,7 +957,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
937
957
bc_events. clear ( ) ;
938
958
cb_events. clear ( ) ;
939
959
}
940
- let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b, keys_manager_b) ;
960
+ let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b, keys_manager_b, fee_est_b ) ;
941
961
nodes[ 1 ] = new_node_b;
942
962
monitor_b = new_monitor_b;
943
963
} ,
@@ -951,7 +971,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
951
971
node_c_ser. 0 . clear ( ) ;
952
972
nodes[ 2 ] . write ( & mut node_c_ser) . unwrap ( ) ;
953
973
}
954
- let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c, keys_manager_c) ;
974
+ let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c, keys_manager_c, fee_est_c ) ;
955
975
nodes[ 2 ] = new_node_c;
956
976
monitor_c = new_monitor_c;
957
977
} ,
@@ -1013,6 +1033,33 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1013
1033
0x6c => { send_hop_payment ( & nodes[ 0 ] , & nodes[ 1 ] , chan_a, & nodes[ 2 ] , chan_b, 1 , & mut payment_id) ; } ,
1014
1034
0x6d => { send_hop_payment ( & nodes[ 2 ] , & nodes[ 1 ] , chan_b, & nodes[ 0 ] , chan_a, 1 , & mut payment_id) ; } ,
1015
1035
1036
+ 0x80 => {
1037
+ let max_feerate = last_htlc_clear_fee_a * CHAN_STUCK_FEE_INCREASE_MULTIPLE as u32 ;
1038
+ if fee_est_a. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1039
+ fee_est_a. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1040
+ }
1041
+ nodes[ 0 ] . maybe_update_chan_fees ( ) ;
1042
+ } ,
1043
+ 0x81 => { fee_est_a. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 0 ] . maybe_update_chan_fees ( ) ; } ,
1044
+
1045
+ 0x84 => {
1046
+ let max_feerate = last_htlc_clear_fee_b * CHAN_STUCK_FEE_INCREASE_MULTIPLE as u32 ;
1047
+ if fee_est_b. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1048
+ fee_est_b. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1049
+ }
1050
+ nodes[ 1 ] . maybe_update_chan_fees ( ) ;
1051
+ } ,
1052
+ 0x85 => { fee_est_b. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 1 ] . maybe_update_chan_fees ( ) ; } ,
1053
+
1054
+ 0x88 => {
1055
+ let max_feerate = last_htlc_clear_fee_c * CHAN_STUCK_FEE_INCREASE_MULTIPLE as u32 ;
1056
+ if fee_est_c. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1057
+ fee_est_c. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1058
+ }
1059
+ nodes[ 2 ] . maybe_update_chan_fees ( ) ;
1060
+ } ,
1061
+ 0x89 => { fee_est_c. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 2 ] . maybe_update_chan_fees ( ) ; } ,
1062
+
1016
1063
0xff => {
1017
1064
// Test that no channel is in a stuck state where neither party can send funds even
1018
1065
// after we resolve all pending events.
@@ -1068,6 +1115,10 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1068
1115
assert ! (
1069
1116
send_payment( & nodes[ 1 ] , & nodes[ 2 ] , chan_b, 10_000_000 , & mut payment_id) ||
1070
1117
send_payment( & nodes[ 2 ] , & nodes[ 1 ] , chan_b, 10_000_000 , & mut payment_id) ) ;
1118
+
1119
+ last_htlc_clear_fee_a = fee_est_a. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1120
+ last_htlc_clear_fee_b = fee_est_b. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1121
+ last_htlc_clear_fee_c = fee_est_c. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1071
1122
} ,
1072
1123
_ => test_return ! ( ) ,
1073
1124
}
0 commit comments