Skip to content

Commit 562a677

Browse files
committed
Store to-self value in the current commitment tx in ChannelMonitor
1 parent fdb172f commit 562a677

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,11 +272,15 @@ struct HolderSignedTx {
272272
b_htlc_key: PublicKey,
273273
delayed_payment_key: PublicKey,
274274
per_commitment_point: PublicKey,
275-
feerate_per_kw: u32,
276275
htlc_outputs: Vec<(HTLCOutputInCommitment, Option<Signature>, Option<HTLCSource>)>,
276+
to_self_value_sat: u64,
277+
feerate_per_kw: u32,
277278
}
278279
impl_writeable_tlv_based!(HolderSignedTx, {
279280
(0, txid, required),
281+
// Note that this is filled in with data from OnchainTxHandler if its missing. For
282+
// HolderSignedTx objects serialized with 0.0.100+, this should be filled in.
283+
(1, to_self_value_sat, (default_value, u64::max_value())),
280284
(2, revocation_key, required),
281285
(4, a_htlc_key, required),
282286
(6, b_htlc_key, required),
@@ -869,8 +873,9 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
869873
b_htlc_key: tx_keys.countersignatory_htlc_key,
870874
delayed_payment_key: tx_keys.broadcaster_delayed_payment_key,
871875
per_commitment_point: tx_keys.per_commitment_point,
872-
feerate_per_kw: trusted_tx.feerate_per_kw(),
873876
htlc_outputs: Vec::new(), // There are never any HTLCs in the initial commitment transactions
877+
to_self_value_sat: initial_holder_commitment_tx.to_broadcaster_value_sat(),
878+
feerate_per_kw: trusted_tx.feerate_per_kw(),
874879
};
875880
(holder_commitment_tx, trusted_tx.commitment_number())
876881
};
@@ -1424,8 +1429,9 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
14241429
b_htlc_key: tx_keys.countersignatory_htlc_key,
14251430
delayed_payment_key: tx_keys.broadcaster_delayed_payment_key,
14261431
per_commitment_point: tx_keys.per_commitment_point,
1427-
feerate_per_kw: trusted_tx.feerate_per_kw(),
14281432
htlc_outputs,
1433+
to_self_value_sat: holder_commitment_tx.to_broadcaster_value_sat(),
1434+
feerate_per_kw: trusted_tx.feerate_per_kw(),
14291435
}
14301436
};
14311437
self.onchain_tx_handler.provide_latest_holder_tx(holder_commitment_tx);
@@ -2710,14 +2716,15 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
27102716
}
27112717
}
27122718

2713-
let prev_holder_signed_commitment_tx = match <u8 as Readable>::read(reader)? {
2714-
0 => None,
2715-
1 => {
2716-
Some(Readable::read(reader)?)
2717-
},
2718-
_ => return Err(DecodeError::InvalidValue),
2719-
};
2720-
let current_holder_commitment_tx = Readable::read(reader)?;
2719+
let mut prev_holder_signed_commitment_tx: Option<HolderSignedTx> =
2720+
match <u8 as Readable>::read(reader)? {
2721+
0 => None,
2722+
1 => {
2723+
Some(Readable::read(reader)?)
2724+
},
2725+
_ => return Err(DecodeError::InvalidValue),
2726+
};
2727+
let mut current_holder_commitment_tx: HolderSignedTx = Readable::read(reader)?;
27212728

27222729
let current_counterparty_commitment_number = <U48 as Readable>::read(reader)?.0;
27232730
let current_holder_commitment_number = <U48 as Readable>::read(reader)?.0;
@@ -2774,11 +2781,28 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
27742781
return Err(DecodeError::InvalidValue);
27752782
}
27762783
}
2777-
let onchain_tx_handler = ReadableArgs::read(reader, keys_manager)?;
2784+
let onchain_tx_handler: OnchainTxHandler<Signer> = ReadableArgs::read(reader, keys_manager)?;
27782785

27792786
let lockdown_from_offchain = Readable::read(reader)?;
27802787
let holder_tx_signed = Readable::read(reader)?;
27812788

2789+
if let Some(prev_commitment_tx) = prev_holder_signed_commitment_tx.as_mut() {
2790+
let prev_holder_value = onchain_tx_handler.get_prev_holder_commitment_to_self_value();
2791+
if prev_holder_value.is_none() { return Err(DecodeError::InvalidValue); }
2792+
if prev_commitment_tx.to_self_value_sat == u64::max_value() {
2793+
prev_commitment_tx.to_self_value_sat = prev_holder_value.unwrap();
2794+
} else if prev_commitment_tx.to_self_value_sat != prev_holder_value.unwrap() {
2795+
return Err(DecodeError::InvalidValue);
2796+
}
2797+
}
2798+
2799+
let cur_holder_value = onchain_tx_handler.get_cur_holder_commitment_to_self_value();
2800+
if current_holder_commitment_tx.to_self_value_sat == u64::max_value() {
2801+
current_holder_commitment_tx.to_self_value_sat = cur_holder_value;
2802+
} else if current_holder_commitment_tx.to_self_value_sat != cur_holder_value {
2803+
return Err(DecodeError::InvalidValue);
2804+
}
2805+
27822806
read_tlv_fields!(reader, {});
27832807

27842808
let mut secp_ctx = Secp256k1::new();

lightning/src/chain/onchaintx.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,16 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
365365
}
366366
}
367367

368+
pub(crate) fn get_prev_holder_commitment_to_self_value(&self) -> Option<u64> {
369+
if let Some(commitment) = self.prev_holder_commitment.as_ref() {
370+
Some(commitment.to_broadcaster_value_sat())
371+
} else { None }
372+
}
373+
374+
pub(crate) fn get_cur_holder_commitment_to_self_value(&self) -> u64 {
375+
self.holder_commitment.to_broadcaster_value_sat()
376+
}
377+
368378
/// Lightning security model (i.e being able to redeem/timeout HTLC or penalize coutnerparty onchain) lays on the assumption of claim transactions getting confirmed before timelock expiration
369379
/// (CSV or CLTV following cases). In case of high-fee spikes, claim tx may stuck in the mempool, so you need to bump its feerate quickly using Replace-By-Fee or Child-Pay-For-Parent.
370380
/// Panics if there are signing errors, because signing operations in reaction to on-chain events

0 commit comments

Comments
 (0)