@@ -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:: FEE_SPIKE_BUFFER_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:: ln:: script:: ShutdownScript ;
@@ -58,16 +59,27 @@ use bitcoin::secp256k1::recovery::RecoverableSignature;
58
59
use bitcoin:: secp256k1:: Secp256k1 ;
59
60
60
61
use std:: mem;
61
- use std:: cmp:: Ordering ;
62
+ use std:: cmp:: { self , Ordering } ;
62
63
use std:: collections:: { HashSet , hash_map, HashMap } ;
63
64
use std:: sync:: { Arc , Mutex } ;
64
65
use std:: sync:: atomic;
65
66
use std:: io:: Cursor ;
66
67
67
- struct FuzzEstimator { }
68
+ const MAX_FEE : u32 = 10_000 ;
69
+ struct FuzzEstimator {
70
+ ret_val : atomic:: AtomicU32 ,
71
+ }
68
72
impl FeeEstimator for FuzzEstimator {
69
- fn get_est_sat_per_1000_weight ( & self , _: ConfirmationTarget ) -> u32 {
70
- 253
73
+ fn get_est_sat_per_1000_weight ( & self , conf_target : ConfirmationTarget ) -> u32 {
74
+ // We force-close channels if our counterparty sends us a feerate which is a small multiple
75
+ // of our HighPriority fee estimate or smaller than our Background fee estimate. Thus, we
76
+ // always return a HighPriority feerate here which is >= the maximum Normal feerate and a
77
+ // Background feerate which is <= the minimum Normal feerate.
78
+ match conf_target {
79
+ ConfirmationTarget :: HighPriority => MAX_FEE ,
80
+ ConfirmationTarget :: Background => 253 ,
81
+ ConfirmationTarget :: Normal => cmp:: min ( self . ret_val . load ( atomic:: Ordering :: Acquire ) , MAX_FEE ) ,
82
+ }
71
83
}
72
84
}
73
85
@@ -132,7 +144,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
132
144
} ;
133
145
let deserialized_monitor = <( BlockHash , channelmonitor:: ChannelMonitor < EnforcingSigner > ) >::
134
146
read ( & mut Cursor :: new ( & map_entry. get ( ) . 1 ) , & * self . keys ) . unwrap ( ) . 1 ;
135
- deserialized_monitor. update_monitor ( & update, & & TestBroadcaster { } , & & FuzzEstimator { } , & self . logger ) . unwrap ( ) ;
147
+ deserialized_monitor. update_monitor ( & update, & & TestBroadcaster { } , & & FuzzEstimator { ret_val : atomic :: AtomicU32 :: new ( 253 ) } , & self . logger ) . unwrap ( ) ;
136
148
let mut ser = VecWriter ( Vec :: new ( ) ) ;
137
149
deserialized_monitor. write ( & mut ser) . unwrap ( ) ;
138
150
map_entry. insert ( ( update. update_id , ser. 0 ) ) ;
@@ -334,14 +346,13 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
334
346
335
347
#[ inline]
336
348
pub fn do_test < Out : test_logger:: Output > ( data : & [ u8 ] , out : Out ) {
337
- let fee_est = Arc :: new ( FuzzEstimator { } ) ;
338
349
let broadcast = Arc :: new ( TestBroadcaster { } ) ;
339
350
340
351
macro_rules! make_node {
341
- ( $node_id: expr) => { {
352
+ ( $node_id: expr, $fee_estimator : expr ) => { {
342
353
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
343
354
let keys_manager = Arc :: new( KeyProvider { node_id: $node_id, rand_bytes_id: atomic:: AtomicU32 :: new( 0 ) , revoked_commitments: Mutex :: new( HashMap :: new( ) ) } ) ;
344
- let monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & keys_manager) ) ) ;
355
+ let monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , $fee_estimator . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & keys_manager) ) ) ;
345
356
346
357
let mut config = UserConfig :: default ( ) ;
347
358
config. channel_options. forwarding_fee_proportional_millionths = 0 ;
@@ -351,16 +362,16 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
351
362
network,
352
363
best_block: BestBlock :: from_genesis( network) ,
353
364
} ;
354
- ( ChannelManager :: new( fee_est . clone( ) , monitor. clone( ) , broadcast. clone( ) , Arc :: clone( & logger) , keys_manager. clone( ) , config, params) ,
365
+ ( ChannelManager :: new( $fee_estimator . clone( ) , monitor. clone( ) , broadcast. clone( ) , Arc :: clone( & logger) , keys_manager. clone( ) , config, params) ,
355
366
monitor, keys_manager)
356
367
} }
357
368
}
358
369
359
370
macro_rules! reload_node {
360
- ( $ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr) => { {
371
+ ( $ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr, $fee_estimator : expr ) => { {
361
372
let keys_manager = Arc :: clone( & $keys_manager) ;
362
373
let logger: Arc <dyn Logger > = Arc :: new( test_logger:: TestLogger :: new( $node_id. to_string( ) , out. clone( ) ) ) ;
363
- let chain_monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , fee_est . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & $keys_manager) ) ) ;
374
+ let chain_monitor = Arc :: new( TestChainMonitor :: new( broadcast. clone( ) , logger. clone( ) , $fee_estimator . clone( ) , Arc :: new( TestPersister { } ) , Arc :: clone( & $keys_manager) ) ) ;
364
375
365
376
let mut config = UserConfig :: default ( ) ;
366
377
config. channel_options. forwarding_fee_proportional_millionths = 0 ;
@@ -379,7 +390,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
379
390
380
391
let read_args = ChannelManagerReadArgs {
381
392
keys_manager,
382
- fee_estimator: fee_est . clone( ) ,
393
+ fee_estimator: $fee_estimator . clone( ) ,
383
394
chain_monitor: chain_monitor. clone( ) ,
384
395
tx_broadcaster: broadcast. clone( ) ,
385
396
logger,
@@ -497,11 +508,18 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
497
508
} }
498
509
}
499
510
511
+ let fee_est_a = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
512
+ let mut last_htlc_clear_fee_a = 253 ;
513
+ let fee_est_b = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
514
+ let mut last_htlc_clear_fee_b = 253 ;
515
+ let fee_est_c = Arc :: new ( FuzzEstimator { ret_val : atomic:: AtomicU32 :: new ( 253 ) } ) ;
516
+ let mut last_htlc_clear_fee_c = 253 ;
517
+
500
518
// 3 nodes is enough to hit all the possible cases, notably unknown-source-unknown-dest
501
519
// forwarding.
502
- let ( node_a, mut monitor_a, keys_manager_a) = make_node ! ( 0 ) ;
503
- let ( node_b, mut monitor_b, keys_manager_b) = make_node ! ( 1 ) ;
504
- let ( node_c, mut monitor_c, keys_manager_c) = make_node ! ( 2 ) ;
520
+ let ( node_a, mut monitor_a, keys_manager_a) = make_node ! ( 0 , fee_est_a ) ;
521
+ let ( node_b, mut monitor_b, keys_manager_b) = make_node ! ( 1 , fee_est_b ) ;
522
+ let ( node_c, mut monitor_c, keys_manager_c) = make_node ! ( 2 , fee_est_c ) ;
505
523
506
524
let mut nodes = [ node_a, node_b, node_c] ;
507
525
@@ -637,10 +655,10 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
637
655
had_events = true ;
638
656
match event {
639
657
events:: MessageSendEvent :: UpdateHTLCs { node_id, updates: CommitmentUpdate { update_add_htlcs, update_fail_htlcs, update_fulfill_htlcs, update_fail_malformed_htlcs, update_fee, commitment_signed } } => {
640
- for dest in nodes. iter( ) {
658
+ for ( idx , dest) in nodes. iter( ) . enumerate ( ) {
641
659
if dest. get_our_node_id( ) == node_id {
642
- assert!( update_fee. is_none( ) ) ;
643
660
for update_add in update_add_htlcs. iter( ) {
661
+ out. locked_write( format!( "Delivering update_add_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
644
662
if !$corrupt_forward {
645
663
dest. handle_update_add_htlc( & nodes[ $node] . get_our_node_id( ) , update_add) ;
646
664
} else {
@@ -655,14 +673,21 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
655
673
}
656
674
}
657
675
for update_fulfill in update_fulfill_htlcs. iter( ) {
676
+ out. locked_write( format!( "Delivering update_fulfill_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
658
677
dest. handle_update_fulfill_htlc( & nodes[ $node] . get_our_node_id( ) , update_fulfill) ;
659
678
}
660
679
for update_fail in update_fail_htlcs. iter( ) {
680
+ out. locked_write( format!( "Delivering update_fail_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
661
681
dest. handle_update_fail_htlc( & nodes[ $node] . get_our_node_id( ) , update_fail) ;
662
682
}
663
683
for update_fail_malformed in update_fail_malformed_htlcs. iter( ) {
684
+ out. locked_write( format!( "Delivering update_fail_malformed_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
664
685
dest. handle_update_fail_malformed_htlc( & nodes[ $node] . get_our_node_id( ) , update_fail_malformed) ;
665
686
}
687
+ if let Some ( msg) = update_fee {
688
+ out. locked_write( format!( "Delivering update_fee to node {}.\n " , idx) . as_bytes( ) ) ;
689
+ dest. handle_update_fee( & nodes[ $node] . get_our_node_id( ) , & msg) ;
690
+ }
666
691
let processed_change = !update_add_htlcs. is_empty( ) || !update_fulfill_htlcs. is_empty( ) ||
667
692
!update_fail_htlcs. is_empty( ) || !update_fail_malformed_htlcs. is_empty( ) ;
668
693
if $limit_events != ProcessMessages :: AllMessages && processed_change {
@@ -677,21 +702,24 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
677
702
} } ) ;
678
703
break ;
679
704
}
705
+ out. locked_write( format!( "Delivering commitment_signed to node {}.\n " , idx) . as_bytes( ) ) ;
680
706
dest. handle_commitment_signed( & nodes[ $node] . get_our_node_id( ) , & commitment_signed) ;
681
707
break ;
682
708
}
683
709
}
684
710
} ,
685
711
events:: MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
686
- for dest in nodes. iter( ) {
712
+ for ( idx , dest) in nodes. iter( ) . enumerate ( ) {
687
713
if dest. get_our_node_id( ) == * node_id {
714
+ out. locked_write( format!( "Delivering revoke_and_ack to node {}.\n " , idx) . as_bytes( ) ) ;
688
715
dest. handle_revoke_and_ack( & nodes[ $node] . get_our_node_id( ) , msg) ;
689
716
}
690
717
}
691
718
} ,
692
719
events:: MessageSendEvent :: SendChannelReestablish { ref node_id, ref msg } => {
693
- for dest in nodes. iter( ) {
720
+ for ( idx , dest) in nodes. iter( ) . enumerate ( ) {
694
721
if dest. get_our_node_id( ) == * node_id {
722
+ out. locked_write( format!( "Delivering channel_reestablish to node {}.\n " , idx) . as_bytes( ) ) ;
695
723
dest. handle_channel_reestablish( & nodes[ $node] . get_our_node_id( ) , msg) ;
696
724
}
697
725
}
@@ -824,7 +852,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
824
852
} }
825
853
}
826
854
827
- match get_slice ! ( 1 ) [ 0 ] {
855
+ let v = get_slice ! ( 1 ) [ 0 ] ;
856
+ out. locked_write ( format ! ( "READ A BYTE! HANDLING INPUT {:x}...........\n " , v) . as_bytes ( ) ) ;
857
+ match v {
828
858
// In general, we keep related message groups close together in binary form, allowing
829
859
// bit-twiddling mutations to have similar effects. This is probably overkill, but no
830
860
// harm in doing so.
@@ -928,7 +958,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
928
958
node_a_ser. 0 . clear ( ) ;
929
959
nodes[ 0 ] . write ( & mut node_a_ser) . unwrap ( ) ;
930
960
}
931
- let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a, keys_manager_a) ;
961
+ let ( new_node_a, new_monitor_a) = reload_node ! ( node_a_ser, 0 , monitor_a, keys_manager_a, fee_est_a ) ;
932
962
nodes[ 0 ] = new_node_a;
933
963
monitor_a = new_monitor_a;
934
964
} ,
@@ -947,7 +977,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
947
977
bc_events. clear ( ) ;
948
978
cb_events. clear ( ) ;
949
979
}
950
- let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b, keys_manager_b) ;
980
+ let ( new_node_b, new_monitor_b) = reload_node ! ( node_b_ser, 1 , monitor_b, keys_manager_b, fee_est_b ) ;
951
981
nodes[ 1 ] = new_node_b;
952
982
monitor_b = new_monitor_b;
953
983
} ,
@@ -961,7 +991,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
961
991
node_c_ser. 0 . clear ( ) ;
962
992
nodes[ 2 ] . write ( & mut node_c_ser) . unwrap ( ) ;
963
993
}
964
- let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c, keys_manager_c) ;
994
+ let ( new_node_c, new_monitor_c) = reload_node ! ( node_c_ser, 2 , monitor_c, keys_manager_c, fee_est_c ) ;
965
995
nodes[ 2 ] = new_node_c;
966
996
monitor_c = new_monitor_c;
967
997
} ,
@@ -1023,6 +1053,33 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1023
1053
0x6c => { send_hop_payment ( & nodes[ 0 ] , & nodes[ 1 ] , chan_a, & nodes[ 2 ] , chan_b, 1 , & mut payment_id) ; } ,
1024
1054
0x6d => { send_hop_payment ( & nodes[ 2 ] , & nodes[ 1 ] , chan_b, & nodes[ 0 ] , chan_a, 1 , & mut payment_id) ; } ,
1025
1055
1056
+ 0x80 => {
1057
+ let max_feerate = last_htlc_clear_fee_a * FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE as u32 ;
1058
+ if fee_est_a. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1059
+ fee_est_a. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1060
+ }
1061
+ nodes[ 0 ] . maybe_update_chan_fees ( ) ;
1062
+ } ,
1063
+ 0x81 => { fee_est_a. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 0 ] . maybe_update_chan_fees ( ) ; } ,
1064
+
1065
+ 0x84 => {
1066
+ let max_feerate = last_htlc_clear_fee_b * FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE as u32 ;
1067
+ if fee_est_b. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1068
+ fee_est_b. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1069
+ }
1070
+ nodes[ 1 ] . maybe_update_chan_fees ( ) ;
1071
+ } ,
1072
+ 0x85 => { fee_est_b. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 1 ] . maybe_update_chan_fees ( ) ; } ,
1073
+
1074
+ 0x88 => {
1075
+ let max_feerate = last_htlc_clear_fee_c * FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE as u32 ;
1076
+ if fee_est_c. ret_val . fetch_add ( 250 , atomic:: Ordering :: AcqRel ) + 250 > max_feerate {
1077
+ fee_est_c. ret_val . store ( max_feerate, atomic:: Ordering :: Release ) ;
1078
+ }
1079
+ nodes[ 2 ] . maybe_update_chan_fees ( ) ;
1080
+ } ,
1081
+ 0x89 => { fee_est_c. ret_val . store ( 253 , atomic:: Ordering :: Release ) ; nodes[ 2 ] . maybe_update_chan_fees ( ) ; } ,
1082
+
1026
1083
0xff => {
1027
1084
// Test that no channel is in a stuck state where neither party can send funds even
1028
1085
// after we resolve all pending events.
@@ -1078,6 +1135,10 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1078
1135
assert ! (
1079
1136
send_payment( & nodes[ 1 ] , & nodes[ 2 ] , chan_b, 10_000_000 , & mut payment_id) ||
1080
1137
send_payment( & nodes[ 2 ] , & nodes[ 1 ] , chan_b, 10_000_000 , & mut payment_id) ) ;
1138
+
1139
+ last_htlc_clear_fee_a = fee_est_a. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1140
+ last_htlc_clear_fee_b = fee_est_b. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1141
+ last_htlc_clear_fee_c = fee_est_c. ret_val . load ( atomic:: Ordering :: Acquire ) ;
1081
1142
} ,
1082
1143
_ => test_return ! ( ) ,
1083
1144
}
0 commit comments