Skip to content

Commit fb67798

Browse files
committed
Allow config defaults override for inbound channels
This commit introduces a config override struct parameter to the accept_inbound_channel methods. With manual channel acceptance enabled, users can modify the default configuration as needed.
1 parent 1b281f1 commit fb67798

8 files changed

+145
-40
lines changed

fuzz/src/chanmon_consistency.rs

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ use lightning::routing::router::{
6464
};
6565
use lightning::sign::{EntropySource, InMemorySigner, NodeSigner, Recipient, SignerProvider};
6666
use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
67+
use lightning::util::config::InboundChannelConfigOverrides;
6768
use lightning::util::config::UserConfig;
6869
use lightning::util::hash_tables::*;
6970
use lightning::util::logger::Logger;
@@ -809,6 +810,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
809810
temporary_channel_id,
810811
counterparty_node_id,
811812
user_channel_id,
813+
InboundChannelConfigOverrides::default(),
812814
)
813815
.unwrap();
814816
} else {

lightning/src/ln/async_signer_tests.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//! properly with a signer implementation that asynchronously derives signatures.
1212
1313
use crate::prelude::*;
14+
use crate::util::config::InboundChannelConfigOverrides;
1415
use bitcoin::secp256k1::Secp256k1;
1516
use bitcoin::{Transaction, TxOut, TxIn, Amount};
1617
use bitcoin::locktime::absolute::LockTime;
@@ -74,7 +75,7 @@ fn do_test_open_channel(zero_conf: bool) {
7475
match &events[0] {
7576
Event::OpenChannelRequest { temporary_channel_id, .. } => {
7677
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(
77-
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0)
78+
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default())
7879
.expect("Unable to accept inbound zero-conf channel");
7980
},
8081
ev => panic!("Expected OpenChannelRequest, not {:?}", ev)
@@ -319,7 +320,7 @@ fn do_test_funding_signed_0conf(signer_ops: Vec<SignerOp>) {
319320
match &events[0] {
320321
Event::OpenChannelRequest { temporary_channel_id, .. } => {
321322
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(
322-
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0)
323+
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default())
323324
.expect("Unable to accept inbound zero-conf channel");
324325
},
325326
ev => panic!("Expected OpenChannelRequest, not {:?}", ev)

lightning/src/ln/chanmon_update_fail_tests.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::ln::channel::AnnouncementSigsState;
2323
use crate::ln::msgs;
2424
use crate::ln::types::ChannelId;
2525
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
26+
use crate::util::config::InboundChannelConfigOverrides;
2627
use crate::util::test_channel_signer::TestChannelSigner;
2728
use crate::util::ser::{ReadableArgs, Writeable};
2829
use crate::util::test_utils::TestBroadcaster;
@@ -2775,9 +2776,9 @@ fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
27752776
match events[0] {
27762777
Event::OpenChannelRequest { temporary_channel_id, .. } => {
27772778
if use_0conf {
2778-
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2779+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
27792780
} else {
2780-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2781+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
27812782
}
27822783
},
27832784
_ => panic!("Unexpected event"),
@@ -2866,9 +2867,9 @@ fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: boo
28662867
match events[0] {
28672868
Event::OpenChannelRequest { temporary_channel_id, .. } => {
28682869
if use_0conf {
2869-
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2870+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
28702871
} else {
2871-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2872+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
28722873
}
28732874
},
28742875
_ => panic!("Unexpected event"),

lightning/src/ln/channelmanager.rs

+46-17
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ use crate::onion_message::messenger::{Destination, MessageRouter, Responder, Res
7878
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
7979
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8080
use crate::sign::ecdsa::EcdsaChannelSigner;
81-
use crate::util::config::{UserConfig, ChannelConfig, ChannelConfigUpdate};
81+
use crate::util::config::{ChannelConfig, ChannelConfigUpdate, InboundChannelConfigOverrides, UserConfig};
8282
use crate::util::wakers::{Future, Notifier};
8383
use crate::util::scid_utils::fake_scid;
8484
use crate::util::string::UntrustedString;
@@ -1852,6 +1852,7 @@ where
18521852
/// ```
18531853
/// # use bitcoin::secp256k1::PublicKey;
18541854
/// # use lightning::ln::channelmanager::AChannelManager;
1855+
/// # use lightning::util::config::InboundChannelConfigOverrides;
18551856
/// # use lightning::events::{Event, EventsProvider};
18561857
/// #
18571858
/// # fn is_trusted(counterparty_node_id: PublicKey) -> bool {
@@ -1877,7 +1878,7 @@ where
18771878
///
18781879
/// let user_channel_id = 43;
18791880
/// match channel_manager.accept_inbound_channel(
1880-
/// &temporary_channel_id, &counterparty_node_id, user_channel_id
1881+
/// &temporary_channel_id, &counterparty_node_id, user_channel_id, InboundChannelConfigOverrides::default()
18811882
/// ) {
18821883
/// Ok(()) => println!("Accepting channel {}", temporary_channel_id),
18831884
/// Err(e) => println!("Error accepting channel {}: {:?}", temporary_channel_id, e),
@@ -7699,8 +7700,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
76997700
///
77007701
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77017702
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7702-
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7703-
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, vec![], Weight::from_wu(0))
7703+
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: InboundChannelConfigOverrides) -> Result<(), APIError> {
7704+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, vec![], Weight::from_wu(0), config_overrides)
77047705
}
77057706

77067707
/// Accepts a request to open a channel after a [`events::Event::OpenChannelRequest`], treating
@@ -7721,15 +7722,19 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77217722
///
77227723
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77237724
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7724-
pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7725-
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, vec![], Weight::from_wu(0))
7725+
pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: InboundChannelConfigOverrides) -> Result<(), APIError> {
7726+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, vec![], Weight::from_wu(0), config_overrides)
77267727
}
77277728

77287729
fn do_accept_inbound_channel(
77297730
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
77307731
user_channel_id: u128, _funding_inputs: Vec<(TxIn, TransactionU16LenLimited)>,
7731-
_total_witness_weight: Weight,
7732+
_total_witness_weight: Weight, config_overrides: InboundChannelConfigOverrides
77327733
) -> Result<(), APIError> {
7734+
7735+
// Apply configuration overrides.
7736+
let config: UserConfig = config_overrides.apply(&self.default_configuration);
7737+
77337738
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), Some(*temporary_channel_id), None);
77347739
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
77357740

@@ -7759,7 +7764,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77597764
InboundV1Channel::new(
77607765
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
77617766
&self.channel_type_features(), &peer_state.latest_features, &open_channel_msg,
7762-
user_channel_id, &self.default_configuration, best_block_height, &self.logger, accept_0conf
7767+
user_channel_id, &config, best_block_height, &self.logger, accept_0conf
77637768
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
77647769
).map(|mut channel| {
77657770
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
@@ -14478,9 +14483,9 @@ mod tests {
1447814483
use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
1447914484
use crate::ln::types::ChannelId;
1448014485
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14481-
use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment, PaymentId, RecipientOnionFields, InterceptId};
14486+
use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, InboundChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
1448214487
use crate::ln::functional_test_utils::*;
14483-
use crate::ln::msgs::{self, ErrorAction};
14488+
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
1448414489
use crate::ln::msgs::ChannelMessageHandler;
1448514490
use crate::ln::outbound_payment::Retry;
1448614491
use crate::prelude::*;
@@ -15237,7 +15242,7 @@ mod tests {
1523715242
// Test the API functions.
1523815243
check_not_connected_to_peer_error(nodes[0].node.create_channel(unkown_public_key, 1_000_000, 500_000_000, 42, None, None), unkown_public_key);
1523915244

15240-
check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42), unkown_public_key);
15245+
check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42, InboundChannelConfigOverrides::default()), unkown_public_key);
1524115246

1524215247
check_unkown_peer_error(nodes[0].node.close_channel(&channel_id, &unkown_public_key), unkown_public_key);
1524315248

@@ -15268,7 +15273,7 @@ mod tests {
1526815273
let error_message = "Channel force-closed";
1526915274

1527015275
// Test the API functions.
15271-
check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42));
15276+
check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42, InboundChannelConfigOverrides::default()));
1527215277

1527315278
check_channel_unavailable_error(nodes[0].node.close_channel(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
1527415279

@@ -15459,7 +15464,7 @@ mod tests {
1545915464
let events = nodes[1].node.get_and_clear_pending_events();
1546015465
match events[0] {
1546115466
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15462-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23).unwrap();
15467+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23, InboundChannelConfigOverrides::default()).unwrap();
1546315468
}
1546415469
_ => panic!("Unexpected event"),
1546515470
}
@@ -15477,7 +15482,7 @@ mod tests {
1547715482
let events = nodes[1].node.get_and_clear_pending_events();
1547815483
match events[0] {
1547915484
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15480-
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23) {
15485+
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default()) {
1548115486
Err(APIError::APIMisuseError { err }) =>
1548215487
assert_eq!(err, "Too many peers with unfunded channels, refusing to accept new ones"),
1548315488
_ => panic!(),
@@ -15493,7 +15498,7 @@ mod tests {
1549315498
let events = nodes[1].node.get_and_clear_pending_events();
1549415499
match events[0] {
1549515500
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15496-
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23).unwrap();
15501+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default()).unwrap();
1549715502
}
1549815503
_ => panic!("Unexpected event"),
1549915504
}
@@ -15573,6 +15578,30 @@ mod tests {
1557315578

1557415579
#[test]
1557515580
fn test_inbound_anchors_manual_acceptance() {
15581+
test_inbound_anchors_manual_acceptance_with_override(InboundChannelConfigOverrides::default());
15582+
}
15583+
15584+
#[test]
15585+
fn test_inbound_anchors_manual_acceptance_overridden() {
15586+
let overrides = InboundChannelConfigOverrides {
15587+
max_inbound_htlc_value_in_flight_percent_of_channel: Some(5),
15588+
htlc_minimum_msat: Some(1000),
15589+
minimum_depth: Some(2),
15590+
to_self_delay: Some(200),
15591+
max_accepted_htlcs: Some(5),
15592+
channel_reserve_proportional_millionths: Some(20000),
15593+
};
15594+
15595+
let accept_message = test_inbound_anchors_manual_acceptance_with_override(overrides);
15596+
assert_eq!(accept_message.common_fields.max_htlc_value_in_flight_msat, 5_000_000);
15597+
assert_eq!(accept_message.common_fields.htlc_minimum_msat, 1_000);
15598+
assert_eq!(accept_message.common_fields.minimum_depth, 2);
15599+
assert_eq!(accept_message.common_fields.to_self_delay, 200);
15600+
assert_eq!(accept_message.common_fields.max_accepted_htlcs, 5);
15601+
assert_eq!(accept_message.channel_reserve_satoshis, 2_000);
15602+
}
15603+
15604+
fn test_inbound_anchors_manual_acceptance_with_override(config_overrides: InboundChannelConfigOverrides) -> AcceptChannel {
1557615605
// Tests that we properly limit inbound channels when we have the manual-channel-acceptance
1557715606
// flag set and (sometimes) accept channels as 0conf.
1557815607
let mut anchors_cfg = test_default_channel_config();
@@ -15609,10 +15638,10 @@ mod tests {
1560915638
let events = nodes[2].node.get_and_clear_pending_events();
1561015639
match events[0] {
1561115640
Event::OpenChannelRequest { temporary_channel_id, .. } =>
15612-
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23).unwrap(),
15641+
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23, config_overrides).unwrap(),
1561315642
_ => panic!("Unexpected event"),
1561415643
}
15615-
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
15644+
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id())
1561615645
}
1561715646

1561815647
#[test]

lightning/src/ln/functional_test_utils.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::onion_message::messenger::OnionMessenger;
2727
use crate::routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate};
2828
use crate::routing::router::{self, PaymentParameters, Route, RouteParameters};
2929
use crate::sign::{EntropySource, RandomBytes};
30-
use crate::util::config::{UserConfig, MaxDustHTLCExposure};
30+
use crate::util::config::{InboundChannelConfigOverrides, MaxDustHTLCExposure, UserConfig};
3131
#[cfg(test)]
3232
use crate::util::logger::Logger;
3333
use crate::util::scid_utils;
@@ -1321,7 +1321,7 @@ pub fn open_zero_conf_channel<'a, 'b, 'c, 'd>(initiator: &'a Node<'b, 'c, 'd>, r
13211321
assert_eq!(events.len(), 1);
13221322
match events[0] {
13231323
Event::OpenChannelRequest { temporary_channel_id, .. } => {
1324-
receiver.node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &initiator.node.get_our_node_id(), 0).unwrap();
1324+
receiver.node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &initiator.node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
13251325
},
13261326
_ => panic!("Unexpected event"),
13271327
};
@@ -1389,7 +1389,7 @@ pub fn exchange_open_accept_chan<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b:
13891389
assert_eq!(events.len(), 1);
13901390
match &events[0] {
13911391
Event::OpenChannelRequest { temporary_channel_id, counterparty_node_id, .. } =>
1392-
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42).unwrap(),
1392+
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42, InboundChannelConfigOverrides::default()).unwrap(),
13931393
_ => panic!("Unexpected event"),
13941394
};
13951395
}

0 commit comments

Comments
 (0)