@@ -935,19 +935,14 @@ pub(crate) struct ShutdownResult {
935
935
936
936
#[derive(Debug, Copy, Clone)]
937
937
enum HolderCommitmentPoint {
938
+ Uninitialized { transaction_number: u64 },
938
939
PendingNext { transaction_number: u64, current: PublicKey },
939
940
Available { transaction_number: u64, current: PublicKey, next: PublicKey },
940
941
}
941
942
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 }
951
946
}
952
947
953
948
pub fn is_available(&self) -> bool {
@@ -956,20 +951,23 @@ impl HolderCommitmentPoint {
956
951
957
952
pub fn transaction_number(&self) -> u64 {
958
953
match self {
954
+ HolderCommitmentPoint::Uninitialized { transaction_number } => *transaction_number,
959
955
HolderCommitmentPoint::PendingNext { transaction_number, .. } => *transaction_number,
960
956
HolderCommitmentPoint::Available { transaction_number, .. } => *transaction_number,
961
957
}
962
958
}
963
959
964
- pub fn current_point(&self) -> PublicKey {
960
+ pub fn current_point(&self) -> Option< PublicKey> {
965
961
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),
968
965
}
969
966
}
970
967
971
968
pub fn next_point(&self) -> Option<PublicKey> {
972
969
match self {
970
+ HolderCommitmentPoint::Uninitialized { .. } => None,
973
971
HolderCommitmentPoint::PendingNext { .. } => None,
974
972
HolderCommitmentPoint::Available { next, .. } => Some(*next),
975
973
}
@@ -978,6 +976,13 @@ impl HolderCommitmentPoint {
978
976
pub fn advance<SP: Deref, L: Deref>(&mut self, signer: &ChannelSignerType<SP>, secp_ctx: &Secp256k1<secp256k1::All>, logger: &L)
979
977
where SP::Target: SignerProvider, L::Target: Logger
980
978
{
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
+
981
986
if let HolderCommitmentPoint::Available { transaction_number, next, .. } = self {
982
987
*self = HolderCommitmentPoint::PendingNext {
983
988
transaction_number: *transaction_number - 1,
@@ -986,9 +991,10 @@ impl HolderCommitmentPoint {
986
991
}
987
992
988
993
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
990
995
log_trace!(logger, "Retrieved next per-commitment point {}", *transaction_number - 1);
991
996
*self = HolderCommitmentPoint::Available { transaction_number: *transaction_number, current: *current, next };
997
+ // TODO: handle error case when get_per_commitment_point becomes async
992
998
}
993
999
}
994
1000
}
@@ -1614,7 +1620,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
1614
1620
let value_to_self_msat = our_funding_satoshis * 1000 + msg_push_msat;
1615
1621
1616
1622
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);
1618
1625
1619
1626
// TODO(dual_funding): Checks for `funding_feerate_sat_per_1000_weight`?
1620
1627
@@ -1843,7 +1850,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
1843
1850
let temporary_channel_id = temporary_channel_id.unwrap_or_else(|| ChannelId::temporary_from_entropy_source(entropy_source));
1844
1851
1845
1852
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);
1847
1855
1848
1856
Ok(Self {
1849
1857
user_id,
@@ -2567,7 +2575,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
2567
2575
/// The result is a transaction which we can revoke broadcastership of (ie a "local" transaction)
2568
2576
/// TODO Some magic rust shit to compile-time check this?
2569
2577
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");
2571
2580
let delayed_payment_base = &self.get_holder_pubkeys().delayed_payment_basepoint;
2572
2581
let htlc_basepoint = &self.get_holder_pubkeys().htlc_basepoint;
2573
2582
let counterparty_pubkeys = self.get_counterparty_pubkeys();
@@ -5227,7 +5236,8 @@ impl<SP: Deref> Channel<SP> where
5227
5236
debug_assert!(self.context.holder_commitment_point.transaction_number() <= INITIAL_COMMITMENT_NUMBER + 2);
5228
5237
// TODO: handle non-available case when get_per_commitment_point becomes async
5229
5238
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");
5231
5241
let per_commitment_secret = self.context.holder_signer.as_ref().release_commitment_secret(self.context.holder_commitment_point.transaction_number() + 2);
5232
5242
msgs::RevokeAndACK {
5233
5243
channel_id: self.context.channel_id,
@@ -6369,7 +6379,8 @@ impl<SP: Deref> Channel<SP> where
6369
6379
debug_assert!(self.context.holder_commitment_point.is_available());
6370
6380
msgs::ChannelReady {
6371
6381
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"),
6373
6384
short_channel_id_alias: Some(self.context.outbound_scid_alias),
6374
6385
}
6375
6386
}
@@ -7432,7 +7443,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7432
7443
}
7433
7444
7434
7445
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") ;
7436
7447
let keys = self.context.get_holder_pubkeys();
7437
7448
7438
7449
msgs::OpenChannel {
@@ -7831,7 +7842,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
7831
7842
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
7832
7843
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
7833
7844
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") ;
7835
7846
let keys = self.context.get_holder_pubkeys();
7836
7847
7837
7848
msgs::AcceptChannel {
@@ -8676,8 +8687,7 @@ impl<SP: Deref> Writeable for Channel<SP> where SP::Target: SignerProvider {
8676
8687
monitor_pending_update_adds = Some(&self.context.monitor_pending_update_adds);
8677
8688
}
8678
8689
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();
8681
8691
let next_holder_commitment_point = self.context.holder_commitment_point.next_point();
8682
8692
8683
8693
write_tlv_fields!(writer, {
@@ -9181,15 +9191,12 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
9181
9191
(Some(current), Some(next)) => HolderCommitmentPoint::Available {
9182
9192
transaction_number: cur_holder_commitment_transaction_number, current, next
9183
9193
},
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
9192
9196
},
9197
+ (_, _) => HolderCommitmentPoint::Uninitialized {
9198
+ transaction_number: cur_holder_commitment_transaction_number
9199
+ }
9193
9200
};
9194
9201
9195
9202
Ok(Channel {
0 commit comments