Skip to content

Commit 814fd79

Browse files
committed
replace HolderCommitmentTransaction with HolderCommitmentTransactionInfo, except for signing API
1 parent ca13315 commit 814fd79

File tree

5 files changed

+236
-123
lines changed

5 files changed

+236
-123
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use bitcoin::secp256k1;
3939

4040
use ln::msgs::DecodeError;
4141
use ln::chan_utils;
42-
use ln::chan_utils::{CounterpartyCommitmentSecrets, HTLCOutputInCommitment, HolderCommitmentTransaction, HTLCType, ChannelPublicKeys};
42+
use ln::chan_utils::{CounterpartyCommitmentSecrets, HTLCOutputInCommitment, HTLCType, ChannelStaticInfo, HolderCommitmentTransactionInfo};
4343
use ln::channelmanager::{HTLCSource, PaymentPreimage, PaymentHash};
4444
use ln::onchaintx::{OnchainTxHandler, InputDescriptors};
4545
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
@@ -474,7 +474,7 @@ const MIN_SERIALIZATION_VERSION: u8 = 1;
474474
#[derive(Clone)]
475475
pub(crate) enum ChannelMonitorUpdateStep {
476476
LatestHolderCommitmentTXInfo {
477-
commitment_tx: HolderCommitmentTransaction,
477+
commitment_info: HolderCommitmentTransactionInfo,
478478
htlc_outputs: Vec<(HTLCOutputInCommitment, Option<Signature>, Option<HTLCSource>)>,
479479
},
480480
LatestCounterpartyCommitmentTXInfo {
@@ -502,7 +502,7 @@ pub(crate) enum ChannelMonitorUpdateStep {
502502
impl Writeable for ChannelMonitorUpdateStep {
503503
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
504504
match self {
505-
&ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo { ref commitment_tx, ref htlc_outputs } => {
505+
&ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo { commitment_info: ref commitment_tx, ref htlc_outputs } => {
506506
0u8.write(w)?;
507507
commitment_tx.write(w)?;
508508
(htlc_outputs.len() as u64).write(w)?;
@@ -545,7 +545,7 @@ impl Readable for ChannelMonitorUpdateStep {
545545
match Readable::read(r)? {
546546
0u8 => {
547547
Ok(ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo {
548-
commitment_tx: Readable::read(r)?,
548+
commitment_info: Readable::read(r)?,
549549
htlc_outputs: {
550550
let len: u64 = Readable::read(r)?;
551551
let mut res = Vec::new();
@@ -934,46 +934,48 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
934934

935935
impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
936936
pub(crate) fn new(keys: ChanSigner, shutdown_pubkey: &PublicKey,
937-
on_counterparty_tx_csv: u16, destination_script: &Script, funding_info: (OutPoint, Script),
938-
counterparty_pubkeys: &ChannelPublicKeys,
939-
on_holder_tx_csv: u16, funding_redeemscript: Script, channel_value_satoshis: u64,
940-
commitment_transaction_number_obscure_factor: u64,
941-
is_outbound: bool,
942-
initial_holder_commitment_tx: HolderCommitmentTransaction) -> ChannelMonitor<ChanSigner> {
937+
on_counterparty_tx_csv: u16, destination_script: &Script, funding_info: (OutPoint, Script),
938+
channel_static_info: &ChannelStaticInfo,
939+
funding_redeemscript: Script, channel_value_satoshis: u64,
940+
commitment_transaction_number_obscure_factor: u64,
941+
initial_holder_commitment_info: HolderCommitmentTransactionInfo) -> ChannelMonitor<ChanSigner> {
943942

944943
assert!(commitment_transaction_number_obscure_factor <= (1 << 48));
945944
let our_channel_close_key_hash = WPubkeyHash::hash(&shutdown_pubkey.serialize());
946945
let shutdown_script = Builder::new().push_opcode(opcodes::all::OP_PUSHBYTES_0).push_slice(&our_channel_close_key_hash[..]).into_script();
947946
let payment_key_hash = WPubkeyHash::hash(&keys.pubkeys().payment_point.serialize());
948947
let counterparty_payment_script = Builder::new().push_opcode(opcodes::all::OP_PUSHBYTES_0).push_slice(&payment_key_hash[..]).into_script();
949948

949+
let counterparty_pubkeys = &channel_static_info.counterparty_pubkeys;
950950
let counterparty_delayed_payment_base_key = counterparty_pubkeys.delayed_payment_basepoint;
951951
let counterparty_htlc_base_key = counterparty_pubkeys.htlc_basepoint;
952952
let counterparty_tx_cache = CounterpartyCommitmentTransaction { counterparty_delayed_payment_base_key, counterparty_htlc_base_key, on_counterparty_tx_csv, per_htlc: HashMap::new() };
953953

954-
let mut onchain_tx_handler = OnchainTxHandler::new(destination_script.clone(), keys.clone(), on_holder_tx_csv);
954+
let mut onchain_tx_handler = OnchainTxHandler::new(destination_script.clone(), keys.clone(), channel_static_info.clone());
955955

956-
let holder_tx_sequence = initial_holder_commitment_tx.unsigned_tx.input[0].sequence as u64;
957-
let holder_tx_locktime = initial_holder_commitment_tx.unsigned_tx.lock_time as u64;
956+
let current_holder_commitment_number = initial_holder_commitment_info.info.commitment_number;
957+
let secp_ctx = Secp256k1::new();
958+
959+
let txid = initial_holder_commitment_info.txid(channel_static_info, &secp_ctx);
958960
let holder_commitment_tx = HolderSignedTx {
959-
txid: initial_holder_commitment_tx.txid(),
960-
revocation_key: initial_holder_commitment_tx.keys.revocation_key,
961-
a_htlc_key: initial_holder_commitment_tx.keys.broadcaster_htlc_key,
962-
b_htlc_key: initial_holder_commitment_tx.keys.countersignatory_htlc_key,
963-
delayed_payment_key: initial_holder_commitment_tx.keys.broadcaster_delayed_payment_key,
964-
per_commitment_point: initial_holder_commitment_tx.keys.per_commitment_point,
965-
feerate_per_kw: initial_holder_commitment_tx.feerate_per_kw,
961+
txid,
962+
revocation_key: initial_holder_commitment_info.info.keys.revocation_key,
963+
a_htlc_key: initial_holder_commitment_info.info.keys.broadcaster_htlc_key,
964+
b_htlc_key: initial_holder_commitment_info.info.keys.countersignatory_htlc_key,
965+
delayed_payment_key: initial_holder_commitment_info.info.keys.broadcaster_delayed_payment_key,
966+
per_commitment_point: initial_holder_commitment_info.info.keys.per_commitment_point,
967+
feerate_per_kw: initial_holder_commitment_info.info.feerate_per_kw,
966968
htlc_outputs: Vec::new(), // There are never any HTLCs in the initial commitment transactions
967969
};
968-
onchain_tx_handler.provide_latest_holder_tx(initial_holder_commitment_tx);
970+
onchain_tx_handler.provide_latest_holder_tx(initial_holder_commitment_info);
969971

970972
let mut outputs_to_watch = HashMap::new();
971973
outputs_to_watch.insert(funding_info.0.txid, vec![funding_info.1.clone()]);
972974

973975
ChannelMonitor {
974976
latest_update_id: 0,
975977
commitment_transaction_number_obscure_factor,
976-
is_outbound,
978+
is_outbound: channel_static_info.is_outbound_from_holder,
977979

978980
destination_script: destination_script.clone(),
979981
broadcasted_holder_revokable_script: None,
@@ -990,7 +992,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
990992
channel_value_satoshis,
991993
their_cur_revocation_points: None,
992994

993-
on_holder_tx_csv,
995+
on_holder_tx_csv: channel_static_info.counterparty_selected_contest_delay,
994996

995997
commitment_secrets: CounterpartyCommitmentSecrets::new(),
996998
counterparty_claimable_outpoints: HashMap::new(),
@@ -1000,7 +1002,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
10001002
prev_holder_signed_commitment_tx: None,
10011003
current_holder_commitment_tx: holder_commitment_tx,
10021004
current_counterparty_commitment_number: 1 << 48,
1003-
current_holder_commitment_number: 0xffff_ffff_ffff - ((((holder_tx_sequence & 0xffffff) << 3*8) | (holder_tx_locktime as u64 & 0xffffff)) ^ commitment_transaction_number_obscure_factor),
1005+
current_holder_commitment_number,
10041006

10051007
payment_preimages: HashMap::new(),
10061008
pending_monitor_events: Vec::new(),
@@ -1015,7 +1017,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
10151017
holder_tx_signed: false,
10161018

10171019
last_block_hash: Default::default(),
1018-
secp_ctx: Secp256k1::new(),
1020+
secp_ctx: secp_ctx,
10191021
}
10201022
}
10211023

@@ -1123,22 +1125,20 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
11231125
/// is important that any clones of this channel monitor (including remote clones) by kept
11241126
/// up-to-date as our holder commitment transaction is updated.
11251127
/// Panics if set_on_holder_tx_csv has never been called.
1126-
fn provide_latest_holder_commitment_tx_info(&mut self, commitment_tx: HolderCommitmentTransaction, htlc_outputs: Vec<(HTLCOutputInCommitment, Option<Signature>, Option<HTLCSource>)>) -> Result<(), MonitorUpdateError> {
1127-
let txid = commitment_tx.txid();
1128-
let sequence = commitment_tx.unsigned_tx.input[0].sequence as u64;
1129-
let locktime = commitment_tx.unsigned_tx.lock_time as u64;
1128+
fn provide_latest_holder_commitment_tx_info(&mut self, commitment_info: HolderCommitmentTransactionInfo, htlc_outputs: Vec<(HTLCOutputInCommitment, Option<Signature>, Option<HTLCSource>)>) -> Result<(), MonitorUpdateError> {
1129+
let txid = commitment_info.txid(&self.onchain_tx_handler.channel_static_info, &self.secp_ctx);
11301130
let mut new_holder_commitment_tx = HolderSignedTx {
11311131
txid,
1132-
revocation_key: commitment_tx.keys.revocation_key,
1133-
a_htlc_key: commitment_tx.keys.broadcaster_htlc_key,
1134-
b_htlc_key: commitment_tx.keys.countersignatory_htlc_key,
1135-
delayed_payment_key: commitment_tx.keys.broadcaster_delayed_payment_key,
1136-
per_commitment_point: commitment_tx.keys.per_commitment_point,
1137-
feerate_per_kw: commitment_tx.feerate_per_kw,
1132+
revocation_key: commitment_info.info.keys.revocation_key,
1133+
a_htlc_key: commitment_info.info.keys.broadcaster_htlc_key,
1134+
b_htlc_key: commitment_info.info.keys.countersignatory_htlc_key,
1135+
delayed_payment_key: commitment_info.info.keys.broadcaster_delayed_payment_key,
1136+
per_commitment_point: commitment_info.info.keys.per_commitment_point,
1137+
feerate_per_kw: commitment_info.info.feerate_per_kw,
11381138
htlc_outputs,
11391139
};
1140-
self.onchain_tx_handler.provide_latest_holder_tx(commitment_tx);
1141-
self.current_holder_commitment_number = 0xffff_ffff_ffff - ((((sequence & 0xffffff) << 3*8) | (locktime as u64 & 0xffffff)) ^ self.commitment_transaction_number_obscure_factor);
1140+
self.current_holder_commitment_number = commitment_info.info.commitment_number;
1141+
self.onchain_tx_handler.provide_latest_holder_tx(commitment_info);
11421142
mem::swap(&mut new_holder_commitment_tx, &mut self.current_holder_commitment_tx);
11431143
self.prev_holder_signed_commitment_tx = Some(new_holder_commitment_tx);
11441144
if self.holder_tx_signed {
@@ -1176,7 +1176,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
11761176
}
11771177
for update in updates.updates.drain(..) {
11781178
match update {
1179-
ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo { commitment_tx, htlc_outputs } => {
1179+
ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo { commitment_info: commitment_tx, htlc_outputs } => {
11801180
if self.lockdown_from_offchain { panic!(); }
11811181
self.provide_latest_holder_commitment_tx_info(commitment_tx, htlc_outputs)?
11821182
},
@@ -2407,7 +2407,7 @@ mod tests {
24072407
use ln::channelmanager::{PaymentPreimage, PaymentHash};
24082408
use ln::onchaintx::{OnchainTxHandler, InputDescriptors};
24092409
use ln::chan_utils;
2410-
use ln::chan_utils::{HTLCOutputInCommitment, HolderCommitmentTransaction, ChannelPublicKeys};
2410+
use ln::chan_utils::{HTLCOutputInCommitment, ChannelPublicKeys, ChannelStaticInfo, HolderCommitmentTransactionInfo};
24112411
use util::test_utils::TestLogger;
24122412
use bitcoin::secp256k1::key::{SecretKey,PublicKey};
24132413
use bitcoin::secp256k1::Secp256k1;
@@ -2485,16 +2485,24 @@ mod tests {
24852485
delayed_payment_basepoint: PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[47; 32]).unwrap()),
24862486
htlc_basepoint: PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[48; 32]).unwrap())
24872487
};
2488+
let channel_static_info = ChannelStaticInfo {
2489+
holder_pubkeys: keys.holder_channel_pubkeys.clone(),
2490+
counterparty_pubkeys,
2491+
holder_selected_contest_delay: 66,
2492+
counterparty_selected_contest_delay: 67,
2493+
funding_outpoint: Default::default(),
2494+
is_outbound_from_holder: true
2495+
};
24882496
// Prune with one old state and a holder commitment tx holding a few overlaps with the
24892497
// old state.
24902498
let mut monitor = ChannelMonitor::new(keys,
24912499
&PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap()), 0, &Script::new(),
24922500
(OutPoint { txid: Txid::from_slice(&[43; 32]).unwrap(), index: 0 }, Script::new()),
2493-
&counterparty_pubkeys,
2494-
10, Script::new(), 46, 0,
2495-
true, HolderCommitmentTransaction::dummy());
2501+
&channel_static_info,
2502+
Script::new(), 46, 0,
2503+
HolderCommitmentTransactionInfo::dummy());
24962504

2497-
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransaction::dummy(), preimages_to_holder_htlcs!(preimages[0..10])).unwrap();
2505+
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransactionInfo::dummy(), preimages_to_holder_htlcs!(preimages[0..10])).unwrap();
24982506
monitor.provide_latest_counterparty_commitment_tx_info(&dummy_tx, preimages_slice_to_htlc_outputs!(preimages[5..15]), 281474976710655, dummy_key, &logger);
24992507
monitor.provide_latest_counterparty_commitment_tx_info(&dummy_tx, preimages_slice_to_htlc_outputs!(preimages[15..20]), 281474976710654, dummy_key, &logger);
25002508
monitor.provide_latest_counterparty_commitment_tx_info(&dummy_tx, preimages_slice_to_htlc_outputs!(preimages[17..20]), 281474976710653, dummy_key, &logger);
@@ -2520,15 +2528,15 @@ mod tests {
25202528

25212529
// Now update holder commitment tx info, pruning only element 18 as we still care about the
25222530
// previous commitment tx's preimages too
2523-
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransaction::dummy(), preimages_to_holder_htlcs!(preimages[0..5])).unwrap();
2531+
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransactionInfo::dummy(), preimages_to_holder_htlcs!(preimages[0..5])).unwrap();
25242532
secret[0..32].clone_from_slice(&hex::decode("2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8").unwrap());
25252533
monitor.provide_secret(281474976710653, secret.clone()).unwrap();
25262534
assert_eq!(monitor.payment_preimages.len(), 12);
25272535
test_preimages_exist!(&preimages[0..10], monitor);
25282536
test_preimages_exist!(&preimages[18..20], monitor);
25292537

25302538
// But if we do it again, we'll prune 5-10
2531-
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransaction::dummy(), preimages_to_holder_htlcs!(preimages[0..3])).unwrap();
2539+
monitor.provide_latest_holder_commitment_tx_info(HolderCommitmentTransactionInfo::dummy(), preimages_to_holder_htlcs!(preimages[0..3])).unwrap();
25322540
secret[0..32].clone_from_slice(&hex::decode("27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116").unwrap());
25332541
monitor.provide_secret(281474976710652, secret.clone()).unwrap();
25342542
assert_eq!(monitor.payment_preimages.len(), 5);

0 commit comments

Comments
 (0)