Skip to content

Commit

Permalink
Add V2 ChannelPhase variants
Browse files Browse the repository at this point in the history
  • Loading branch information
dunxen committed Dec 4, 2023
1 parent 8f769b3 commit 6055dd1
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 4 deletions.
12 changes: 12 additions & 0 deletions lightning/src/ln/channel.rs
Expand Up @@ -678,6 +678,10 @@ impl_writeable_tlv_based!(PendingChannelMonitorUpdate, {
pub(super) enum ChannelPhase<SP: Deref> where SP::Target: SignerProvider {
UnfundedOutboundV1(OutboundV1Channel<SP>),
UnfundedInboundV1(InboundV1Channel<SP>),
#[cfg(dual_funding)]
UnfundedOutboundV2(OutboundV2Channel<SP>),
#[cfg(dual_funding)]
UnfundedInboundV2(InboundV2Channel<SP>),
Funded(Channel<SP>),
}

Expand All @@ -690,6 +694,10 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
ChannelPhase::Funded(chan) => &chan.context,
ChannelPhase::UnfundedOutboundV1(chan) => &chan.context,
ChannelPhase::UnfundedInboundV1(chan) => &chan.context,
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(chan) => &chan.context,
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(chan) => &chan.context,
}
}

Expand All @@ -698,6 +706,10 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
ChannelPhase::Funded(ref mut chan) => &mut chan.context,
ChannelPhase::UnfundedOutboundV1(ref mut chan) => &mut chan.context,
ChannelPhase::UnfundedInboundV1(ref mut chan) => &mut chan.context,
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(ref mut chan) => &mut chan.context,
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(ref mut chan) => &mut chan.context,
}
}
}
Expand Down
64 changes: 61 additions & 3 deletions lightning/src/ln/channelmanager.rs
Expand Up @@ -2004,6 +2004,14 @@ macro_rules! convert_chan_phase_err {
ChannelPhase::UnfundedInboundV1(channel) => {
convert_chan_phase_err!($self, $err, channel, $channel_id, UNFUNDED_CHANNEL)
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(channel) => {
convert_chan_phase_err!($self, $err, channel, $channel_id, UNFUNDED_CHANNEL)
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(channel) => {
convert_chan_phase_err!($self, $err, channel, $channel_id, UNFUNDED_CHANNEL)
},
}
};
}
Expand Down Expand Up @@ -2880,6 +2888,13 @@ where
// Unfunded channel has no update
(None, chan_phase.context().get_counterparty_node_id())
},
// TODO(dual_funding): Combine this match arm with above.
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(_) | ChannelPhase::UnfundedInboundV2(_) => {
self.finish_close_channel(chan_phase.context_mut().force_shutdown(false));
// Unfunded channel has no update
(None, chan_phase.context().get_counterparty_node_id())
},
}
} else if peer_state.inbound_channel_request_by_id.remove(channel_id).is_some() {
log_error!(logger, "Force-closing channel {}", &channel_id);
Expand Down Expand Up @@ -4887,6 +4902,16 @@ where
process_unfunded_channel_tick(chan_id, &mut chan.context, &mut chan.unfunded_context,
pending_msg_events, counterparty_node_id)
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(chan) => {
process_unfunded_channel_tick(chan_id, &mut chan.context, &mut chan.unfunded_context,
pending_msg_events, counterparty_node_id)
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(chan) => {
process_unfunded_channel_tick(chan_id, &mut chan.context, &mut chan.unfunded_context,
pending_msg_events, counterparty_node_id)
},
}
});

Expand Down Expand Up @@ -5981,14 +6006,27 @@ where
num_unfunded_channels += 1;
}
},
ChannelPhase::UnfundedInboundV1(chan) => {
if chan.context.minimum_depth().unwrap_or(1) != 0 {
ChannelPhase::UnfundedInboundV1(_) => {
if phase.context().minimum_depth().unwrap_or(1) != 0 {
num_unfunded_channels += 1;
}
},
// TODO(dual_funding): Combine this match arm with above.
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(_) => {
if phase.context().minimum_depth().unwrap_or(1) != 0 {
num_unfunded_channels += 1;
}
},
ChannelPhase::UnfundedOutboundV1(_) => {
// Outbound channels don't contribute to the unfunded count in the DoS context.
continue;
},
// TODO(dual_funding): Combine this match arm with above.
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(_) => {
// Outbound channels don't contribute to the unfunded count in the DoS context.
continue;
}
}
}
Expand Down Expand Up @@ -6164,7 +6202,7 @@ where
},
}
},
Some(ChannelPhase::Funded(_)) | Some(ChannelPhase::UnfundedOutboundV1(_)) => {
Some(_) => {
return Err(MsgHandleErrInternal::send_err_msg_no_close(format!("Got an unexpected funding_created message from peer with counterparty_node_id {}", counterparty_node_id), msg.temporary_channel_id));
},
None => return Err(MsgHandleErrInternal::send_err_msg_no_close(format!("Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}", counterparty_node_id), msg.temporary_channel_id))
Expand Down Expand Up @@ -6366,6 +6404,15 @@ where
let mut chan = remove_channel_phase!(self, chan_phase_entry);
finish_shutdown = Some(chan.context_mut().force_shutdown(false));
},
// TODO(dual_funding): Combine this match arm with above.
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(_) | ChannelPhase::UnfundedOutboundV2(_) => {
let context = phase.context_mut();
log_error!(self.logger, "Immediately closing unfunded channel {} as peer asked to cooperatively shut it down (which is unnecessary)", &msg.channel_id);
self.issue_channel_close_events(&context, ClosureReason::CounterpartyCoopClosedUnfundedChannel);
let mut chan = remove_channel_phase!(self, chan_phase_entry);
finish_shutdown = Some(chan.context_mut().force_shutdown(false));
},
}
} else {
return Err(MsgHandleErrInternal::send_err_msg_no_close(format!("Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}", counterparty_node_id), msg.channel_id))
Expand Down Expand Up @@ -8174,6 +8221,9 @@ where
match phase {
// Retain unfunded channels.
ChannelPhase::UnfundedOutboundV1(_) | ChannelPhase::UnfundedInboundV1(_) => true,
// TODO(dual_funding): Combine this match arm with above.
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(_) | ChannelPhase::UnfundedInboundV2(_) => true,
ChannelPhase::Funded(channel) => {
let res = f(channel);
if let Ok((channel_ready_opt, mut timed_out_pending_htlcs, announcement_sigs)) = res {
Expand Down Expand Up @@ -8641,6 +8691,14 @@ where
ChannelPhase::UnfundedInboundV1(chan) => {
&mut chan.context
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedOutboundV2(chan) => {
&mut chan.context
},
#[cfg(dual_funding)]
ChannelPhase::UnfundedInboundV2(chan) => {
&mut chan.context
},
};
// Clean up for removal.
update_maps_on_chan_removal!(self, &context);
Expand Down
2 changes: 1 addition & 1 deletion lightning/src/ln/functional_tests.rs
Expand Up @@ -190,7 +190,7 @@ fn do_test_counterparty_no_reserve(send_from_initiator: bool) {
chan_context.holder_selected_channel_reserve_satoshis = 0;
chan_context.holder_max_htlc_value_in_flight_msat = 100_000_000;
},
ChannelPhase::Funded(_) => assert!(false),
_ => assert!(false),
}
}

Expand Down

0 comments on commit 6055dd1

Please sign in to comment.