Skip to content

Commit 6436232

Browse files
authored
Merge pull request #2495 from dunxen/2023-07-channelenummap
Use a single peer state map for all channel phases in peer state
2 parents 81f4151 + 88db0b8 commit 6436232

8 files changed

+1152
-977
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::chain::transaction::OutPoint;
2020
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
2121
use crate::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose, ClosureReason, HTLCDestination};
2222
use crate::ln::channelmanager::{RAACommitmentOrder, PaymentSendFailure, PaymentId, RecipientOnionFields};
23-
use crate::ln::channel::AnnouncementSigsState;
23+
use crate::ln::channel::{AnnouncementSigsState, ChannelPhase};
2424
use crate::ln::msgs;
2525
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
2626
use crate::util::test_channel_signer::TestChannelSigner;
@@ -136,15 +136,18 @@ fn test_monitor_and_persister_update_fail() {
136136
{
137137
let mut node_0_per_peer_lock;
138138
let mut node_0_peer_state_lock;
139-
let mut channel = get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan.2);
140-
if let Ok(Some(update)) = channel.commitment_signed(&updates.commitment_signed, &node_cfgs[0].logger) {
141-
// Check that even though the persister is returning a InProgress,
142-
// because the update is bogus, ultimately the error that's returned
143-
// should be a PermanentFailure.
144-
if let ChannelMonitorUpdateStatus::PermanentFailure = chain_mon.chain_monitor.update_channel(outpoint, &update) {} else { panic!("Expected monitor error to be permanent"); }
145-
logger.assert_log_regex("lightning::chain::chainmonitor", regex::Regex::new("Persistence of ChannelMonitorUpdate for channel [0-9a-f]* in progress").unwrap(), 1);
146-
assert_eq!(nodes[0].chain_monitor.update_channel(outpoint, &update), ChannelMonitorUpdateStatus::Completed);
147-
} else { assert!(false); }
139+
if let ChannelPhase::Funded(ref mut channel) = get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan.2) {
140+
if let Ok(Some(update)) = channel.commitment_signed(&updates.commitment_signed, &node_cfgs[0].logger) {
141+
// Check that even though the persister is returning a InProgress,
142+
// because the update is bogus, ultimately the error that's returned
143+
// should be a PermanentFailure.
144+
if let ChannelMonitorUpdateStatus::PermanentFailure = chain_mon.chain_monitor.update_channel(outpoint, &update) {} else { panic!("Expected monitor error to be permanent"); }
145+
logger.assert_log_regex("lightning::chain::chainmonitor", regex::Regex::new("Persistence of ChannelMonitorUpdate for channel [0-9a-f]* in progress").unwrap(), 1);
146+
assert_eq!(nodes[0].chain_monitor.update_channel(outpoint, &update), ChannelMonitorUpdateStatus::Completed);
147+
} else { assert!(false); }
148+
} else {
149+
assert!(false);
150+
}
148151
}
149152

150153
check_added_monitors!(nodes[0], 1);
@@ -1460,12 +1463,12 @@ fn monitor_failed_no_reestablish_response() {
14601463
{
14611464
let mut node_0_per_peer_lock;
14621465
let mut node_0_peer_state_lock;
1463-
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;
1466+
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, channel_id).context_mut().announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14641467
}
14651468
{
14661469
let mut node_1_per_peer_lock;
14671470
let mut node_1_peer_state_lock;
1468-
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;
1471+
get_channel_ref!(nodes[1], nodes[0], node_1_per_peer_lock, node_1_peer_state_lock, channel_id).context_mut().announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14691472
}
14701473

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

lightning/src/ln/channel.rs

+29-5
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,35 @@ impl_writeable_tlv_based!(PendingChannelMonitorUpdate, {
605605
(0, update, required),
606606
});
607607

608+
/// The `ChannelPhase` enum describes the current phase in life of a lightning channel with each of
609+
/// its variants containing an appropriate channel struct.
610+
pub(super) enum ChannelPhase<SP: Deref> where SP::Target: SignerProvider {
611+
UnfundedOutboundV1(OutboundV1Channel<SP>),
612+
UnfundedInboundV1(InboundV1Channel<SP>),
613+
Funded(Channel<SP>),
614+
}
615+
616+
impl<'a, SP: Deref> ChannelPhase<SP> where
617+
SP::Target: SignerProvider,
618+
<SP::Target as SignerProvider>::Signer: ChannelSigner,
619+
{
620+
pub fn context(&'a self) -> &'a ChannelContext<SP> {
621+
match self {
622+
ChannelPhase::Funded(chan) => &chan.context,
623+
ChannelPhase::UnfundedOutboundV1(chan) => &chan.context,
624+
ChannelPhase::UnfundedInboundV1(chan) => &chan.context,
625+
}
626+
}
627+
628+
pub fn context_mut(&'a mut self) -> &'a mut ChannelContext<SP> {
629+
match self {
630+
ChannelPhase::Funded(ref mut chan) => &mut chan.context,
631+
ChannelPhase::UnfundedOutboundV1(ref mut chan) => &mut chan.context,
632+
ChannelPhase::UnfundedInboundV1(ref mut chan) => &mut chan.context,
633+
}
634+
}
635+
}
636+
608637
/// Contains all state common to unfunded inbound/outbound channels.
609638
pub(super) struct UnfundedChannelContext {
610639
/// A counter tracking how many ticks have elapsed since this unfunded channel was
@@ -2036,11 +2065,6 @@ fn commit_tx_fee_msat(feerate_per_kw: u32, num_htlcs: usize, channel_type_featur
20362065
(commitment_tx_base_weight(channel_type_features) + num_htlcs as u64 * COMMITMENT_TX_WEIGHT_PER_HTLC) * feerate_per_kw as u64 / 1000 * 1000
20372066
}
20382067

2039-
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
2040-
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
2041-
// calling channel_id() before we're set up or things like get_funding_signed on an
2042-
// inbound channel.
2043-
//
20442068
// Holder designates channel data owned for the benefit of the user client.
20452069
// Counterparty designates channel data owned by the another channel participant entity.
20462070
pub(super) struct Channel<SP: Deref> where SP::Target: SignerProvider {

0 commit comments

Comments
 (0)