Skip to content

Commit b05d5f8

Browse files
committed
Store to-self value in the current commitment tx in ChannelMonitor
1 parent 145276d commit b05d5f8

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
@@ -270,11 +270,15 @@ struct HolderSignedTx {
270270
b_htlc_key: PublicKey,
271271
delayed_payment_key: PublicKey,
272272
per_commitment_point: PublicKey,
273-
feerate_per_kw: u32,
274273
htlc_outputs: Vec<(HTLCOutputInCommitment, Option<Signature>, Option<HTLCSource>)>,
274+
to_self_value_sat: u64,
275+
feerate_per_kw: u32,
275276
}
276277
impl_writeable_tlv_based!(HolderSignedTx, {
277278
(0, txid, required),
279+
// Note that this is filled in with data from OnchainTxHandler if its missing. For
280+
// HolderSignedTx objects serialized with 0.0.100+, this should be filled in.
281+
(1, to_self_value_sat, (default_value, u64::max_value())),
278282
(2, revocation_key, required),
279283
(4, a_htlc_key, required),
280284
(6, b_htlc_key, required),
@@ -855,8 +859,9 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
855859
b_htlc_key: tx_keys.countersignatory_htlc_key,
856860
delayed_payment_key: tx_keys.broadcaster_delayed_payment_key,
857861
per_commitment_point: tx_keys.per_commitment_point,
858-
feerate_per_kw: trusted_tx.feerate_per_kw(),
859862
htlc_outputs: Vec::new(), // There are never any HTLCs in the initial commitment transactions
863+
to_self_value_sat: initial_holder_commitment_tx.to_broadcaster_value_sat(),
864+
feerate_per_kw: trusted_tx.feerate_per_kw(),
860865
};
861866
(holder_commitment_tx, trusted_tx.commitment_number())
862867
};
@@ -1397,8 +1402,9 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
13971402
b_htlc_key: tx_keys.countersignatory_htlc_key,
13981403
delayed_payment_key: tx_keys.broadcaster_delayed_payment_key,
13991404
per_commitment_point: tx_keys.per_commitment_point,
1400-
feerate_per_kw: trusted_tx.feerate_per_kw(),
14011405
htlc_outputs,
1406+
to_self_value_sat: holder_commitment_tx.to_broadcaster_value_sat(),
1407+
feerate_per_kw: trusted_tx.feerate_per_kw(),
14021408
}
14031409
};
14041410
self.onchain_tx_handler.provide_latest_holder_tx(holder_commitment_tx);
@@ -2668,14 +2674,15 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
26682674
}
26692675
}
26702676

2671-
let prev_holder_signed_commitment_tx = match <u8 as Readable>::read(reader)? {
2672-
0 => None,
2673-
1 => {
2674-
Some(Readable::read(reader)?)
2675-
},
2676-
_ => return Err(DecodeError::InvalidValue),
2677-
};
2678-
let current_holder_commitment_tx = Readable::read(reader)?;
2677+
let mut prev_holder_signed_commitment_tx: Option<HolderSignedTx> =
2678+
match <u8 as Readable>::read(reader)? {
2679+
0 => None,
2680+
1 => {
2681+
Some(Readable::read(reader)?)
2682+
},
2683+
_ => return Err(DecodeError::InvalidValue),
2684+
};
2685+
let mut current_holder_commitment_tx: HolderSignedTx = Readable::read(reader)?;
26792686

26802687
let current_counterparty_commitment_number = <U48 as Readable>::read(reader)?.0;
26812688
let current_holder_commitment_number = <U48 as Readable>::read(reader)?.0;
@@ -2732,11 +2739,28 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
27322739
return Err(DecodeError::InvalidValue);
27332740
}
27342741
}
2735-
let onchain_tx_handler = ReadableArgs::read(reader, keys_manager)?;
2742+
let onchain_tx_handler: OnchainTxHandler<Signer> = ReadableArgs::read(reader, keys_manager)?;
27362743

27372744
let lockdown_from_offchain = Readable::read(reader)?;
27382745
let holder_tx_signed = Readable::read(reader)?;
27392746

2747+
if let Some(prev_commitment_tx) = prev_holder_signed_commitment_tx.as_mut() {
2748+
let prev_holder_value = onchain_tx_handler.get_prev_holder_commitment_to_self_value();
2749+
if prev_holder_value.is_none() { return Err(DecodeError::InvalidValue); }
2750+
if prev_commitment_tx.to_self_value_sat == u64::max_value() {
2751+
prev_commitment_tx.to_self_value_sat = prev_holder_value.unwrap();
2752+
} else if prev_commitment_tx.to_self_value_sat != prev_holder_value.unwrap() {
2753+
return Err(DecodeError::InvalidValue);
2754+
}
2755+
}
2756+
2757+
let cur_holder_value = onchain_tx_handler.get_cur_holder_commitment_to_self_value();
2758+
if current_holder_commitment_tx.to_self_value_sat == u64::max_value() {
2759+
current_holder_commitment_tx.to_self_value_sat = cur_holder_value;
2760+
} else if current_holder_commitment_tx.to_self_value_sat != cur_holder_value {
2761+
return Err(DecodeError::InvalidValue);
2762+
}
2763+
27402764
read_tlv_fields!(reader, {});
27412765

27422766
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)