Skip to content

Commit cdc8e21

Browse files
authored
Merge pull request #3596 from joostjager/inbound-channel-config-override
Allow to override config defaults for inbound channels on a per-channel basis
2 parents 2d2c542 + 02861dd commit cdc8e21

8 files changed

+253
-55
lines changed

fuzz/src/chanmon_consistency.rs

+1
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
809809
temporary_channel_id,
810810
counterparty_node_id,
811811
user_channel_id,
812+
None,
812813
)
813814
.unwrap();
814815
} else {

lightning/src/ln/async_signer_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ fn do_test_open_channel(zero_conf: bool) {
7474
match &events[0] {
7575
Event::OpenChannelRequest { temporary_channel_id, .. } => {
7676
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(
77-
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0)
77+
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None)
7878
.expect("Unable to accept inbound zero-conf channel");
7979
},
8080
ev => panic!("Expected OpenChannelRequest, not {:?}", ev)
@@ -319,7 +319,7 @@ fn do_test_funding_signed_0conf(signer_ops: Vec<SignerOp>) {
319319
match &events[0] {
320320
Event::OpenChannelRequest { temporary_channel_id, .. } => {
321321
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(
322-
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0)
322+
temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None)
323323
.expect("Unable to accept inbound zero-conf channel");
324324
},
325325
ev => panic!("Expected OpenChannelRequest, not {:?}", ev)

lightning/src/ln/chanmon_update_fail_tests.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -2775,9 +2775,9 @@ fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
27752775
match events[0] {
27762776
Event::OpenChannelRequest { temporary_channel_id, .. } => {
27772777
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();
2778+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None).unwrap();
27792779
} else {
2780-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2780+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None).unwrap();
27812781
}
27822782
},
27832783
_ => panic!("Unexpected event"),
@@ -2866,9 +2866,9 @@ fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: boo
28662866
match events[0] {
28672867
Event::OpenChannelRequest { temporary_channel_id, .. } => {
28682868
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();
2869+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None).unwrap();
28702870
} else {
2871-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0).unwrap();
2871+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 0, None).unwrap();
28722872
}
28732873
},
28742874
_ => panic!("Unexpected event"),

lightning/src/ln/channelmanager.rs

+56-19
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ use crate::onion_message::messenger::{Destination, MessageRouter, Responder, Res
8080
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
8181
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8282
use crate::sign::ecdsa::EcdsaChannelSigner;
83-
use crate::util::config::{UserConfig, ChannelConfig, ChannelConfigUpdate};
83+
use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelConfigOverrides, UserConfig};
8484
use crate::util::wakers::{Future, Notifier};
8585
use crate::util::scid_utils::fake_scid;
8686
use crate::util::string::UntrustedString;
@@ -1902,7 +1902,7 @@ where
19021902
///
19031903
/// let user_channel_id = 43;
19041904
/// match channel_manager.accept_inbound_channel(
1905-
/// &temporary_channel_id, &counterparty_node_id, user_channel_id
1905+
/// &temporary_channel_id, &counterparty_node_id, user_channel_id, None
19061906
/// ) {
19071907
/// Ok(()) => println!("Accepting channel {}", temporary_channel_id),
19081908
/// Err(e) => println!("Error accepting channel {}: {:?}", temporary_channel_id, e),
@@ -7755,8 +7755,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77557755
///
77567756
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77577757
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7758-
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7759-
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id)
7758+
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>) -> Result<(), APIError> {
7759+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, config_overrides)
77607760
}
77617761

77627762
/// Accepts a request to open a channel after a [`events::Event::OpenChannelRequest`], treating
@@ -7777,15 +7777,23 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77777777
///
77787778
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77797779
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7780-
pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7781-
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id)
7780+
pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>) -> Result<(), APIError> {
7781+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, config_overrides)
77827782
}
77837783

77847784
/// TODO(dual_funding): Allow contributions, pass intended amount and inputs
77857785
fn do_accept_inbound_channel(
77867786
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
7787-
user_channel_id: u128,
7787+
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>
77887788
) -> Result<(), APIError> {
7789+
7790+
let mut config = self.default_configuration.clone();
7791+
7792+
// Apply configuration overrides.
7793+
if let Some(overrides) = config_overrides {
7794+
config.apply(&overrides);
7795+
};
7796+
77897797
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), Some(*temporary_channel_id), None);
77907798
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
77917799

@@ -7815,7 +7823,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
78157823
InboundV1Channel::new(
78167824
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
78177825
&self.channel_type_features(), &peer_state.latest_features, &open_channel_msg,
7818-
user_channel_id, &self.default_configuration, best_block_height, &self.logger, accept_0conf
7826+
user_channel_id, &config, best_block_height, &self.logger, accept_0conf
78197827
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
78207828
).map(|mut channel| {
78217829
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
@@ -7835,7 +7843,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
78357843
self.get_our_node_id(), *counterparty_node_id,
78367844
&self.channel_type_features(), &peer_state.latest_features,
78377845
&open_channel_msg,
7838-
user_channel_id, &self.default_configuration, best_block_height,
7846+
user_channel_id, &config, best_block_height,
78397847
&self.logger,
78407848
).map_err(|_| MsgHandleErrInternal::from_chan_no_close(
78417849
ChannelError::Close(
@@ -14657,17 +14665,17 @@ mod tests {
1465714665
use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
1465814666
use crate::ln::types::ChannelId;
1465914667
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14660-
use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment, PaymentId, RecipientOnionFields, InterceptId};
14668+
use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
1466114669
use crate::ln::functional_test_utils::*;
14662-
use crate::ln::msgs::{self, ErrorAction};
14670+
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
1466314671
use crate::ln::msgs::ChannelMessageHandler;
1466414672
use crate::ln::outbound_payment::Retry;
1466514673
use crate::prelude::*;
1466614674
use crate::routing::router::{PaymentParameters, RouteParameters, find_route};
1466714675
use crate::util::errors::APIError;
1466814676
use crate::util::ser::Writeable;
1466914677
use crate::util::test_utils;
14670-
use crate::util::config::{ChannelConfig, ChannelConfigUpdate};
14678+
use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelHandshakeConfigUpdate};
1467114679
use crate::sign::EntropySource;
1467214680

1467314681
#[test]
@@ -15480,7 +15488,7 @@ mod tests {
1548015488
// Test the API functions.
1548115489
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);
1548215490

15483-
check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42), unkown_public_key);
15491+
check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42, None), unkown_public_key);
1548415492

1548515493
check_unkown_peer_error(nodes[0].node.close_channel(&channel_id, &unkown_public_key), unkown_public_key);
1548615494

@@ -15511,7 +15519,7 @@ mod tests {
1551115519
let error_message = "Channel force-closed";
1551215520

1551315521
// Test the API functions.
15514-
check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42));
15522+
check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42, None));
1551515523

1551615524
check_channel_unavailable_error(nodes[0].node.close_channel(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
1551715525

@@ -15702,7 +15710,7 @@ mod tests {
1570215710
let events = nodes[1].node.get_and_clear_pending_events();
1570315711
match events[0] {
1570415712
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15705-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23).unwrap();
15713+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23, None).unwrap();
1570615714
}
1570715715
_ => panic!("Unexpected event"),
1570815716
}
@@ -15720,7 +15728,7 @@ mod tests {
1572015728
let events = nodes[1].node.get_and_clear_pending_events();
1572115729
match events[0] {
1572215730
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15723-
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23) {
15731+
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23, None) {
1572415732
Err(APIError::APIMisuseError { err }) =>
1572515733
assert_eq!(err, "Too many peers with unfunded channels, refusing to accept new ones"),
1572615734
_ => panic!(),
@@ -15736,7 +15744,7 @@ mod tests {
1573615744
let events = nodes[1].node.get_and_clear_pending_events();
1573715745
match events[0] {
1573815746
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15739-
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23).unwrap();
15747+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23, None).unwrap();
1574015748
}
1574115749
_ => panic!("Unexpected event"),
1574215750
}
@@ -15819,6 +15827,33 @@ mod tests {
1581915827

1582015828
#[test]
1582115829
fn test_inbound_anchors_manual_acceptance() {
15830+
test_inbound_anchors_manual_acceptance_with_override(None);
15831+
}
15832+
15833+
#[test]
15834+
fn test_inbound_anchors_manual_acceptance_overridden() {
15835+
let overrides = ChannelConfigOverrides {
15836+
handshake_overrides: Some(ChannelHandshakeConfigUpdate {
15837+
max_inbound_htlc_value_in_flight_percent_of_channel: Some(5),
15838+
htlc_minimum_msat: Some(1000),
15839+
minimum_depth: Some(2),
15840+
to_self_delay: Some(200),
15841+
max_accepted_htlcs: Some(5),
15842+
channel_reserve_proportional_millionths: Some(20000),
15843+
}),
15844+
update_overrides: None,
15845+
};
15846+
15847+
let accept_message = test_inbound_anchors_manual_acceptance_with_override(Some(overrides));
15848+
assert_eq!(accept_message.common_fields.max_htlc_value_in_flight_msat, 5_000_000);
15849+
assert_eq!(accept_message.common_fields.htlc_minimum_msat, 1_000);
15850+
assert_eq!(accept_message.common_fields.minimum_depth, 2);
15851+
assert_eq!(accept_message.common_fields.to_self_delay, 200);
15852+
assert_eq!(accept_message.common_fields.max_accepted_htlcs, 5);
15853+
assert_eq!(accept_message.channel_reserve_satoshis, 2_000);
15854+
}
15855+
15856+
fn test_inbound_anchors_manual_acceptance_with_override(config_overrides: Option<ChannelConfigOverrides>) -> AcceptChannel {
1582215857
// Tests that we properly limit inbound channels when we have the manual-channel-acceptance
1582315858
// flag set and (sometimes) accept channels as 0conf.
1582415859
let mut anchors_cfg = test_default_channel_config();
@@ -15855,10 +15890,10 @@ mod tests {
1585515890
let events = nodes[2].node.get_and_clear_pending_events();
1585615891
match events[0] {
1585715892
Event::OpenChannelRequest { temporary_channel_id, .. } =>
15858-
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23).unwrap(),
15893+
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23, config_overrides).unwrap(),
1585915894
_ => panic!("Unexpected event"),
1586015895
}
15861-
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
15896+
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id())
1586215897
}
1586315898

1586415899
#[test]
@@ -15943,10 +15978,12 @@ mod tests {
1594315978
let new_fee = user_config.channel_config.forwarding_fee_proportional_millionths + 100;
1594415979
nodes[0].node.update_partial_channel_config(&channel.counterparty.node_id, &[channel.channel_id], &ChannelConfigUpdate {
1594515980
forwarding_fee_proportional_millionths: Some(new_fee),
15981+
accept_underpaying_htlcs: Some(true),
1594615982
..Default::default()
1594715983
}).unwrap();
1594815984
assert_eq!(nodes[0].node.list_channels()[0].config.unwrap().cltv_expiry_delta, new_cltv_expiry_delta);
1594915985
assert_eq!(nodes[0].node.list_channels()[0].config.unwrap().forwarding_fee_proportional_millionths, new_fee);
15986+
assert_eq!(nodes[0].node.list_channels()[0].config.unwrap().accept_underpaying_htlcs, true);
1595015987
let events = nodes[0].node.get_and_clear_pending_msg_events();
1595115988
assert_eq!(events.len(), 1);
1595215989
match &events[0] {

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::{MaxDustHTLCExposure, UserConfig};
3131
#[cfg(test)]
3232
use crate::util::logger::Logger;
3333
use crate::util::scid_utils;
@@ -1327,7 +1327,7 @@ pub fn open_zero_conf_channel<'a, 'b, 'c, 'd>(initiator: &'a Node<'b, 'c, 'd>, r
13271327
assert_eq!(events.len(), 1);
13281328
match events[0] {
13291329
Event::OpenChannelRequest { temporary_channel_id, .. } => {
1330-
receiver.node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &initiator.node.get_our_node_id(), 0).unwrap();
1330+
receiver.node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &initiator.node.get_our_node_id(), 0, None).unwrap();
13311331
},
13321332
_ => panic!("Unexpected event"),
13331333
};
@@ -1395,7 +1395,7 @@ pub fn exchange_open_accept_chan<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b:
13951395
assert_eq!(events.len(), 1);
13961396
match &events[0] {
13971397
Event::OpenChannelRequest { temporary_channel_id, counterparty_node_id, .. } =>
1398-
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42).unwrap(),
1398+
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42, None).unwrap(),
13991399
_ => panic!("Unexpected event"),
14001400
};
14011401
}

0 commit comments

Comments
 (0)