@@ -22,7 +22,8 @@ use ln::channel::{COMMITMENT_TX_BASE_WEIGHT, COMMITMENT_TX_WEIGHT_PER_HTLC};
22
22
use ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , RAACommitmentOrder , PaymentSendFailure , BREAKDOWN_TIMEOUT , MIN_CLTV_EXPIRY_DELTA } ;
23
23
use ln:: channel:: { Channel , ChannelError } ;
24
24
use ln:: { chan_utils, onion_utils} ;
25
- use routing:: router:: { Route , RouteHop , get_route} ;
25
+ use routing:: router:: { Route , RouteHop , RouteHint , RouteHintHop , get_route} ;
26
+ use routing:: network_graph:: RoutingFees ;
26
27
use ln:: features:: { ChannelFeatures , InitFeatures , InvoiceFeatures , NodeFeatures } ;
27
28
use ln:: msgs;
28
29
use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler , HTLCFailChannelUpdate , ErrorAction } ;
@@ -7915,6 +7916,168 @@ fn test_announce_disable_channels() {
7915
7916
}
7916
7917
}
7917
7918
7919
+ #[ test]
7920
+ fn test_priv_forwarding_rejection ( ) {
7921
+ // If we have a private channel with outbound liquidity, and
7922
+ // UserConfig::accept_forwards_to_priv_channels is set to false, we should reject any attempts
7923
+ // to forward through that channel.
7924
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
7925
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
7926
+ let mut no_announce_cfg = test_default_channel_config ( ) ;
7927
+ no_announce_cfg. channel_options . announced_channel = false ;
7928
+ no_announce_cfg. accept_forwards_to_priv_channels = false ;
7929
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , Some ( no_announce_cfg) , None ] ) ;
7930
+ let persister: test_utils:: TestPersister ;
7931
+ let new_chain_monitor: test_utils:: TestChainMonitor ;
7932
+ let nodes_1_deserialized: ChannelManager < EnforcingSigner , & test_utils:: TestChainMonitor , & test_utils:: TestBroadcaster , & test_utils:: TestKeysInterface , & test_utils:: TestFeeEstimator , & test_utils:: TestLogger > ;
7933
+ let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
7934
+
7935
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 500_000_000 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
7936
+
7937
+ // Note that the create_*_chan functions in utils requires announcement_signatures, which we do
7938
+ // not send for private channels.
7939
+ nodes[ 1 ] . node . create_channel ( nodes[ 2 ] . node . get_our_node_id ( ) , 1_000_000 , 500_000_000 , 42 , None ) . unwrap ( ) ;
7940
+ let open_channel = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendOpenChannel , nodes[ 2 ] . node. get_our_node_id( ) ) ;
7941
+ nodes[ 2 ] . node . handle_open_channel ( & nodes[ 1 ] . node . get_our_node_id ( ) , InitFeatures :: known ( ) , & open_channel) ;
7942
+ let accept_channel = get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendAcceptChannel , nodes[ 1 ] . node. get_our_node_id( ) ) ;
7943
+ nodes[ 1 ] . node . handle_accept_channel ( & nodes[ 2 ] . node . get_our_node_id ( ) , InitFeatures :: known ( ) , & accept_channel) ;
7944
+
7945
+ let ( temporary_channel_id, tx, _) = create_funding_transaction ( & nodes[ 1 ] , 1_000_000 , 42 ) ;
7946
+ nodes[ 1 ] . node . funding_transaction_generated ( & temporary_channel_id, tx. clone ( ) ) . unwrap ( ) ;
7947
+ nodes[ 2 ] . node . handle_funding_created ( & nodes[ 1 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendFundingCreated , nodes[ 2 ] . node. get_our_node_id( ) ) ) ;
7948
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
7949
+
7950
+ nodes[ 1 ] . node . handle_funding_signed ( & nodes[ 2 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendFundingSigned , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
7951
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
7952
+
7953
+ let conf_height = core:: cmp:: max ( nodes[ 1 ] . best_block_info ( ) . 1 + 1 , nodes[ 2 ] . best_block_info ( ) . 1 + 1 ) ;
7954
+ confirm_transaction_at ( & nodes[ 1 ] , & tx, conf_height) ;
7955
+ connect_blocks ( & nodes[ 1 ] , CHAN_CONFIRM_DEPTH - 1 ) ;
7956
+ confirm_transaction_at ( & nodes[ 2 ] , & tx, conf_height) ;
7957
+ connect_blocks ( & nodes[ 2 ] , CHAN_CONFIRM_DEPTH - 1 ) ;
7958
+ let as_funding_locked = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendFundingLocked , nodes[ 2 ] . node. get_our_node_id( ) ) ;
7959
+ nodes[ 1 ] . node . handle_funding_locked ( & nodes[ 2 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendFundingLocked , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
7960
+ get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 2 ] . node. get_our_node_id( ) ) ;
7961
+ nodes[ 2 ] . node . handle_funding_locked ( & nodes[ 1 ] . node . get_our_node_id ( ) , & as_funding_locked) ;
7962
+ get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
7963
+
7964
+ assert ! ( nodes[ 0 ] . node. list_usable_channels( ) [ 0 ] . is_public) ;
7965
+ assert_eq ! ( nodes[ 1 ] . node. list_usable_channels( ) . len( ) , 2 ) ;
7966
+ assert ! ( !nodes[ 2 ] . node. list_usable_channels( ) [ 0 ] . is_public) ;
7967
+
7968
+ // We should always be able to forward through nodes[1] as long as its out through a public
7969
+ // channel:
7970
+ send_payment ( & nodes[ 2 ] , & [ & nodes[ 1 ] , & nodes[ 0 ] ] , 10_000 ) ;
7971
+
7972
+ // ... however, if we send to nodes[2], we will have to pass the private channel from nodes[1]
7973
+ // to nodes[2], which should be rejected:
7974
+ let ( our_payment_preimage, our_payment_hash, our_payment_secret) = get_payment_preimage_hash ! ( nodes[ 2 ] ) ;
7975
+ let route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) ,
7976
+ & nodes[ 0 ] . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) ,
7977
+ & nodes[ 2 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None ,
7978
+ & [ & RouteHint ( vec ! [ RouteHintHop {
7979
+ src_node_id: nodes[ 1 ] . node. get_our_node_id( ) ,
7980
+ short_channel_id: nodes[ 2 ] . node. list_channels( ) [ 0 ] . short_channel_id. unwrap( ) ,
7981
+ fees: RoutingFees { base_msat: 1000 , proportional_millionths: 0 } ,
7982
+ cltv_expiry_delta: MIN_CLTV_EXPIRY_DELTA ,
7983
+ htlc_minimum_msat: None ,
7984
+ htlc_maximum_msat: None ,
7985
+ } ] ) ] , 10_000 , TEST_FINAL_CLTV , nodes[ 0 ] . logger ) . unwrap ( ) ;
7986
+
7987
+ nodes[ 0 ] . node . send_payment ( & route, our_payment_hash, & Some ( our_payment_secret) ) . unwrap ( ) ;
7988
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
7989
+ let payment_event = SendEvent :: from_event ( nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
7990
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
7991
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , payment_event. commitment_msg, false , true ) ;
7992
+
7993
+ let htlc_fail_updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
7994
+ assert ! ( htlc_fail_updates. update_add_htlcs. is_empty( ) ) ;
7995
+ assert_eq ! ( htlc_fail_updates. update_fail_htlcs. len( ) , 1 ) ;
7996
+ assert ! ( htlc_fail_updates. update_fail_malformed_htlcs. is_empty( ) ) ;
7997
+ assert ! ( htlc_fail_updates. update_fee. is_none( ) ) ;
7998
+
7999
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & htlc_fail_updates. update_fail_htlcs [ 0 ] ) ;
8000
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , htlc_fail_updates. commitment_signed, true , true ) ;
8001
+ expect_payment_failed ! ( nodes[ 0 ] , our_payment_hash, false ) ;
8002
+ expect_payment_failure_chan_update ! ( nodes[ 0 ] , nodes[ 2 ] . node. list_channels( ) [ 0 ] . short_channel_id. unwrap( ) , true ) ;
8003
+
8004
+ // Now disconnect nodes[1] from its peers and restart with accept_forwards_to_priv_channels set
8005
+ // to true. Sadly there is currently no way to change it at runtime.
8006
+
8007
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
8008
+ nodes[ 2 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
8009
+
8010
+ let nodes_1_serialized = nodes[ 1 ] . node . encode ( ) ;
8011
+ let mut monitor_a_serialized = test_utils:: TestVecWriter ( Vec :: new ( ) ) ;
8012
+ let mut monitor_b_serialized = test_utils:: TestVecWriter ( Vec :: new ( ) ) ;
8013
+ {
8014
+ let mons = nodes[ 1 ] . chain_monitor . chain_monitor . monitors . read ( ) . unwrap ( ) ;
8015
+ let mut mon_iter = mons. iter ( ) ;
8016
+ mon_iter. next ( ) . unwrap ( ) . 1 . write ( & mut monitor_a_serialized) . unwrap ( ) ;
8017
+ mon_iter. next ( ) . unwrap ( ) . 1 . write ( & mut monitor_b_serialized) . unwrap ( ) ;
8018
+ }
8019
+
8020
+ persister = test_utils:: TestPersister :: new ( ) ;
8021
+ let keys_manager = & chanmon_cfgs[ 1 ] . keys_manager ;
8022
+ new_chain_monitor = test_utils:: TestChainMonitor :: new ( Some ( nodes[ 1 ] . chain_source ) , nodes[ 1 ] . tx_broadcaster . clone ( ) , nodes[ 1 ] . logger , node_cfgs[ 1 ] . fee_estimator , & persister, keys_manager) ;
8023
+ nodes[ 1 ] . chain_monitor = & new_chain_monitor;
8024
+
8025
+ let mut monitor_a_read = & monitor_a_serialized. 0 [ ..] ;
8026
+ let mut monitor_b_read = & monitor_b_serialized. 0 [ ..] ;
8027
+ let ( _, mut monitor_a) = <( BlockHash , ChannelMonitor < EnforcingSigner > ) >:: read ( & mut monitor_a_read, keys_manager) . unwrap ( ) ;
8028
+ let ( _, mut monitor_b) = <( BlockHash , ChannelMonitor < EnforcingSigner > ) >:: read ( & mut monitor_b_read, keys_manager) . unwrap ( ) ;
8029
+ assert ! ( monitor_a_read. is_empty( ) ) ;
8030
+ assert ! ( monitor_b_read. is_empty( ) ) ;
8031
+
8032
+ no_announce_cfg. accept_forwards_to_priv_channels = true ;
8033
+
8034
+ let mut nodes_1_read = & nodes_1_serialized[ ..] ;
8035
+ let ( _, nodes_1_deserialized_tmp) = {
8036
+ let mut channel_monitors = HashMap :: new ( ) ;
8037
+ channel_monitors. insert ( monitor_a. get_funding_txo ( ) . 0 , & mut monitor_a) ;
8038
+ channel_monitors. insert ( monitor_b. get_funding_txo ( ) . 0 , & mut monitor_b) ;
8039
+ <( BlockHash , ChannelManager < EnforcingSigner , & test_utils:: TestChainMonitor , & test_utils:: TestBroadcaster , & test_utils:: TestKeysInterface , & test_utils:: TestFeeEstimator , & test_utils:: TestLogger > ) >:: read ( & mut nodes_1_read, ChannelManagerReadArgs {
8040
+ default_config : no_announce_cfg,
8041
+ keys_manager,
8042
+ fee_estimator : node_cfgs[ 1 ] . fee_estimator ,
8043
+ chain_monitor : nodes[ 1 ] . chain_monitor ,
8044
+ tx_broadcaster : nodes[ 1 ] . tx_broadcaster . clone ( ) ,
8045
+ logger : nodes[ 1 ] . logger ,
8046
+ channel_monitors,
8047
+ } ) . unwrap ( )
8048
+ } ;
8049
+ assert ! ( nodes_1_read. is_empty( ) ) ;
8050
+ nodes_1_deserialized = nodes_1_deserialized_tmp;
8051
+
8052
+ assert ! ( nodes[ 1 ] . chain_monitor. watch_channel( monitor_a. get_funding_txo( ) . 0 , monitor_a) . is_ok( ) ) ;
8053
+ assert ! ( nodes[ 1 ] . chain_monitor. watch_channel( monitor_b. get_funding_txo( ) . 0 , monitor_b) . is_ok( ) ) ;
8054
+ check_added_monitors ! ( nodes[ 1 ] , 2 ) ;
8055
+ nodes[ 1 ] . node = & nodes_1_deserialized;
8056
+
8057
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
8058
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: empty ( ) } ) ;
8059
+ let as_reestablish = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
8060
+ let bs_reestablish = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
8061
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_reestablish) ;
8062
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_reestablish) ;
8063
+ get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
8064
+ get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
8065
+
8066
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 2 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
8067
+ nodes[ 2 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: empty ( ) } ) ;
8068
+ let bs_reestablish = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 2 ] . node. get_our_node_id( ) ) ;
8069
+ let cs_reestablish = get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
8070
+ nodes[ 2 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_reestablish) ;
8071
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 2 ] . node . get_our_node_id ( ) , & cs_reestablish) ;
8072
+ get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 2 ] . node. get_our_node_id( ) ) ;
8073
+ get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
8074
+
8075
+ nodes[ 0 ] . node . send_payment ( & route, our_payment_hash, & Some ( our_payment_secret) ) . unwrap ( ) ;
8076
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
8077
+ pass_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 2 ] ] ] , 10_000 , our_payment_hash, our_payment_secret) ;
8078
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , our_payment_preimage) ;
8079
+ }
8080
+
7918
8081
#[ test]
7919
8082
fn test_bump_penalty_txn_on_revoked_commitment ( ) {
7920
8083
// In case of penalty txn with too low feerates for getting into mempools, RBF-bump them to be sure
0 commit comments