@@ -3835,6 +3835,244 @@ mod tests {
3835
3835
}
3836
3836
}
3837
3837
3838
+ #[ test]
3839
+ fn channel_reserve_test ( ) {
3840
+ use util:: rng;
3841
+ use std:: sync:: atomic:: Ordering ;
3842
+ use ln:: msgs:: HandleError ;
3843
+
3844
+ macro_rules! get_channel_value_stat {
3845
+ ( $node: expr, $channel_id: expr) => { {
3846
+ let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
3847
+ let chan = chan_lock. by_id. get( & $channel_id) . unwrap( ) ;
3848
+ chan. get_value_stat( )
3849
+ } }
3850
+ }
3851
+
3852
+ let mut nodes = create_network ( 3 ) ;
3853
+ let chan_1 = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1900 , 1001 ) ;
3854
+ let chan_2 = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1900 , 1001 ) ;
3855
+
3856
+ let mut stat01 = get_channel_value_stat ! ( nodes[ 0 ] , chan_1. 2 ) ;
3857
+ let mut stat11 = get_channel_value_stat ! ( nodes[ 1 ] , chan_1. 2 ) ;
3858
+
3859
+ let mut stat12 = get_channel_value_stat ! ( nodes[ 1 ] , chan_2. 2 ) ;
3860
+ let mut stat22 = get_channel_value_stat ! ( nodes[ 2 ] , chan_2. 2 ) ;
3861
+
3862
+ macro_rules! get_route_and_payment_hash {
3863
+ ( $recv_value: expr) => { {
3864
+ let route = nodes[ 0 ] . router. get_route( & nodes. last( ) . unwrap( ) . node. get_our_node_id( ) , None , & Vec :: new( ) , $recv_value, TEST_FINAL_CLTV ) . unwrap( ) ;
3865
+ let payment_preimage = [ * nodes[ 0 ] . network_payment_count. borrow( ) ; 32 ] ;
3866
+ * nodes[ 0 ] . network_payment_count. borrow_mut( ) += 1 ;
3867
+ let payment_hash = {
3868
+ let mut sha = Sha256 :: new( ) ;
3869
+ sha. input( & payment_preimage[ ..] ) ;
3870
+ let mut ret = [ 0 ; 32 ] ;
3871
+ sha. result( & mut ret) ;
3872
+ ret
3873
+ } ;
3874
+ ( route, payment_hash, payment_preimage)
3875
+ } }
3876
+ } ;
3877
+
3878
+ macro_rules! expect_pending_htlcs_forwardable {
3879
+ ( $node: expr) => { {
3880
+ let events = $node. node. get_and_clear_pending_events( ) ;
3881
+ assert_eq!( events. len( ) , 1 ) ;
3882
+ match events[ 0 ] {
3883
+ Event :: PendingHTLCsForwardable { .. } => { } ,
3884
+ _ => panic!( "Unexpected event" ) ,
3885
+ } ;
3886
+ $node. node. channel_state. lock( ) . unwrap( ) . next_forward = Instant :: now( ) ;
3887
+ $node. node. process_pending_htlc_forwards( ) ;
3888
+ } }
3889
+ } ;
3890
+
3891
+ macro_rules! expect_forward {
3892
+ ( $node: expr) => { {
3893
+ let mut events = $node. node. get_and_clear_pending_events( ) ;
3894
+ assert_eq!( events. len( ) , 1 ) ;
3895
+ let payment_event = SendEvent :: from_event( events. remove( 0 ) ) ;
3896
+ assert_eq!( payment_event. msgs. len( ) , 1 ) ;
3897
+ check_added_monitors!( $node, 1 ) ;
3898
+ payment_event
3899
+ } }
3900
+ }
3901
+
3902
+ macro_rules! expect_payment_received {
3903
+ ( $node: expr, $expected_payment_hash: expr, $expected_recv_value: expr) => {
3904
+ let events = $node. node. get_and_clear_pending_events( ) ;
3905
+ assert_eq!( events. len( ) , 1 ) ;
3906
+ match events[ 0 ] {
3907
+ Event :: PaymentReceived { ref payment_hash, amt } => {
3908
+ assert_eq!( $expected_payment_hash, * payment_hash) ;
3909
+ assert_eq!( $expected_recv_value, amt) ;
3910
+ } ,
3911
+ _ => panic!( "Unexpected event" ) ,
3912
+ }
3913
+ }
3914
+ } ;
3915
+
3916
+ let feemsat = 239 ; // somehow we know?
3917
+ let total_fee_msat = ( nodes. len ( ) - 2 ) as u64 * 239 ;
3918
+
3919
+ let recv_value_0 = stat01. their_max_htlc_value_in_flight_msat - total_fee_msat;
3920
+
3921
+ // attempt to send amt_msat > their_max_htlc_value_in_flight_msat
3922
+ {
3923
+ let ( route, our_payment_hash, _) = get_route_and_payment_hash ! ( recv_value_0 + 1 ) ;
3924
+ assert ! ( route. hops. iter( ) . rev( ) . skip( 1 ) . all( |h| h. fee_msat == feemsat) ) ;
3925
+ let err = nodes[ 0 ] . node . send_payment ( route, our_payment_hash) . err ( ) . unwrap ( ) ;
3926
+ match err {
3927
+ APIError :: RouteError { err} => assert_eq ! ( err, "Cannot send value that would put us over our max HTLC value in flight" ) ,
3928
+ _ => panic ! ( "Unknown error variants" ) ,
3929
+ }
3930
+ }
3931
+
3932
+ let mut htlc_id = 0 ;
3933
+ // channel reserve is bigger than max_htlc_msat so loop to deplete
3934
+ // nodes[0]'s wealth
3935
+ loop {
3936
+ let amt_msat = recv_value_0 + total_fee_msat;
3937
+ if stat01. value_to_self_msat - amt_msat < stat01. channel_reserve_msat {
3938
+ break ;
3939
+ }
3940
+ send_payment ( & nodes[ 0 ] , & vec ! [ & nodes[ 1 ] , & nodes[ 2 ] ] [ ..] , recv_value_0) ;
3941
+ htlc_id += 1 ;
3942
+
3943
+ let ( stat01_, stat11_, stat12_, stat22_) = (
3944
+ get_channel_value_stat ! ( nodes[ 0 ] , chan_1. 2 ) ,
3945
+ get_channel_value_stat ! ( nodes[ 1 ] , chan_1. 2 ) ,
3946
+ get_channel_value_stat ! ( nodes[ 1 ] , chan_2. 2 ) ,
3947
+ get_channel_value_stat ! ( nodes[ 2 ] , chan_2. 2 ) ,
3948
+ ) ;
3949
+
3950
+ assert_eq ! ( stat01_. value_to_self_msat, stat01. value_to_self_msat - amt_msat) ;
3951
+ assert_eq ! ( stat11_. value_to_self_msat, stat11. value_to_self_msat + amt_msat) ;
3952
+ assert_eq ! ( stat12_. value_to_self_msat, stat12. value_to_self_msat - ( amt_msat - feemsat) ) ;
3953
+ assert_eq ! ( stat22_. value_to_self_msat, stat22. value_to_self_msat + ( amt_msat - feemsat) ) ;
3954
+ stat01 = stat01_; stat11 = stat11_; stat12 = stat12_; stat22 = stat22_;
3955
+ }
3956
+
3957
+ {
3958
+ let recv_value = stat01. value_to_self_msat - stat01. channel_reserve_msat - total_fee_msat;
3959
+ // attempt to get channel_reserve violation
3960
+ let ( route, our_payment_hash, _) = get_route_and_payment_hash ! ( recv_value + 1 ) ;
3961
+ let err = nodes[ 0 ] . node . send_payment ( route. clone ( ) , our_payment_hash) . err ( ) . unwrap ( ) ;
3962
+ match err {
3963
+ APIError :: RouteError { err} => assert_eq ! ( err, "Cannot send value that would put us over our reserve value" ) ,
3964
+ _ => panic ! ( "Unknown error variants" ) ,
3965
+ }
3966
+ }
3967
+
3968
+ // adding pending output
3969
+ let recv_value_1 = ( stat01. value_to_self_msat - stat01. channel_reserve_msat - total_fee_msat) /2 ;
3970
+ let amt_msat_1 = recv_value_1 + total_fee_msat;
3971
+
3972
+ let ( route_1, our_payment_hash_1, our_payment_preimage_1) = get_route_and_payment_hash ! ( recv_value_1) ;
3973
+ let payment_event = {
3974
+ nodes[ 0 ] . node . send_payment ( route_1, our_payment_hash_1) . unwrap ( ) ;
3975
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3976
+
3977
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
3978
+ assert_eq ! ( events. len( ) , 1 ) ;
3979
+ SendEvent :: from_event ( events. remove ( 0 ) )
3980
+ } ;
3981
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) . unwrap ( ) ;
3982
+
3983
+ let recv_value_2 = stat01. value_to_self_msat - amt_msat_1 - stat01. channel_reserve_msat - total_fee_msat;
3984
+ {
3985
+ let ( route, our_payment_hash, _) = get_route_and_payment_hash ! ( recv_value_2 + 1 ) ;
3986
+ match nodes[ 0 ] . node . send_payment ( route, our_payment_hash) . err ( ) . unwrap ( ) {
3987
+ APIError :: RouteError { err} => assert_eq ! ( err, "Cannot send value that would put us over our reserve value" ) ,
3988
+ _ => panic ! ( "Unknown error variants" ) ,
3989
+ }
3990
+ }
3991
+
3992
+ {
3993
+ // test channel_reserve test on nodes[1] side
3994
+ let ( route, our_payment_hash, _) = get_route_and_payment_hash ! ( recv_value_2 + 1 ) ;
3995
+
3996
+ // Need to manually create update_add_htlc message to go around the channel reserve check in send_htlc()
3997
+ let secp_ctx = Secp256k1 :: new ( ) ;
3998
+ let session_priv = SecretKey :: from_slice ( & secp_ctx, & {
3999
+ let mut session_key = [ 0 ; 32 ] ;
4000
+ rng:: fill_bytes ( & mut session_key) ;
4001
+ session_key
4002
+ } ) . expect ( "RNG is bad!" ) ;
4003
+
4004
+ let cur_height = nodes[ 0 ] . node . latest_block_height . load ( Ordering :: Acquire ) as u32 + 1 ;
4005
+ let onion_keys = ChannelManager :: construct_onion_keys ( & secp_ctx, & route, & session_priv) . unwrap ( ) ;
4006
+ let ( onion_payloads, htlc_msat, htlc_cltv) = ChannelManager :: build_onion_payloads ( & route, cur_height) . unwrap ( ) ;
4007
+ let onion_packet = ChannelManager :: construct_onion_packet ( onion_payloads, onion_keys, & our_payment_hash) ;
4008
+ let msg = msgs:: UpdateAddHTLC {
4009
+ channel_id : chan_1. 2 ,
4010
+ htlc_id,
4011
+ amount_msat : htlc_msat,
4012
+ payment_hash : our_payment_hash,
4013
+ cltv_expiry : htlc_cltv,
4014
+ onion_routing_packet : onion_packet,
4015
+ } ;
4016
+
4017
+ let err = nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msg) . err ( ) . unwrap ( ) ;
4018
+ match err {
4019
+ HandleError { err, .. } => assert_eq ! ( err, "Remote HTLC add would put them over their reserve value" ) ,
4020
+ }
4021
+ }
4022
+
4023
+ // now see if it goes through on both sides
4024
+ let ( route_2, our_payment_hash_2, our_payment_preimage_2) = get_route_and_payment_hash ! ( recv_value_2) ;
4025
+ // but this will stuck the in the holding cell b/c nodes[0] is in
4026
+ // AwaitingRemoteRevoke state
4027
+ nodes[ 0 ] . node . send_payment ( route_2, our_payment_hash_2) . unwrap ( ) ;
4028
+ check_added_monitors ! ( nodes[ 0 ] , 0 ) ;
4029
+ let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
4030
+ assert_eq ! ( events. len( ) , 0 ) ;
4031
+
4032
+ check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
4033
+ let ( as_revoke_and_ack, as_commitment_signed) = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. commitment_msg ) . unwrap ( ) ;
4034
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4035
+ check_added_monitors ! ( nodes[ 0 ] , 0 ) ;
4036
+ let commitment_update_2 = nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & as_revoke_and_ack) . unwrap ( ) . unwrap ( ) ;
4037
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4038
+ let ( bs_revoke_and_ack, bs_none) = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & as_commitment_signed. unwrap ( ) ) . unwrap ( ) ;
4039
+ assert ! ( bs_none. is_none( ) ) ;
4040
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4041
+ assert ! ( nodes[ 1 ] . node. handle_revoke_and_ack( & nodes[ 0 ] . node. get_our_node_id( ) , & bs_revoke_and_ack) . unwrap( ) . is_none( ) ) ;
4042
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4043
+
4044
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
4045
+
4046
+ let payment_event_1 = expect_forward ! ( nodes[ 1 ] ) ;
4047
+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1. msgs [ 0 ] ) . unwrap ( ) ;
4048
+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , & payment_event_1. commitment_msg, false ) ;
4049
+
4050
+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
4051
+ expect_payment_received ! ( nodes[ 2 ] , our_payment_hash_1, recv_value_1) ;
4052
+
4053
+ // second payment
4054
+ assert_eq ! ( commitment_update_2. update_add_htlcs. len( ) , 1 ) ;
4055
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & commitment_update_2. update_add_htlcs [ 0 ] ) . unwrap ( ) ;
4056
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & commitment_update_2. commitment_signed, false ) ;
4057
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
4058
+
4059
+ let payment_event_2 = expect_forward ! ( nodes[ 1 ] ) ;
4060
+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_2. msgs [ 0 ] ) . unwrap ( ) ;
4061
+
4062
+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , & payment_event_2. commitment_msg, false ) ;
4063
+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
4064
+
4065
+ expect_payment_received ! ( nodes[ 2 ] , our_payment_hash_2, recv_value_2) ;
4066
+
4067
+ claim_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] , & nodes[ 2 ] ) , our_payment_preimage_1) ;
4068
+ claim_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] , & nodes[ 2 ] ) , our_payment_preimage_2) ;
4069
+
4070
+ let expected_value_to_self = stat01. value_to_self_msat - ( recv_value_1 + total_fee_msat) - ( recv_value_2 + total_fee_msat) ;
4071
+ let stat = get_channel_value_stat ! ( nodes[ 0 ] , chan_1. 2 ) ;
4072
+ assert_eq ! ( stat. value_to_self_msat, expected_value_to_self) ;
4073
+ assert_eq ! ( stat. value_to_self_msat, stat. channel_reserve_msat) ;
4074
+ }
4075
+
3838
4076
#[ test]
3839
4077
fn channel_monitor_network_test ( ) {
3840
4078
// Simple test which builds a network of ChannelManagers, connects them to each other, and
0 commit comments