Skip to content

Commit ae9e96e

Browse files
authored
Merge pull request #2077 from dunxen/2023-02-splitchannelstate
Split prefunded `Channel` into `Inbound`/`Outbound` channels
2 parents 74a9ed9 + d957f36 commit ae9e96e

8 files changed

+4049
-3776
lines changed

Diff for: lightning/src/ln/chanmon_update_fail_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1456,12 +1456,12 @@ fn monitor_failed_no_reestablish_response() {
14561456
{
14571457
let mut node_0_per_peer_lock;
14581458
let mut node_0_peer_state_lock;
1459-
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
1459+
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, channel_id).context.announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14601460
}
14611461
{
14621462
let mut node_1_per_peer_lock;
14631463
let mut node_1_peer_state_lock;
1464-
get_channel_ref!(nodes[1], nodes[0], node_1_per_peer_lock, node_1_peer_state_lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
1464+
get_channel_ref!(nodes[1], nodes[0], node_1_per_peer_lock, node_1_peer_state_lock, channel_id).context.announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14651465
}
14661466

14671467
// Route the payment and deliver the initial commitment_signed (with a monitor update failure

Diff for: lightning/src/ln/channel.rs

+3,522-3,428
Large diffs are not rendered by default.

Diff for: lightning/src/ln/channelmanager.rs

+439-292
Large diffs are not rendered by default.

Diff for: lightning/src/ln/functional_test_utils.rs

+26-4
Original file line numberDiff line numberDiff line change
@@ -783,14 +783,36 @@ macro_rules! get_channel_ref {
783783
}
784784
}
785785

786+
#[cfg(test)]
787+
macro_rules! get_outbound_v1_channel_ref {
788+
($node: expr, $counterparty_node: expr, $per_peer_state_lock: ident, $peer_state_lock: ident, $channel_id: expr) => {
789+
{
790+
$per_peer_state_lock = $node.node.per_peer_state.read().unwrap();
791+
$peer_state_lock = $per_peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().lock().unwrap();
792+
$peer_state_lock.outbound_v1_channel_by_id.get_mut(&$channel_id).unwrap()
793+
}
794+
}
795+
}
796+
797+
#[cfg(test)]
798+
macro_rules! get_inbound_v1_channel_ref {
799+
($node: expr, $counterparty_node: expr, $per_peer_state_lock: ident, $peer_state_lock: ident, $channel_id: expr) => {
800+
{
801+
$per_peer_state_lock = $node.node.per_peer_state.read().unwrap();
802+
$peer_state_lock = $per_peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().lock().unwrap();
803+
$peer_state_lock.inbound_v1_channel_by_id.get_mut(&$channel_id).unwrap()
804+
}
805+
}
806+
}
807+
786808
#[cfg(test)]
787809
macro_rules! get_feerate {
788810
($node: expr, $counterparty_node: expr, $channel_id: expr) => {
789811
{
790812
let mut per_peer_state_lock;
791813
let mut peer_state_lock;
792814
let chan = get_channel_ref!($node, $counterparty_node, per_peer_state_lock, peer_state_lock, $channel_id);
793-
chan.get_feerate_sat_per_1000_weight()
815+
chan.context.get_feerate_sat_per_1000_weight()
794816
}
795817
}
796818
}
@@ -802,7 +824,7 @@ macro_rules! get_opt_anchors {
802824
let mut per_peer_state_lock;
803825
let mut peer_state_lock;
804826
let chan = get_channel_ref!($node, $counterparty_node, per_peer_state_lock, peer_state_lock, $channel_id);
805-
chan.opt_anchors()
827+
chan.context.opt_anchors()
806828
}
807829
}
808830
}
@@ -2237,10 +2259,10 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
22372259
let peer_state = per_peer_state.get(&$prev_node.node.get_our_node_id())
22382260
.unwrap().lock().unwrap();
22392261
let channel = peer_state.channel_by_id.get(&next_msgs.as_ref().unwrap().0.channel_id).unwrap();
2240-
if let Some(prev_config) = channel.prev_config() {
2262+
if let Some(prev_config) = channel.context.prev_config() {
22412263
prev_config.forwarding_fee_base_msat
22422264
} else {
2243-
channel.config().forwarding_fee_base_msat
2265+
channel.context.config().forwarding_fee_base_msat
22442266
}
22452267
};
22462268
expect_payment_forwarded!($node, $next_node, $prev_node, Some(fee as u64), false, false);

Diff for: lightning/src/ln/functional_tests.rs

+43-37
Large diffs are not rendered by default.

Diff for: lightning/src/ln/onion_route_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ fn test_onion_failure() {
510510
let short_channel_id = channels[1].0.contents.short_channel_id;
511511
let amt_to_forward = nodes[1].node.per_peer_state.read().unwrap().get(&nodes[2].node.get_our_node_id())
512512
.unwrap().lock().unwrap().channel_by_id.get(&channels[1].2).unwrap()
513-
.get_counterparty_htlc_minimum_msat() - 1;
513+
.context.get_counterparty_htlc_minimum_msat() - 1;
514514
let mut bogus_route = route.clone();
515515
let route_len = bogus_route.paths[0].hops.len();
516516
bogus_route.paths[0].hops[route_len-1].fee_msat = amt_to_forward;

Diff for: lightning/src/ln/payment_tests.rs

+15-11
Original file line numberDiff line numberDiff line change
@@ -607,9 +607,9 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
607607
let mut peer_state = per_peer_state.get(&nodes[2].node.get_our_node_id())
608608
.unwrap().lock().unwrap();
609609
let mut channel = peer_state.channel_by_id.get_mut(&chan_id_2).unwrap();
610-
let mut new_config = channel.config();
610+
let mut new_config = channel.context.config();
611611
new_config.forwarding_fee_base_msat += 100_000;
612-
channel.update_config(&new_config);
612+
channel.context.update_config(&new_config);
613613
new_route.paths[0].hops[0].fee_msat += 100_000;
614614
}
615615

@@ -1409,7 +1409,7 @@ fn test_trivial_inflight_htlc_tracking(){
14091409
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
14101410
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
14111411
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
1412-
channel_1.get_short_channel_id().unwrap()
1412+
channel_1.context.get_short_channel_id().unwrap()
14131413
);
14141414
assert_eq!(chan_1_used_liquidity, None);
14151415
}
@@ -1421,7 +1421,7 @@ fn test_trivial_inflight_htlc_tracking(){
14211421
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
14221422
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
14231423
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
1424-
channel_2.get_short_channel_id().unwrap()
1424+
channel_2.context.get_short_channel_id().unwrap()
14251425
);
14261426

14271427
assert_eq!(chan_2_used_liquidity, None);
@@ -1446,7 +1446,7 @@ fn test_trivial_inflight_htlc_tracking(){
14461446
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
14471447
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
14481448
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
1449-
channel_1.get_short_channel_id().unwrap()
1449+
channel_1.context.get_short_channel_id().unwrap()
14501450
);
14511451
// First hop accounts for expected 1000 msat fee
14521452
assert_eq!(chan_1_used_liquidity, Some(501000));
@@ -1459,7 +1459,7 @@ fn test_trivial_inflight_htlc_tracking(){
14591459
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
14601460
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
14611461
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
1462-
channel_2.get_short_channel_id().unwrap()
1462+
channel_2.context.get_short_channel_id().unwrap()
14631463
);
14641464

14651465
assert_eq!(chan_2_used_liquidity, Some(500000));
@@ -1485,7 +1485,7 @@ fn test_trivial_inflight_htlc_tracking(){
14851485
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
14861486
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
14871487
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
1488-
channel_1.get_short_channel_id().unwrap()
1488+
channel_1.context.get_short_channel_id().unwrap()
14891489
);
14901490
assert_eq!(chan_1_used_liquidity, None);
14911491
}
@@ -1497,7 +1497,7 @@ fn test_trivial_inflight_htlc_tracking(){
14971497
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
14981498
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
14991499
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
1500-
channel_2.get_short_channel_id().unwrap()
1500+
channel_2.context.get_short_channel_id().unwrap()
15011501
);
15021502
assert_eq!(chan_2_used_liquidity, None);
15031503
}
@@ -1538,7 +1538,7 @@ fn test_holding_cell_inflight_htlcs() {
15381538
let used_liquidity = inflight_htlcs.used_liquidity_msat(
15391539
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
15401540
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
1541-
channel.get_short_channel_id().unwrap()
1541+
channel.context.get_short_channel_id().unwrap()
15421542
);
15431543

15441544
assert_eq!(used_liquidity, Some(2000000));
@@ -1635,7 +1635,9 @@ fn do_test_intercepted_payment(test: InterceptTest) {
16351635

16361636
// Check for unknown channel id error.
16371637
let unknown_chan_id_err = nodes[1].node.forward_intercepted_htlc(intercept_id, &[42; 32], nodes[2].node.get_our_node_id(), expected_outbound_amount_msat).unwrap_err();
1638-
assert_eq!(unknown_chan_id_err , APIError::ChannelUnavailable { err: format!("Channel with id {} not found for the passed counterparty node_id {}", log_bytes!([42; 32]), nodes[2].node.get_our_node_id()) });
1638+
assert_eq!(unknown_chan_id_err , APIError::ChannelUnavailable {
1639+
err: format!("Funded channel with id {} not found for the passed counterparty node_id {}. Channel may still be opening.",
1640+
log_bytes!([42; 32]), nodes[2].node.get_our_node_id()) });
16391641

16401642
if test == InterceptTest::Fail {
16411643
// Ensure we can fail the intercepted payment back.
@@ -1659,7 +1661,9 @@ fn do_test_intercepted_payment(test: InterceptTest) {
16591661
// Check that we'll fail as expected when sending to a channel that isn't in `ChannelReady` yet.
16601662
let temp_chan_id = nodes[1].node.create_channel(nodes[2].node.get_our_node_id(), 100_000, 0, 42, None).unwrap();
16611663
let unusable_chan_err = nodes[1].node.forward_intercepted_htlc(intercept_id, &temp_chan_id, nodes[2].node.get_our_node_id(), expected_outbound_amount_msat).unwrap_err();
1662-
assert_eq!(unusable_chan_err , APIError::ChannelUnavailable { err: format!("Channel with id {} not fully established", log_bytes!(temp_chan_id)) });
1664+
assert_eq!(unusable_chan_err , APIError::ChannelUnavailable {
1665+
err: format!("Funded channel with id {} not found for the passed counterparty node_id {}. Channel may still be opening.",
1666+
log_bytes!(temp_chan_id), nodes[2].node.get_our_node_id()) });
16631667
assert_eq!(nodes[1].node.get_and_clear_pending_msg_events().len(), 1);
16641668

16651669
// Open the just-in-time channel so the payment can then be forwarded.

Diff for: lightning/src/ln/shutdown_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ fn do_test_closing_signed_reinit_timeout(timeout_step: TimeoutStep) {
837837
{
838838
let mut node_0_per_peer_lock;
839839
let mut node_0_peer_state_lock;
840-
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan_id).closing_fee_limits.as_mut().unwrap().1 *= 10;
840+
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan_id).context.closing_fee_limits.as_mut().unwrap().1 *= 10;
841841
}
842842
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
843843
let node_1_closing_signed = get_event_msg!(nodes[1], MessageSendEvent::SendClosingSigned, nodes[0].node.get_our_node_id());

0 commit comments

Comments
 (0)