Skip to content

Commit 72e1350

Browse files
committed
Create ChannelSignerType enum.
1 parent a5b5c4d commit 72e1350

File tree

1 file changed

+58
-29
lines changed

1 file changed

+58
-29
lines changed

lightning/src/ln/channel.rs

Lines changed: 58 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,18 @@ impl_writeable_tlv_based!(PendingChannelMonitorUpdate, {
494494
(2, blocked, required),
495495
});
496496

497+
enum ChannelSignerType<ECS: ChannelSigner> {
498+
Ecdsa(ECS),
499+
}
500+
497501
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
498502
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
499503
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
500504
// inbound channel.
501505
//
502506
// Holder designates channel data owned for the benefice of the user client.
503507
// Counterparty designates channel data owned by the another channel participant entity.
508+
#[allow(unused)]
504509
pub(super) struct Channel<Signer: ChannelSigner> {
505510
config: LegacyChannelConfig,
506511

@@ -534,7 +539,7 @@ pub(super) struct Channel<Signer: ChannelSigner> {
534539

535540
latest_monitor_update_id: u64,
536541

537-
holder_signer: Signer,
542+
holder_signer: ChannelSignerType<Signer>,
538543
shutdown_scriptpubkey: Option<ShutdownScript>,
539544
destination_script: Script,
540545

@@ -1042,7 +1047,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
10421047

10431048
latest_monitor_update_id: 0,
10441049

1045-
holder_signer,
1050+
holder_signer: ChannelSignerType::Ecdsa(holder_signer),
10461051
shutdown_scriptpubkey,
10471052
destination_script,
10481053

@@ -1397,7 +1402,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
13971402

13981403
latest_monitor_update_id: 0,
13991404

1400-
holder_signer,
1405+
holder_signer: ChannelSignerType::Ecdsa(holder_signer),
14011406
shutdown_scriptpubkey,
14021407
destination_script,
14031408

@@ -1836,7 +1841,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
18361841
/// The result is a transaction which we can revoke broadcastership of (ie a "local" transaction)
18371842
/// TODO Some magic rust shit to compile-time check this?
18381843
fn build_holder_transaction_keys(&self, commitment_number: u64) -> TxCreationKeys {
1839-
let per_commitment_point = self.holder_signer.get_per_commitment_point(commitment_number, &self.secp_ctx);
1844+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
1845+
let per_commitment_point = ecdsa_signer.get_per_commitment_point(commitment_number, &self.secp_ctx);
18401846
let delayed_payment_base = &self.get_holder_pubkeys().delayed_payment_basepoint;
18411847
let htlc_basepoint = &self.get_holder_pubkeys().htlc_basepoint;
18421848
let counterparty_pubkeys = self.get_counterparty_pubkeys();
@@ -2323,7 +2329,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
23232329
log_trace!(logger, "Initial counterparty tx for channel {} is: txid {} tx {}",
23242330
log_bytes!(self.channel_id()), counterparty_initial_bitcoin_tx.txid, encode::serialize_hex(&counterparty_initial_bitcoin_tx.transaction));
23252331

2326-
let counterparty_signature = self.holder_signer.sign_counterparty_commitment(&counterparty_initial_commitment_tx, Vec::new(), &self.secp_ctx)
2332+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
2333+
let counterparty_signature = ecdsa_signer.sign_counterparty_commitment(&counterparty_initial_commitment_tx, Vec::new(), &self.secp_ctx)
23272334
.map_err(|_| ChannelError::Close("Failed to get signatures for new commitment_signed".to_owned()))?.0;
23282335

23292336
// We sign "counterparty" commitment transaction, allowing them to broadcast the tx if they wish.
@@ -2363,7 +2370,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
23632370
self.channel_transaction_parameters.funding_outpoint = Some(funding_txo);
23642371
// This is an externally observable change before we finish all our checks. In particular
23652372
// funding_created_signature may fail.
2366-
self.holder_signer.provide_channel_parameters(&self.channel_transaction_parameters);
2373+
let ecdsa_signer = match &mut self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
2374+
ecdsa_signer.provide_channel_parameters(&self.channel_transaction_parameters);
23672375

23682376
let (counterparty_initial_commitment_txid, initial_commitment_tx, signature) = match self.funding_created_signature(&msg.signature, logger) {
23692377
Ok(res) => res,
@@ -2386,7 +2394,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
23862394
self.counterparty_funding_pubkey()
23872395
);
23882396

2389-
self.holder_signer.validate_holder_commitment(&holder_commitment_tx, Vec::new())
2397+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
2398+
ecdsa_signer.validate_holder_commitment(&holder_commitment_tx, Vec::new())
23902399
.map_err(|_| ChannelError::Close("Failed to validate our commitment".to_owned()))?;
23912400

23922401
// Now that we're past error-generating stuff, update our local state:
@@ -2476,7 +2485,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
24762485
self.counterparty_funding_pubkey()
24772486
);
24782487

2479-
self.holder_signer.validate_holder_commitment(&holder_commitment_tx, Vec::new())
2488+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
2489+
ecdsa_signer.validate_holder_commitment(&holder_commitment_tx, Vec::new())
24802490
.map_err(|_| ChannelError::Close("Failed to validate our commitment".to_owned()))?;
24812491

24822492

@@ -3245,7 +3255,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
32453255
self.counterparty_funding_pubkey()
32463256
);
32473257

3248-
self.holder_signer.validate_holder_commitment(&holder_commitment_tx, commitment_stats.preimages)
3258+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
3259+
ecdsa_signer.validate_holder_commitment(&holder_commitment_tx, commitment_stats.preimages)
32493260
.map_err(|_| ChannelError::Close("Failed to validate our commitment".to_owned()))?;
32503261

32513262
// Update state now that we've passed all the can-fail calls...
@@ -3505,7 +3516,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
35053516
*self.next_remote_commitment_tx_fee_info_cached.lock().unwrap() = None;
35063517
}
35073518

3508-
self.holder_signer.validate_counterparty_revocation(
3519+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
3520+
ecdsa_signer.validate_counterparty_revocation(
35093521
self.cur_counterparty_commitment_transaction_number + 1,
35103522
&secret
35113523
).map_err(|_| ChannelError::Close("Failed to validate revocation from peer".to_owned()))?;
@@ -3909,11 +3921,12 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
39093921
// * an inbound channel that failed to persist the monitor on funding_created and we got
39103922
// the funding transaction confirmed before the monitor was persisted, or
39113923
// * a 0-conf channel and intended to send the channel_ready before any broadcast at all.
3924+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
39123925
let channel_ready = if self.monitor_pending_channel_ready {
39133926
assert!(!self.is_outbound() || self.minimum_depth == Some(0),
39143927
"Funding transaction broadcast by the local client before it should have - LDK didn't do it!");
39153928
self.monitor_pending_channel_ready = false;
3916-
let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
3929+
let next_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
39173930
Some(msgs::ChannelReady {
39183931
channel_id: self.channel_id(),
39193932
next_per_commitment_point,
@@ -3993,8 +4006,9 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
39934006
}
39944007

39954008
fn get_last_revoke_and_ack(&self) -> msgs::RevokeAndACK {
3996-
let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
3997-
let per_commitment_secret = self.holder_signer.release_commitment_secret(self.cur_holder_commitment_transaction_number + 2);
4009+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4010+
let next_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
4011+
let per_commitment_secret = ecdsa_signer.release_commitment_secret(self.cur_holder_commitment_transaction_number + 2);
39984012
msgs::RevokeAndACK {
39994013
channel_id: self.channel_id,
40004014
per_commitment_secret,
@@ -4096,7 +4110,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
40964110
}
40974111

40984112
if msg.next_remote_commitment_number > 0 {
4099-
let expected_point = self.holder_signer.get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - msg.next_remote_commitment_number + 1, &self.secp_ctx);
4113+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4114+
let expected_point = ecdsa_signer.get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - msg.next_remote_commitment_number + 1, &self.secp_ctx);
41004115
let given_secret = SecretKey::from_slice(&msg.your_last_per_commitment_secret)
41014116
.map_err(|_| ChannelError::Close("Peer sent a garbage channel_reestablish with unparseable secret key".to_owned()))?;
41024117
if expected_point != PublicKey::from_secret_key(&self.secp_ctx, &given_secret) {
@@ -4160,7 +4175,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
41604175
}
41614176

41624177
// We have OurChannelReady set!
4163-
let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
4178+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4179+
let next_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
41644180
return Ok(ReestablishResponses {
41654181
channel_ready: Some(msgs::ChannelReady {
41664182
channel_id: self.channel_id(),
@@ -4196,7 +4212,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
41964212

41974213
let channel_ready = if msg.next_local_commitment_number == 1 && INITIAL_COMMITMENT_NUMBER - self.cur_holder_commitment_transaction_number == 1 {
41984214
// We should never have to worry about MonitorUpdateInProgress resending ChannelReady
4199-
let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
4215+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4216+
let next_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
42004217
Some(msgs::ChannelReady {
42014218
channel_id: self.channel_id(),
42024219
next_per_commitment_point,
@@ -4345,7 +4362,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
43454362
log_trace!(logger, "Proposing initial closing_signed for our counterparty with a fee range of {}-{} sat (with initial proposal {} sats)",
43464363
our_min_fee, our_max_fee, total_fee_satoshis);
43474364

4348-
let sig = self.holder_signer
4365+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4366+
let sig = ecdsa_signer
43494367
.sign_closing_transaction(&closing_tx, &self.secp_ctx)
43504368
.map_err(|()| ChannelError::Close("Failed to get signature for closing transaction.".to_owned()))?;
43514369

@@ -4547,6 +4565,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
45474565

45484566
let (our_min_fee, our_max_fee) = self.calculate_closing_fee_limits(fee_estimator);
45494567

4568+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
4569+
45504570
macro_rules! propose_fee {
45514571
($new_fee: expr) => {
45524572
let (closing_tx, used_fee) = if $new_fee == msg.fee_satoshis {
@@ -4555,7 +4575,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
45554575
self.build_closing_transaction($new_fee, false)
45564576
};
45574577

4558-
let sig = self.holder_signer
4578+
let sig = ecdsa_signer
45594579
.sign_closing_transaction(&closing_tx, &self.secp_ctx)
45604580
.map_err(|_| ChannelError::Close("External signer refused to sign closing transaction".to_owned()))?;
45614581

@@ -4927,7 +4947,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
49274947

49284948
#[cfg(test)]
49294949
pub fn get_signer(&self) -> &Signer {
4930-
&self.holder_signer
4950+
match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} }
49314951
}
49324952

49334953
#[cfg(test)]
@@ -5169,8 +5189,9 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
51695189
if need_commitment_update {
51705190
if self.channel_state & (ChannelState::MonitorUpdateInProgress as u32) == 0 {
51715191
if self.channel_state & (ChannelState::PeerDisconnected as u32) == 0 {
5192+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
51725193
let next_per_commitment_point =
5173-
self.holder_signer.get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - 1, &self.secp_ctx);
5194+
ecdsa_signer.get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - 1, &self.secp_ctx);
51745195
return Some(msgs::ChannelReady {
51755196
channel_id: self.channel_id,
51765197
next_per_commitment_point,
@@ -5394,7 +5415,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
53945415
panic!("Tried to send an open_channel for a channel that has already advanced");
53955416
}
53965417

5397-
let first_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
5418+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5419+
let first_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
53985420
let keys = self.get_holder_pubkeys();
53995421

54005422
msgs::OpenChannel {
@@ -5464,7 +5486,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
54645486
///
54655487
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
54665488
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
5467-
let first_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
5489+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5490+
let first_per_commitment_point = ecdsa_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
54685491
let keys = self.get_holder_pubkeys();
54695492

54705493
msgs::AcceptChannel {
@@ -5505,7 +5528,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
55055528
fn get_outbound_funding_created_signature<L: Deref>(&mut self, logger: &L) -> Result<Signature, ChannelError> where L::Target: Logger {
55065529
let counterparty_keys = self.build_remote_transaction_keys();
55075530
let counterparty_initial_commitment_tx = self.build_commitment_transaction(self.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
5508-
Ok(self.holder_signer.sign_counterparty_commitment(&counterparty_initial_commitment_tx, Vec::new(), &self.secp_ctx)
5531+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5532+
Ok(ecdsa_signer.sign_counterparty_commitment(&counterparty_initial_commitment_tx, Vec::new(), &self.secp_ctx)
55095533
.map_err(|_| ChannelError::Close("Failed to get signatures for new commitment_signed".to_owned()))?.0)
55105534
}
55115535

@@ -5530,7 +5554,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
55305554
}
55315555

55325556
self.channel_transaction_parameters.funding_outpoint = Some(funding_txo);
5533-
self.holder_signer.provide_channel_parameters(&self.channel_transaction_parameters);
5557+
let ecdsa_signer = match &mut self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5558+
ecdsa_signer.provide_channel_parameters(&self.channel_transaction_parameters);
55345559

55355560
let signature = match self.get_outbound_funding_created_signature(logger) {
55365561
Ok(res) => res,
@@ -5639,7 +5664,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
56395664
},
56405665
Ok(v) => v
56415666
};
5642-
let our_bitcoin_sig = match self.holder_signer.sign_channel_announcement_with_funding_key(&announcement, &self.secp_ctx) {
5667+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5668+
let our_bitcoin_sig = match ecdsa_signer.sign_channel_announcement_with_funding_key(&announcement, &self.secp_ctx) {
56435669
Err(_) => {
56445670
log_error!(logger, "Signer rejected channel_announcement signing. Channel will not be announced!");
56455671
return None;
@@ -5668,7 +5694,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
56685694

56695695
let our_node_sig = node_signer.sign_gossip_message(msgs::UnsignedGossipMessage::ChannelAnnouncement(&announcement))
56705696
.map_err(|_| ChannelError::Ignore("Failed to generate node signature for channel_announcement".to_owned()))?;
5671-
let our_bitcoin_sig = self.holder_signer.sign_channel_announcement_with_funding_key(&announcement, &self.secp_ctx)
5697+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
5698+
let our_bitcoin_sig = ecdsa_signer.sign_channel_announcement_with_funding_key(&announcement, &self.secp_ctx)
56725699
.map_err(|_| ChannelError::Ignore("Signer rejected channel_announcement".to_owned()))?;
56735700
Ok(msgs::ChannelAnnouncement {
56745701
node_signature_1: if were_node_one { our_node_sig } else { their_node_sig },
@@ -6048,7 +6075,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
60486075
htlcs.push(htlc);
60496076
}
60506077

6051-
let res = self.holder_signer.sign_counterparty_commitment(&commitment_stats.tx, commitment_stats.preimages, &self.secp_ctx)
6078+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
6079+
let res = ecdsa_signer.sign_counterparty_commitment(&commitment_stats.tx, commitment_stats.preimages, &self.secp_ctx)
60526080
.map_err(|_| ChannelError::Close("Failed to get signatures for new commitment_signed".to_owned()))?;
60536081
signature = res.0;
60546082
htlc_signatures = res.1;
@@ -6360,7 +6388,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
63606388
self.latest_monitor_update_id.write(writer)?;
63616389

63626390
let mut key_data = VecWriter(Vec::new());
6363-
self.holder_signer.write(&mut key_data)?;
6391+
let ecdsa_signer = match &self.holder_signer { ChannelSignerType::Ecdsa(signer) => {signer} };
6392+
ecdsa_signer.write(&mut key_data)?;
63646393
assert!(key_data.0.len() < core::usize::MAX);
63656394
assert!(key_data.0.len() < core::u32::MAX as usize);
63666395
(key_data.0.len() as u32).write(writer)?;
@@ -7005,7 +7034,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
70057034

70067035
latest_monitor_update_id,
70077036

7008-
holder_signer,
7037+
holder_signer: ChannelSignerType::Ecdsa(holder_signer),
70097038
shutdown_scriptpubkey,
70107039
destination_script,
70117040

0 commit comments

Comments
 (0)