Skip to content

Commit ca407a5

Browse files
committed
Add HolderCommitmentPoint::Uninitialized
1 parent c0e7438 commit ca407a5

File tree

1 file changed

+37
-30
lines changed

1 file changed

+37
-30
lines changed

lightning/src/ln/channel.rs

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -935,19 +935,14 @@ pub(crate) struct ShutdownResult {
935935

936936
#[derive(Debug, Copy, Clone)]
937937
enum HolderCommitmentPoint {
938+
Uninitialized { transaction_number: u64 },
938939
PendingNext { transaction_number: u64, current: PublicKey },
939940
Available { transaction_number: u64, current: PublicKey, next: PublicKey },
940941
}
941942

942-
impl HolderCommitmentPoint {
943-
pub fn new<SP: Deref>(signer: &ChannelSignerType<SP>, secp_ctx: &Secp256k1<secp256k1::All>) -> Self
944-
where SP::Target: SignerProvider
945-
{
946-
HolderCommitmentPoint::Available {
947-
transaction_number: INITIAL_COMMITMENT_NUMBER,
948-
current: signer.as_ref().get_per_commitment_point(INITIAL_COMMITMENT_NUMBER, secp_ctx),
949-
next: signer.as_ref().get_per_commitment_point(INITIAL_COMMITMENT_NUMBER - 1, secp_ctx),
950-
}
943+
impl HolderCommitmentPoint where {
944+
pub fn new() -> Self {
945+
HolderCommitmentPoint::Uninitialized { transaction_number: INITIAL_COMMITMENT_NUMBER }
951946
}
952947

953948
pub fn is_available(&self) -> bool {
@@ -956,20 +951,23 @@ impl HolderCommitmentPoint {
956951

957952
pub fn transaction_number(&self) -> u64 {
958953
match self {
954+
HolderCommitmentPoint::Uninitialized { transaction_number } => *transaction_number,
959955
HolderCommitmentPoint::PendingNext { transaction_number, .. } => *transaction_number,
960956
HolderCommitmentPoint::Available { transaction_number, .. } => *transaction_number,
961957
}
962958
}
963959

964-
pub fn current_point(&self) -> PublicKey {
960+
pub fn current_point(&self) -> Option<PublicKey> {
965961
match self {
966-
HolderCommitmentPoint::PendingNext { current, .. } => *current,
967-
HolderCommitmentPoint::Available { current, .. } => *current,
962+
HolderCommitmentPoint::Uninitialized { .. } => None,
963+
HolderCommitmentPoint::PendingNext { current, .. } => Some(*current),
964+
HolderCommitmentPoint::Available { current, .. } => Some(*current),
968965
}
969966
}
970967

971968
pub fn next_point(&self) -> Option<PublicKey> {
972969
match self {
970+
HolderCommitmentPoint::Uninitialized { .. } => None,
973971
HolderCommitmentPoint::PendingNext { .. } => None,
974972
HolderCommitmentPoint::Available { next, .. } => Some(*next),
975973
}
@@ -978,6 +976,13 @@ impl HolderCommitmentPoint {
978976
pub fn advance<SP: Deref, L: Deref>(&mut self, signer: &ChannelSignerType<SP>, secp_ctx: &Secp256k1<secp256k1::All>, logger: &L)
979977
where SP::Target: SignerProvider, L::Target: Logger
980978
{
979+
if let HolderCommitmentPoint::Uninitialized { transaction_number } = self {
980+
let current = signer.as_ref().get_per_commitment_point(*transaction_number, secp_ctx); // TODO
981+
log_trace!(logger, "Retrieved current per-commitment point {}", transaction_number);
982+
*self = HolderCommitmentPoint::PendingNext { transaction_number: *transaction_number, current };
983+
// TODO: handle error case when get_per_commitment_point becomes async
984+
}
985+
981986
if let HolderCommitmentPoint::Available { transaction_number, next, .. } = self {
982987
*self = HolderCommitmentPoint::PendingNext {
983988
transaction_number: *transaction_number - 1,
@@ -986,9 +991,10 @@ impl HolderCommitmentPoint {
986991
}
987992

988993
if let HolderCommitmentPoint::PendingNext { transaction_number, current } = self {
989-
let next = signer.as_ref().get_per_commitment_point(*transaction_number - 1, secp_ctx);
994+
let next = signer.as_ref().get_per_commitment_point(*transaction_number - 1, secp_ctx); // TODO
990995
log_trace!(logger, "Retrieved next per-commitment point {}", *transaction_number - 1);
991996
*self = HolderCommitmentPoint::Available { transaction_number: *transaction_number, current: *current, next };
997+
// TODO: handle error case when get_per_commitment_point becomes async
992998
}
993999
}
9941000
}
@@ -1614,7 +1620,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
16141620
let value_to_self_msat = our_funding_satoshis * 1000 + msg_push_msat;
16151621

16161622
let holder_signer = ChannelSignerType::Ecdsa(holder_signer);
1617-
let holder_commitment_point = HolderCommitmentPoint::new(&holder_signer, &secp_ctx);
1623+
let mut holder_commitment_point = HolderCommitmentPoint::new();
1624+
holder_commitment_point.advance(&holder_signer, &secp_ctx, &&logger);
16181625

16191626
// TODO(dual_funding): Checks for `funding_feerate_sat_per_1000_weight`?
16201627

@@ -1843,7 +1850,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
18431850
let temporary_channel_id = temporary_channel_id.unwrap_or_else(|| ChannelId::temporary_from_entropy_source(entropy_source));
18441851

18451852
let holder_signer = ChannelSignerType::Ecdsa(holder_signer);
1846-
let holder_commitment_point = HolderCommitmentPoint::new(&holder_signer, &secp_ctx);
1853+
let mut holder_commitment_point = HolderCommitmentPoint::new();
1854+
holder_commitment_point.advance(&holder_signer, &secp_ctx, logger);
18471855

18481856
Ok(Self {
18491857
user_id,
@@ -2567,7 +2575,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
25672575
/// The result is a transaction which we can revoke broadcastership of (ie a "local" transaction)
25682576
/// TODO Some magic rust shit to compile-time check this?
25692577
fn build_holder_transaction_keys(&self) -> TxCreationKeys {
2570-
let per_commitment_point = self.holder_commitment_point.current_point();
2578+
let per_commitment_point = self.holder_commitment_point.current_point()
2579+
.expect("Should not build commitment transaction before retrieving first commitment point");
25712580
let delayed_payment_base = &self.get_holder_pubkeys().delayed_payment_basepoint;
25722581
let htlc_basepoint = &self.get_holder_pubkeys().htlc_basepoint;
25732582
let counterparty_pubkeys = self.get_counterparty_pubkeys();
@@ -5227,7 +5236,8 @@ impl<SP: Deref> Channel<SP> where
52275236
debug_assert!(self.context.holder_commitment_point.transaction_number() <= INITIAL_COMMITMENT_NUMBER + 2);
52285237
// TODO: handle non-available case when get_per_commitment_point becomes async
52295238
debug_assert!(self.context.holder_commitment_point.is_available());
5230-
let next_per_commitment_point = self.context.holder_commitment_point.current_point();
5239+
let next_per_commitment_point = self.context.holder_commitment_point.current_point()
5240+
.expect("TODO");
52315241
let per_commitment_secret = self.context.holder_signer.as_ref().release_commitment_secret(self.context.holder_commitment_point.transaction_number() + 2);
52325242
msgs::RevokeAndACK {
52335243
channel_id: self.context.channel_id,
@@ -6369,7 +6379,8 @@ impl<SP: Deref> Channel<SP> where
63696379
debug_assert!(self.context.holder_commitment_point.is_available());
63706380
msgs::ChannelReady {
63716381
channel_id: self.context.channel_id(),
6372-
next_per_commitment_point: self.context.holder_commitment_point.current_point(),
6382+
next_per_commitment_point: self.context.holder_commitment_point.current_point()
6383+
.expect("TODO"),
63736384
short_channel_id_alias: Some(self.context.outbound_scid_alias),
63746385
}
63756386
}
@@ -7432,7 +7443,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
74327443
}
74337444

74347445
debug_assert!(self.context.holder_commitment_point.is_available());
7435-
let first_per_commitment_point = self.context.holder_commitment_point.current_point();
7446+
let first_per_commitment_point = self.context.holder_commitment_point.current_point().expect("TODO");
74367447
let keys = self.context.get_holder_pubkeys();
74377448

74387449
msgs::OpenChannel {
@@ -7831,7 +7842,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
78317842
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
78327843
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
78337844
debug_assert!(self.context.holder_commitment_point.is_available());
7834-
let first_per_commitment_point = self.context.holder_commitment_point.current_point();
7845+
let first_per_commitment_point = self.context.holder_commitment_point.current_point().expect("TODO");
78357846
let keys = self.context.get_holder_pubkeys();
78367847

78377848
msgs::AcceptChannel {
@@ -8676,8 +8687,7 @@ impl<SP: Deref> Writeable for Channel<SP> where SP::Target: SignerProvider {
86768687
monitor_pending_update_adds = Some(&self.context.monitor_pending_update_adds);
86778688
}
86788689

8679-
// `current_point` will become optional when async signing is implemented.
8680-
let cur_holder_commitment_point = Some(self.context.holder_commitment_point.current_point());
8690+
let cur_holder_commitment_point = self.context.holder_commitment_point.current_point();
86818691
let next_holder_commitment_point = self.context.holder_commitment_point.next_point();
86828692

86838693
write_tlv_fields!(writer, {
@@ -9181,15 +9191,12 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
91819191
(Some(current), Some(next)) => HolderCommitmentPoint::Available {
91829192
transaction_number: cur_holder_commitment_transaction_number, current, next
91839193
},
9184-
(Some(current), _) => HolderCommitmentPoint::Available {
9185-
transaction_number: cur_holder_commitment_transaction_number, current,
9186-
next: holder_signer.get_per_commitment_point(cur_holder_commitment_transaction_number - 1, &secp_ctx),
9187-
},
9188-
(_, _) => HolderCommitmentPoint::Available {
9189-
transaction_number: cur_holder_commitment_transaction_number,
9190-
current: holder_signer.get_per_commitment_point(cur_holder_commitment_transaction_number, &secp_ctx),
9191-
next: holder_signer.get_per_commitment_point(cur_holder_commitment_transaction_number - 1, &secp_ctx),
9194+
(Some(current), _) => HolderCommitmentPoint::PendingNext {
9195+
transaction_number: cur_holder_commitment_transaction_number, current
91929196
},
9197+
(_, _) => HolderCommitmentPoint::Uninitialized {
9198+
transaction_number: cur_holder_commitment_transaction_number
9199+
}
91939200
};
91949201

91959202
Ok(Channel {

0 commit comments

Comments
 (0)