Skip to content

Commit 5d7d5de

Browse files
committed
Split update_holder_per_commitment
Split `update_holder_per_commitment` into two parts: 1. `update_holder_per_commitment_point`, which we call to retrieve a new commitment point. 2. `update_holder_commitment_secret`, which we call when we're ready to release the commitment secret. This delays releasing the secret until we actually need it for the revoke-and-ack. By doing this, we restore the signer check to its original condition, as well.
1 parent 9571301 commit 5d7d5de

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

lightning/src/ln/channel.rs

+22-9
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
12831283
}
12841284

12851285
/// Retrieves the next commitment point and previous commitment secret from the signer.
1286-
pub fn update_holder_per_commitment<L: Deref>(&mut self, logger: &L) where L::Target: Logger
1286+
pub fn update_holder_per_commitment_point<L: Deref>(&mut self, logger: &L) where L::Target: Logger
12871287
{
12881288
let transaction_number = self.cur_holder_commitment_transaction_number;
12891289
let signer = self.holder_signer.as_ref();
@@ -1308,6 +1308,12 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
13081308
None
13091309
}
13101310
};
1311+
}
1312+
1313+
pub fn update_holder_commitment_secret<L: Deref>(&mut self, logger: &L) where L::Target: Logger
1314+
{
1315+
let transaction_number = self.cur_holder_commitment_transaction_number;
1316+
let signer = self.holder_signer.as_ref();
13111317

13121318
let releasing_transaction_number = transaction_number + 2;
13131319
if releasing_transaction_number <= INITIAL_COMMITMENT_NUMBER {
@@ -2845,7 +2851,7 @@ impl<SP: Deref> Channel<SP> where
28452851
self.context.channel_state = ChannelState::FundingSent as u32;
28462852
}
28472853
self.context.cur_holder_commitment_transaction_number -= 1;
2848-
self.context.update_holder_per_commitment(logger);
2854+
self.context.update_holder_per_commitment_point(logger);
28492855
self.context.cur_counterparty_commitment_transaction_number -= 1;
28502856

28512857
log_info!(logger, "Received funding_signed from peer for channel {}", &self.context.channel_id());
@@ -3358,7 +3364,7 @@ impl<SP: Deref> Channel<SP> where
33583364
};
33593365

33603366
self.context.cur_holder_commitment_transaction_number -= 1;
3361-
self.context.update_holder_per_commitment(logger);
3367+
self.context.update_holder_per_commitment_point(logger);
33623368

33633369
// Note that if we need_commitment & !AwaitingRemoteRevoke we'll call
33643370
// build_commitment_no_status_check() next which will reset this to RAAFirst.
@@ -4048,6 +4054,7 @@ impl<SP: Deref> Channel<SP> where
40484054
}
40494055

40504056
let raa = if self.context.monitor_pending_revoke_and_ack {
4057+
self.context.update_holder_commitment_secret(logger);
40514058
self.get_last_revoke_and_ack(logger).or_else(|| {
40524059
log_trace!(logger, "Monitor was pending RAA, but RAA is not available; setting signer_pending_revoke_and_ack");
40534060
self.context.signer_pending_revoke_and_ack = true;
@@ -4141,9 +4148,14 @@ impl<SP: Deref> Channel<SP> where
41414148
log_trace!(logger, "Signing unblocked in channel {} at sequence {}",
41424149
&self.context.channel_id(), self.context.cur_holder_commitment_transaction_number);
41434150

4144-
if self.context.signer_pending_commitment_point || self.context.signer_pending_released_secret {
4145-
log_trace!(logger, "Attempting to update holder per-commitment for pending commitment point and secret...");
4146-
self.context.update_holder_per_commitment(logger);
4151+
if self.context.signer_pending_commitment_point {
4152+
log_trace!(logger, "Attempting to update holder per-commitment point...");
4153+
self.context.update_holder_per_commitment_point(logger);
4154+
}
4155+
4156+
if self.context.signer_pending_released_secret {
4157+
log_trace!(logger, "Attempting to update holder commitment secret...");
4158+
self.context.update_holder_commitment_secret(logger);
41474159
}
41484160

41494161
if self.context.channel_state & (ChannelState::PeerDisconnected as u32) != 0 {
@@ -4500,6 +4512,7 @@ impl<SP: Deref> Channel<SP> where
45004512
self.context.monitor_pending_revoke_and_ack = true;
45014513
None
45024514
} else {
4515+
self.context.update_holder_commitment_secret(logger);
45034516
self.get_last_revoke_and_ack(logger).map(|raa| {
45044517
if self.context.signer_pending_revoke_and_ack {
45054518
log_trace!(logger, "Generated RAA for channel_reestablish; clearing signer_pending_revoke_and_ack");
@@ -6691,7 +6704,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
66916704
where L::Target: Logger
66926705
{
66936706
let open_channel = if self.signer_pending_open_channel {
6694-
self.context.update_holder_per_commitment(logger);
6707+
self.context.update_holder_per_commitment_point(logger);
66956708
self.get_open_channel(chain_hash.clone()).map(|msg| {
66966709
log_trace!(logger, "Clearing signer_pending_open_channel");
66976710
self.signer_pending_open_channel = false;
@@ -7200,7 +7213,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
72007213
self.context.channel_id = funding_txo.to_channel_id();
72017214
self.context.cur_counterparty_commitment_transaction_number -= 1;
72027215
self.context.cur_holder_commitment_transaction_number -= 1;
7203-
self.context.update_holder_per_commitment(logger);
7216+
self.context.update_holder_per_commitment_point(logger);
72047217

72057218
let (counterparty_initial_commitment_tx, funding_signed) = self.context.get_funding_signed_msg(logger);
72067219

@@ -7248,7 +7261,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
72487261
where L::Target: Logger
72497262
{
72507263
let accept_channel = if self.signer_pending_accept_channel {
7251-
self.context.update_holder_per_commitment(logger);
7264+
self.context.update_holder_per_commitment_point(logger);
72527265
self.generate_accept_channel_message().map(|msg| {
72537266
log_trace!(logger, "Clearing signer_pending_accept_channel");
72547267
self.signer_pending_accept_channel = false;

lightning/src/ln/channelmanager.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -10140,7 +10140,8 @@ where
1014010140
log_info!(args.logger, "Successfully loaded channel {} at update_id {} against monitor at update id {}",
1014110141
&channel.context.channel_id(), channel.context.get_latest_monitor_update_id(),
1014210142
monitor.get_latest_update_id());
10143-
channel.context.update_holder_per_commitment(&args.logger);
10143+
channel.context.update_holder_per_commitment_point(&args.logger);
10144+
channel.context.update_holder_commitment_secret(&args.logger);
1014410145
if let Some(short_channel_id) = channel.context.get_short_channel_id() {
1014510146
short_to_chan_info.insert(short_channel_id, (channel.context.get_counterparty_node_id(), channel.context.channel_id()));
1014610147
}

lightning/src/util/test_channel_signer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl EcdsaChannelSigner for TestChannelSigner {
238238
let trusted_tx = self.verify_holder_commitment_tx(commitment_tx, secp_ctx);
239239
let state = self.state.lock().unwrap();
240240
let commitment_number = trusted_tx.commitment_number();
241-
if state.last_holder_revoked_commitment != commitment_number && state.last_holder_revoked_commitment - 1 != commitment_number {
241+
if state.last_holder_revoked_commitment - 1 != commitment_number && state.last_holder_revoked_commitment - 2 != commitment_number {
242242
if !self.disable_revocation_policy_check {
243243
panic!("can only sign the next two unrevoked commitment numbers, revoked={} vs requested={} for {}",
244244
state.last_holder_revoked_commitment, commitment_number, self.inner.commitment_seed[0])

0 commit comments

Comments
 (0)