Skip to content

Commit 645f146

Browse files
committed
config override struct
1 parent 1b281f1 commit 645f146

7 files changed

+105
-38
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use lightning::events;
4646
use lightning::events::MessageSendEventsProvider;
4747
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4848
use lightning::ln::channel_state::ChannelDetails;
49+
use lightning::ln::channelmanager::InboundChannelConfigOverrides;
4950
use lightning::ln::channelmanager::{
5051
ChainParameters, ChannelManager, ChannelManagerReadArgs, PaymentId, RecentPaymentDetails,
5152
RecipientOnionFields,
@@ -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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::events::bump_transaction::WalletSource;
2323
use crate::events::{ClosureReason, Event, MessageSendEvent, MessageSendEventsProvider};
2424
use crate::ln::chan_utils::ClosingTransaction;
2525
use crate::ln::channel_state::{ChannelDetails, ChannelShutdownState};
26-
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields};
26+
use crate::ln::channelmanager::{InboundChannelConfigOverrides, PaymentId, RAACommitmentOrder, RecipientOnionFields};
2727
use crate::ln::msgs::ChannelMessageHandler;
2828
use crate::ln::{functional_test_utils::*, msgs};
2929
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -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, InboundChannelConfigOverrides::default())
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, InboundChannelConfigOverrides::default())
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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use bitcoin::network::Network;
1818
use crate::chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor};
1919
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
2020
use crate::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose, ClosureReason, HTLCDestination};
21-
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields};
21+
use crate::ln::channelmanager::{InboundChannelConfigOverrides, PaymentId, RAACommitmentOrder, RecipientOnionFields};
2222
use crate::ln::channel::AnnouncementSigsState;
2323
use crate::ln::msgs;
2424
use crate::ln::types::ChannelId;
@@ -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, InboundChannelConfigOverrides::default()).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, InboundChannelConfigOverrides::default()).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, InboundChannelConfigOverrides::default()).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, InboundChannelConfigOverrides::default()).unwrap();
28722872
}
28732873
},
28742874
_ => panic!("Unexpected event"),

lightning/src/ln/channelmanager.rs

Lines changed: 80 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ pub use crate::ln::outbound_payment::{Bolt12PaymentError, ProbeSendFailure, Retr
132132
pub(crate) use crate::ln::outbound_payment::PaymentSendFailure;
133133
use crate::ln::script::ShutdownScript;
134134

135+
136+
/// Config structure for overriding incoming channel configuration parameters.
137+
#[derive(Default)]
138+
pub struct InboundChannelConfigOverrides {
139+
max_inbound_htlc_value_in_flight_percent_of_channel: Option<u8>,
140+
htlc_minimum_msat: Option<u64>,
141+
minimum_depth: Option<u32>,
142+
to_self_delay: Option<u16>,
143+
max_accepted_htlcs: Option<u16>,
144+
channel_reserve_proportional_millionths: Option<u32>
145+
}
146+
135147
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
136148
//
137149
// Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -1851,7 +1863,7 @@ where
18511863
///
18521864
/// ```
18531865
/// # use bitcoin::secp256k1::PublicKey;
1854-
/// # use lightning::ln::channelmanager::AChannelManager;
1866+
/// # use lightning::ln::channelmanager::{AChannelManager, InboundChannelConfigOverride};
18551867
/// # use lightning::events::{Event, EventsProvider};
18561868
/// #
18571869
/// # fn is_trusted(counterparty_node_id: PublicKey) -> bool {
@@ -1877,7 +1889,7 @@ where
18771889
///
18781890
/// let user_channel_id = 43;
18791891
/// match channel_manager.accept_inbound_channel(
1880-
/// &temporary_channel_id, &counterparty_node_id, user_channel_id
1892+
/// &temporary_channel_id, &counterparty_node_id, user_channel_id, InboundChannelConfigOverride::default()
18811893
/// ) {
18821894
/// Ok(()) => println!("Accepting channel {}", temporary_channel_id),
18831895
/// Err(e) => println!("Error accepting channel {}: {:?}", temporary_channel_id, e),
@@ -7699,8 +7711,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
76997711
///
77007712
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77017713
/// [`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))
7714+
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: InboundChannelConfigOverrides) -> Result<(), APIError> {
7715+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, vec![], Weight::from_wu(0), config_overrides)
77047716
}
77057717

77067718
/// Accepts a request to open a channel after a [`events::Event::OpenChannelRequest`], treating
@@ -7721,15 +7733,42 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77217733
///
77227734
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
77237735
/// [`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))
7736+
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> {
7737+
self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, vec![], Weight::from_wu(0), config_overrides)
77267738
}
77277739

77287740
fn do_accept_inbound_channel(
77297741
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
77307742
user_channel_id: u128, _funding_inputs: Vec<(TxIn, TransactionU16LenLimited)>,
7731-
_total_witness_weight: Weight,
7743+
_total_witness_weight: Weight, config_overrides: InboundChannelConfigOverrides
77327744
) -> Result<(), APIError> {
7745+
7746+
// Apply configuration overrides.
7747+
let mut config = self.default_configuration.clone();
7748+
if let Some(max_in_flight_percent) = config_overrides.max_inbound_htlc_value_in_flight_percent_of_channel {
7749+
config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = max_in_flight_percent;
7750+
}
7751+
7752+
if let Some(htlc_minimum_msat) = config_overrides.htlc_minimum_msat {
7753+
config.channel_handshake_config.our_htlc_minimum_msat = htlc_minimum_msat;
7754+
}
7755+
7756+
if let Some(minimum_depth) = config_overrides.minimum_depth {
7757+
config.channel_handshake_config.minimum_depth = minimum_depth;
7758+
}
7759+
7760+
if let Some(to_self_delay) = config_overrides.to_self_delay {
7761+
config.channel_handshake_config.our_to_self_delay = to_self_delay;
7762+
}
7763+
7764+
if let Some(max_accepted_htlcs) = config_overrides.max_accepted_htlcs {
7765+
config.channel_handshake_config.our_max_accepted_htlcs = max_accepted_htlcs;
7766+
}
7767+
7768+
if let Some(channel_reserve) = config_overrides.channel_reserve_proportional_millionths {
7769+
config.channel_handshake_config.their_channel_reserve_proportional_millionths = channel_reserve;
7770+
}
7771+
77337772
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), Some(*temporary_channel_id), None);
77347773
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
77357774

@@ -7759,7 +7798,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
77597798
InboundV1Channel::new(
77607799
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
77617800
&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
7801+
user_channel_id, &config, best_block_height, &self.logger, accept_0conf
77637802
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
77647803
).map(|mut channel| {
77657804
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
@@ -14478,9 +14517,9 @@ mod tests {
1447814517
use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
1447914518
use crate::ln::types::ChannelId;
1448014519
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14481-
use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment, PaymentId, RecipientOnionFields, InterceptId};
14520+
use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, InboundChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
1448214521
use crate::ln::functional_test_utils::*;
14483-
use crate::ln::msgs::{self, ErrorAction};
14522+
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
1448414523
use crate::ln::msgs::ChannelMessageHandler;
1448514524
use crate::ln::outbound_payment::Retry;
1448614525
use crate::prelude::*;
@@ -15237,7 +15276,7 @@ mod tests {
1523715276
// Test the API functions.
1523815277
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);
1523915278

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

1524215281
check_unkown_peer_error(nodes[0].node.close_channel(&channel_id, &unkown_public_key), unkown_public_key);
1524315282

@@ -15268,7 +15307,7 @@ mod tests {
1526815307
let error_message = "Channel force-closed";
1526915308

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

1527315312
check_channel_unavailable_error(nodes[0].node.close_channel(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
1527415313

@@ -15459,7 +15498,7 @@ mod tests {
1545915498
let events = nodes[1].node.get_and_clear_pending_events();
1546015499
match events[0] {
1546115500
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15462-
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23).unwrap();
15501+
nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23, InboundChannelConfigOverrides::default()).unwrap();
1546315502
}
1546415503
_ => panic!("Unexpected event"),
1546515504
}
@@ -15477,7 +15516,7 @@ mod tests {
1547715516
let events = nodes[1].node.get_and_clear_pending_events();
1547815517
match events[0] {
1547915518
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15480-
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23) {
15519+
match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default()) {
1548115520
Err(APIError::APIMisuseError { err }) =>
1548215521
assert_eq!(err, "Too many peers with unfunded channels, refusing to accept new ones"),
1548315522
_ => panic!(),
@@ -15493,7 +15532,7 @@ mod tests {
1549315532
let events = nodes[1].node.get_and_clear_pending_events();
1549415533
match events[0] {
1549515534
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15496-
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23).unwrap();
15535+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default()).unwrap();
1549715536
}
1549815537
_ => panic!("Unexpected event"),
1549915538
}
@@ -15573,6 +15612,30 @@ mod tests {
1557315612

1557415613
#[test]
1557515614
fn test_inbound_anchors_manual_acceptance() {
15615+
test_inbound_anchors_manual_acceptance_with_override(InboundChannelConfigOverrides::default());
15616+
}
15617+
15618+
#[test]
15619+
fn test_inbound_anchors_manual_acceptance_overridden() {
15620+
let overrides = InboundChannelConfigOverrides {
15621+
max_inbound_htlc_value_in_flight_percent_of_channel: Some(5),
15622+
htlc_minimum_msat: Some(1000),
15623+
minimum_depth: Some(2),
15624+
to_self_delay: Some(200),
15625+
max_accepted_htlcs: Some(5),
15626+
channel_reserve_proportional_millionths: Some(20000),
15627+
};
15628+
15629+
let accept_message = test_inbound_anchors_manual_acceptance_with_override(overrides);
15630+
assert_eq!(accept_message.common_fields.max_htlc_value_in_flight_msat, 5_000_000);
15631+
assert_eq!(accept_message.common_fields.htlc_minimum_msat, 1_000);
15632+
assert_eq!(accept_message.common_fields.minimum_depth, 2);
15633+
assert_eq!(accept_message.common_fields.to_self_delay, 200);
15634+
assert_eq!(accept_message.common_fields.max_accepted_htlcs, 5);
15635+
assert_eq!(accept_message.channel_reserve_satoshis, 2_000);
15636+
}
15637+
15638+
fn test_inbound_anchors_manual_acceptance_with_override(config_overrides: InboundChannelConfigOverrides) -> AcceptChannel {
1557615639
// Tests that we properly limit inbound channels when we have the manual-channel-acceptance
1557715640
// flag set and (sometimes) accept channels as 0conf.
1557815641
let mut anchors_cfg = test_default_channel_config();
@@ -15609,10 +15672,10 @@ mod tests {
1560915672
let events = nodes[2].node.get_and_clear_pending_events();
1561015673
match events[0] {
1561115674
Event::OpenChannelRequest { temporary_channel_id, .. } =>
15612-
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23).unwrap(),
15675+
nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23, config_overrides).unwrap(),
1561315676
_ => panic!("Unexpected event"),
1561415677
}
15615-
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
15678+
get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id())
1561615679
}
1561715680

1561815681
#[test]

lightning/src/ln/functional_test_utils.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use crate::util::test_channel_signer::SignerOp;
3737
use crate::util::test_utils;
3838
use crate::util::test_utils::{TestChainMonitor, TestScorer, TestKeysInterface};
3939
use crate::util::ser::{ReadableArgs, Writeable};
40+
use crate::ln::channelmanager::InboundChannelConfigOverrides;
4041

4142
use bitcoin::WPubkeyHash;
4243
use bitcoin::amount::Amount;
@@ -1321,7 +1322,7 @@ pub fn open_zero_conf_channel<'a, 'b, 'c, 'd>(initiator: &'a Node<'b, 'c, 'd>, r
13211322
assert_eq!(events.len(), 1);
13221323
match events[0] {
13231324
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();
1325+
receiver.node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &initiator.node.get_our_node_id(), 0, InboundChannelConfigOverrides::default()).unwrap();
13251326
},
13261327
_ => panic!("Unexpected event"),
13271328
};
@@ -1389,7 +1390,7 @@ pub fn exchange_open_accept_chan<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b:
13891390
assert_eq!(events.len(), 1);
13901391
match &events[0] {
13911392
Event::OpenChannelRequest { temporary_channel_id, counterparty_node_id, .. } =>
1392-
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42).unwrap(),
1393+
node_b.node.accept_inbound_channel(temporary_channel_id, counterparty_node_id, 42, InboundChannelConfigOverrides::default()).unwrap(),
13931394
_ => panic!("Unexpected event"),
13941395
};
13951396
}

0 commit comments

Comments
 (0)