X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fchain%2Fchannelmonitor.rs;h=f0b23c08619632c4ab14d45f5322d51cc017c38d;hb=7d8dc7ac1a05606e6422e0b4126b95717adc075d;hp=ed206dcfe3a1cbde072b6cceca267e16b8d452c7;hpb=1c72489e52ab30d08befe6e9478aca48fef654fb;p=rust-lightning diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index ed206dcf..f0b23c08 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -708,7 +708,7 @@ pub(crate) struct ChannelMonitorImpl { // Used to track on-chain events (i.e., transactions part of channels confirmed on chain) on // which to take actions once they reach enough confirmations. Each entry includes the // transaction's id and the height when the transaction was confirmed on chain. - onchain_events_waiting_threshold_conf: Vec, + onchain_events_awaiting_threshold_conf: Vec, // If we get serialized out and re-read, we need to make sure that the chain monitoring // interface knows about the TXOs that we want to be notified of spends of. We could probably @@ -746,7 +746,7 @@ pub(crate) struct ChannelMonitorImpl { } /// Transaction outputs to watch for on-chain spends. -pub(super) type TransactionOutputs = (Txid, Vec<(u32, TxOut)>); +pub type TransactionOutputs = (Txid, Vec<(u32, TxOut)>); #[cfg(any(test, feature = "fuzztarget", feature = "_test_utils"))] /// Used only in testing and fuzztarget to check serialization roundtrips don't change the @@ -790,7 +790,7 @@ impl PartialEq for ChannelMonitorImpl { self.payment_preimages != other.payment_preimages || self.pending_monitor_events != other.pending_monitor_events || self.pending_events.len() != other.pending_events.len() || // We trust events to round-trip properly - self.onchain_events_waiting_threshold_conf != other.onchain_events_waiting_threshold_conf || + self.onchain_events_awaiting_threshold_conf != other.onchain_events_awaiting_threshold_conf || self.outputs_to_watch != other.outputs_to_watch || self.lockdown_from_offchain != other.lockdown_from_offchain || self.holder_tx_signed != other.holder_tx_signed @@ -959,8 +959,8 @@ impl Writeable for ChannelMonitorImpl { self.best_block.block_hash().write(writer)?; writer.write_all(&byte_utils::be32_to_array(self.best_block.height()))?; - writer.write_all(&byte_utils::be64_to_array(self.onchain_events_waiting_threshold_conf.len() as u64))?; - for ref entry in self.onchain_events_waiting_threshold_conf.iter() { + writer.write_all(&byte_utils::be64_to_array(self.onchain_events_awaiting_threshold_conf.len() as u64))?; + for ref entry in self.onchain_events_awaiting_threshold_conf.iter() { entry.txid.write(writer)?; writer.write_all(&byte_utils::be32_to_array(entry.height))?; match entry.event { @@ -1080,7 +1080,7 @@ impl ChannelMonitor { pending_monitor_events: Vec::new(), pending_events: Vec::new(), - onchain_events_waiting_threshold_conf: Vec::new(), + onchain_events_awaiting_threshold_conf: Vec::new(), outputs_to_watch, onchain_tx_handler, @@ -1311,11 +1311,9 @@ impl ChannelMonitor { /// outputs to watch. See [`block_connected`] for details. /// /// Used instead of [`block_connected`] by clients that are notified of transactions rather than - /// blocks. May be called before or after [`update_best_block`] for transactions in the - /// corresponding block. See [`update_best_block`] for further calling expectations. + /// blocks. See [`chain::Confirm`] for calling expectations. /// /// [`block_connected`]: Self::block_connected - /// [`update_best_block`]: Self::update_best_block pub fn transactions_confirmed( &self, header: &BlockHeader, @@ -1337,11 +1335,9 @@ impl ChannelMonitor { /// Processes a transaction that was reorganized out of the chain. /// /// Used instead of [`block_disconnected`] by clients that are notified of transactions rather - /// than blocks. May be called before or after [`update_best_block`] for transactions in the - /// corresponding block. See [`update_best_block`] for further calling expectations. + /// than blocks. See [`chain::Confirm`] for calling expectations. /// /// [`block_disconnected`]: Self::block_disconnected - /// [`update_best_block`]: Self::update_best_block pub fn transaction_unconfirmed( &self, txid: &Txid, @@ -1361,18 +1357,10 @@ impl ChannelMonitor { /// [`block_connected`] for details. /// /// Used instead of [`block_connected`] by clients that are notified of transactions rather than - /// blocks. May be called before or after [`transactions_confirmed`] for the corresponding - /// block. - /// - /// Must be called after new blocks become available for the most recent block. Intermediary - /// blocks, however, may be safely skipped. In the event of a chain re-organization, this only - /// needs to be called for the most recent block assuming `transaction_unconfirmed` is called - /// for any affected transactions. + /// blocks. See [`chain::Confirm`] for calling expectations. /// /// [`block_connected`]: Self::block_connected - /// [`transactions_confirmed`]: Self::transactions_confirmed - /// [`transaction_unconfirmed`]: Self::transaction_unconfirmed - pub fn update_best_block( + pub fn best_block_updated( &self, header: &BlockHeader, height: u32, @@ -1385,14 +1373,14 @@ impl ChannelMonitor { F::Target: FeeEstimator, L::Target: Logger, { - self.inner.lock().unwrap().update_best_block( + self.inner.lock().unwrap().best_block_updated( header, height, broadcaster, fee_estimator, logger) } /// Returns the set of txids that should be monitored for re-organization out of the chain. pub fn get_relevant_txids(&self) -> Vec { let inner = self.inner.lock().unwrap(); - let mut txids: Vec = inner.onchain_events_waiting_threshold_conf + let mut txids: Vec = inner.onchain_events_awaiting_threshold_conf .iter() .map(|entry| entry.txid) .chain(inner.onchain_tx_handler.get_relevant_txids().into_iter()) @@ -1759,7 +1747,7 @@ impl ChannelMonitorImpl { if let Some(ref outpoints) = self.counterparty_claimable_outpoints.get($txid) { for &(ref htlc, ref source_option) in outpoints.iter() { if let &Some(ref source) = source_option { - self.onchain_events_waiting_threshold_conf.retain(|ref entry| { + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| { if entry.height != height { return true; } match entry.event { OnchainEvent::HTLCUpdate { ref htlc_update } => { @@ -1776,7 +1764,7 @@ impl ChannelMonitorImpl { }, }; log_info!(logger, "Failing HTLC with payment_hash {} from {} counterparty commitment tx due to broadcast of revoked counterparty commitment transaction, waiting for confirmation (at height {})", log_bytes!(htlc.payment_hash.0), $commitment_tx, entry.confirmation_threshold()); - self.onchain_events_waiting_threshold_conf.push(entry); + self.onchain_events_awaiting_threshold_conf.push(entry); } } } @@ -1825,7 +1813,7 @@ impl ChannelMonitorImpl { } } log_trace!(logger, "Failing HTLC with payment_hash {} from {} counterparty commitment tx due to broadcast of counterparty commitment transaction", log_bytes!(htlc.payment_hash.0), $commitment_tx); - self.onchain_events_waiting_threshold_conf.retain(|ref entry| { + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| { if entry.height != height { return true; } match entry.event { OnchainEvent::HTLCUpdate { ref htlc_update } => { @@ -1834,7 +1822,7 @@ impl ChannelMonitorImpl { _ => true, } }); - self.onchain_events_waiting_threshold_conf.push(OnchainEventEntry { + self.onchain_events_awaiting_threshold_conf.push(OnchainEventEntry { txid: *$txid, height, event: OnchainEvent::HTLCUpdate { @@ -1981,7 +1969,7 @@ impl ChannelMonitorImpl { macro_rules! wait_threshold_conf { ($source: expr, $commitment_tx: expr, $payment_hash: expr) => { - self.onchain_events_waiting_threshold_conf.retain(|ref entry| { + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| { if entry.height != height { return true; } match entry.event { OnchainEvent::HTLCUpdate { ref htlc_update } => { @@ -1996,7 +1984,7 @@ impl ChannelMonitorImpl { event: OnchainEvent::HTLCUpdate { htlc_update: ($source, $payment_hash) }, }; log_trace!(logger, "Failing HTLC with payment_hash {} from {} holder commitment tx due to broadcast of transaction, waiting confirmation (at height{})", log_bytes!($payment_hash.0), $commitment_tx, entry.confirmation_threshold()); - self.onchain_events_waiting_threshold_conf.push(entry); + self.onchain_events_awaiting_threshold_conf.push(entry); } } @@ -2109,7 +2097,7 @@ impl ChannelMonitorImpl { self.transactions_confirmed(header, txdata, height, broadcaster, fee_estimator, logger) } - fn update_best_block( + fn best_block_updated( &mut self, header: &BlockHeader, height: u32, @@ -2130,7 +2118,7 @@ impl ChannelMonitorImpl { self.block_confirmed(height, vec![], vec![], vec![], broadcaster, fee_estimator, logger) } else { self.best_block = BestBlock::new(block_hash, height); - self.onchain_events_waiting_threshold_conf.retain(|ref entry| entry.height <= height); + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| entry.height <= height); self.onchain_tx_handler.block_disconnected(height + 1, broadcaster, fee_estimator, logger); Vec::new() } @@ -2238,20 +2226,20 @@ impl ChannelMonitorImpl { } // Find which on-chain events have reached their confirmation threshold. - let onchain_events_waiting_threshold_conf = - self.onchain_events_waiting_threshold_conf.drain(..).collect::>(); + let onchain_events_awaiting_threshold_conf = + self.onchain_events_awaiting_threshold_conf.drain(..).collect::>(); let mut onchain_events_reaching_threshold_conf = Vec::new(); - for entry in onchain_events_waiting_threshold_conf { + for entry in onchain_events_awaiting_threshold_conf { if entry.has_reached_confirmation_threshold(height) { onchain_events_reaching_threshold_conf.push(entry); } else { - self.onchain_events_waiting_threshold_conf.push(entry); + self.onchain_events_awaiting_threshold_conf.push(entry); } } // Used to check for duplicate HTLC resolutions. #[cfg(debug_assertions)] - let unmatured_htlcs: Vec<_> = self.onchain_events_waiting_threshold_conf + let unmatured_htlcs: Vec<_> = self.onchain_events_awaiting_threshold_conf .iter() .filter_map(|entry| match &entry.event { OnchainEvent::HTLCUpdate { htlc_update } => Some(htlc_update.0.clone()), @@ -2332,7 +2320,7 @@ impl ChannelMonitorImpl { //We may discard: //- htlc update there as failure-trigger tx (revoked commitment tx, non-revoked commitment tx, HTLC-timeout tx) has been disconnected //- maturing spendable output has transaction paying us has been disconnected - self.onchain_events_waiting_threshold_conf.retain(|ref entry| entry.height < height); + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| entry.height < height); self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger); @@ -2350,7 +2338,7 @@ impl ChannelMonitorImpl { F::Target: FeeEstimator, L::Target: Logger, { - self.onchain_events_waiting_threshold_conf.retain(|ref entry| entry.txid != *txid); + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| entry.txid != *txid); self.onchain_tx_handler.transaction_unconfirmed(txid, broadcaster, fee_estimator, logger); } @@ -2579,7 +2567,7 @@ impl ChannelMonitorImpl { })); } } else { - self.onchain_events_waiting_threshold_conf.retain(|ref entry| { + self.onchain_events_awaiting_threshold_conf.retain(|ref entry| { if entry.height != height { return true; } match entry.event { OnchainEvent::HTLCUpdate { ref htlc_update } => { @@ -2594,7 +2582,7 @@ impl ChannelMonitorImpl { event: OnchainEvent::HTLCUpdate { htlc_update: (source, payment_hash) }, }; log_info!(logger, "Failing HTLC with payment_hash {} timeout by a spend tx, waiting for confirmation (at height{})", log_bytes!(payment_hash.0), entry.confirmation_threshold()); - self.onchain_events_waiting_threshold_conf.push(entry); + self.onchain_events_awaiting_threshold_conf.push(entry); } } } @@ -2659,7 +2647,7 @@ impl ChannelMonitorImpl { event: OnchainEvent::MaturingOutput { descriptor: spendable_output.clone() }, }; log_trace!(logger, "Maturing {} until {}", log_spendable!(spendable_output), entry.confirmation_threshold()); - self.onchain_events_waiting_threshold_conf.push(entry); + self.onchain_events_awaiting_threshold_conf.push(entry); } } } @@ -2727,6 +2715,29 @@ where } } +impl chain::Confirm for (ChannelMonitor, T, F, L) +where + T::Target: BroadcasterInterface, + F::Target: FeeEstimator, + L::Target: Logger, +{ + fn transactions_confirmed(&self, header: &BlockHeader, txdata: &TransactionData, height: u32) { + self.0.transactions_confirmed(header, txdata, height, &*self.1, &*self.2, &*self.3); + } + + fn transaction_unconfirmed(&self, txid: &Txid) { + self.0.transaction_unconfirmed(txid, &*self.1, &*self.2, &*self.3); + } + + fn best_block_updated(&self, header: &BlockHeader, height: u32) { + self.0.best_block_updated(header, height, &*self.1, &*self.2, &*self.3); + } + + fn get_relevant_txids(&self) -> Vec { + self.0.get_relevant_txids() + } +} + const MAX_ALLOC_SIZE: usize = 64*1024; impl<'a, Signer: Sign, K: KeysInterface> ReadableArgs<&'a K> @@ -2925,7 +2936,7 @@ impl<'a, Signer: Sign, K: KeysInterface> ReadableArgs<&'a K> let best_block = BestBlock::new(Readable::read(reader)?, Readable::read(reader)?); let waiting_threshold_conf_len: u64 = Readable::read(reader)?; - let mut onchain_events_waiting_threshold_conf = Vec::with_capacity(cmp::min(waiting_threshold_conf_len as usize, MAX_ALLOC_SIZE / 128)); + let mut onchain_events_awaiting_threshold_conf = Vec::with_capacity(cmp::min(waiting_threshold_conf_len as usize, MAX_ALLOC_SIZE / 128)); for _ in 0..waiting_threshold_conf_len { let txid = Readable::read(reader)?; let height = Readable::read(reader)?; @@ -2945,7 +2956,7 @@ impl<'a, Signer: Sign, K: KeysInterface> ReadableArgs<&'a K> }, _ => return Err(DecodeError::InvalidValue), }; - onchain_events_waiting_threshold_conf.push(OnchainEventEntry { txid, height, event }); + onchain_events_awaiting_threshold_conf.push(OnchainEventEntry { txid, height, event }); } let outputs_to_watch_len: u64 = Readable::read(reader)?; @@ -3006,7 +3017,7 @@ impl<'a, Signer: Sign, K: KeysInterface> ReadableArgs<&'a K> pending_monitor_events, pending_events, - onchain_events_waiting_threshold_conf, + onchain_events_awaiting_threshold_conf, outputs_to_watch, onchain_tx_handler,