Struct lightning::chain::channelmonitor::ChannelMonitor
source · [−]pub struct ChannelMonitor<Signer: Sign> { /* private fields */ }
Expand description
A ChannelMonitor handles chain events (blocks connected and disconnected) and generates on-chain transactions to ensure no loss of funds occurs.
You MUST ensure that no ChannelMonitors for a given channel anywhere contain out-of-date information and are actively monitoring the chain.
Pending Events or updated HTLCs which have not yet been read out by get_and_clear_pending_monitor_events or get_and_clear_pending_events are serialized to disk and reloaded at deserialize-time. Thus, you must ensure that, when handling events, all events gotten are fully handled before re-serializing the new state.
Note that the deserializer is only implemented for (BlockHash, ChannelMonitor), which tells you the last block hash which was block_connect()ed. You MUST rescan any blocks along the “reorg path” (ie disconnecting blocks until you find a common ancestor from both the returned block hash and the the current chain and then reconnecting blocks to get to the best chain) upon deserializing the object!
Implementations
sourceimpl<Signer: Sign> ChannelMonitor<Signer>
impl<Signer: Sign> ChannelMonitor<Signer>
sourcepub fn update_monitor<B: Deref, F: Deref, L: Deref>(
&self,
updates: &ChannelMonitorUpdate,
broadcaster: &B,
fee_estimator: F,
logger: &L
) -> Result<(), ()>where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn update_monitor<B: Deref, F: Deref, L: Deref>(
&self,
updates: &ChannelMonitorUpdate,
broadcaster: &B,
fee_estimator: F,
logger: &L
) -> Result<(), ()>where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
Updates a ChannelMonitor on the basis of some new information provided by the Channel itself.
panics if the given update is not the next update by update_id.
sourcepub fn get_latest_update_id(&self) -> u64
pub fn get_latest_update_id(&self) -> u64
Gets the update_id from the latest ChannelMonitorUpdate which was applied to this ChannelMonitor.
sourcepub fn get_funding_txo(&self) -> (OutPoint, Script)
pub fn get_funding_txo(&self) -> (OutPoint, Script)
Gets the funding transaction outpoint of the channel this ChannelMonitor is monitoring for.
sourcepub fn get_outputs_to_watch(&self) -> Vec<(Txid, Vec<(u32, Script)>)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
pub fn get_outputs_to_watch(&self) -> Vec<(Txid, Vec<(u32, Script)>)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,
Gets a list of txids, with their output scripts (in the order they appear in the transaction), which we must learn about spends of via block_connected().
sourcepub fn load_outputs_to_watch<F: Deref>(&self, filter: &F)where
F::Target: Filter,
pub fn load_outputs_to_watch<F: Deref>(&self, filter: &F)where
F::Target: Filter,
Loads the funding txo and outputs to watch into the given chain::Filter
by repeatedly
calling chain::Filter::register_output
and chain::Filter::register_tx
until all outputs
have been registered.
sourcepub fn get_and_clear_pending_monitor_events(&self) -> Vec<MonitorEvent>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
pub fn get_and_clear_pending_monitor_events(&self) -> Vec<MonitorEvent>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,
Get the list of HTLCs who’s status has been updated on chain. This should be called by
ChannelManager via chain::Watch::release_pending_monitor_events
.
sourcepub fn get_and_clear_pending_events(&self) -> Vec<Event>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
pub fn get_and_clear_pending_events(&self) -> Vec<Event>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,
Gets the list of pending events which were generated by previous actions, clearing the list in the process.
This is called by ChainMonitor::get_and_clear_pending_events() and is equivalent to EventsProvider::get_and_clear_pending_events() except that it requires &mut self as we do no internal locking in ChannelMonitors.
sourcepub fn get_counterparty_node_id(&self) -> Option<PublicKey>
pub fn get_counterparty_node_id(&self) -> Option<PublicKey>
Gets the node_id
of the counterparty for this channel.
Will be None
for channels constructed on LDK versions prior to 0.0.110 and always Some
otherwise.
sourcepub fn get_latest_holder_commitment_txn<L: Deref>(
&self,
logger: &L
) -> Vec<Transaction>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
L::Target: Logger,
pub fn get_latest_holder_commitment_txn<L: Deref>(
&self,
logger: &L
) -> Vec<Transaction>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
L::Target: Logger,
A: Allocator,
Used by ChannelManager deserialization to broadcast the latest holder state if its copy of the Channel was out-of-date.
You may also use this to broadcast the latest local commitment transaction, either because
a monitor update failed with ChannelMonitorUpdateStatus::PermanentFailure
or because we’ve
fallen behind (i.e. we’ve received proof that our counterparty side knows a revocation
secret we gave them that they shouldn’t know).
Broadcasting these transactions in the second case is UNSAFE, as they allow counterparty side to punish you. Nevertheless you may want to broadcast them if counterparty doesn’t close channel with their commitment transaction after a substantial amount of time. Best may be to contact the other node operator out-of-band to coordinate other options available to you. In any-case, the choice is up to you.
sourcepub fn block_connected<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
txdata: &TransactionData<'_>,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn block_connected<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
txdata: &TransactionData<'_>,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
A: Allocator,
Processes transactions in a newly connected block, which may result in any of the following:
- update the monitor’s state against resolved HTLCs
- punish the counterparty in the case of seeing a revoked commitment transaction
- force close the channel and claim/timeout incoming/outgoing HTLCs if near expiration
- detect settled outputs for later spending
- schedule and bump any in-flight claims
Returns any new outputs to watch from txdata
; after called, these are also included in
get_outputs_to_watch
.
sourcepub fn block_disconnected<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
)where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn block_disconnected<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
)where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
Determines if the disconnected block contained any transactions of interest and updates appropriately.
sourcepub fn transactions_confirmed<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
txdata: &TransactionData<'_>,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn transactions_confirmed<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
txdata: &TransactionData<'_>,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
A: Allocator,
Processes transactions confirmed in a block with the given header and height, returning new
outputs to watch. See block_connected
for details.
Used instead of block_connected
by clients that are notified of transactions rather than
blocks. See chain::Confirm
for calling expectations.
sourcepub fn transaction_unconfirmed<B: Deref, F: Deref, L: Deref>(
&self,
txid: &Txid,
broadcaster: B,
fee_estimator: F,
logger: L
)where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn transaction_unconfirmed<B: Deref, F: Deref, L: Deref>(
&self,
txid: &Txid,
broadcaster: B,
fee_estimator: F,
logger: L
)where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
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. See chain::Confirm
for calling expectations.
sourcepub fn best_block_updated<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
pub fn best_block_updated<B: Deref, F: Deref, L: Deref>(
&self,
header: &BlockHeader,
height: u32,
broadcaster: B,
fee_estimator: F,
logger: L
) -> Vec<TransactionOutputs>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
where
B::Target: BroadcasterInterface,
F::Target: FeeEstimator,
L::Target: Logger,
A: Allocator,
Updates the monitor with the current best chain tip, returning new outputs to watch. See
block_connected
for details.
Used instead of block_connected
by clients that are notified of transactions rather than
blocks. See chain::Confirm
for calling expectations.
sourcepub fn get_relevant_txids(&self) -> Vec<Txid>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
pub fn get_relevant_txids(&self) -> Vec<Txid>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,
Returns the set of txids that should be monitored for re-organization out of the chain.
sourcepub fn current_best_block(&self) -> BestBlock
pub fn current_best_block(&self) -> BestBlock
Gets the latest best block which was connected either via the chain::Listen
or
chain::Confirm
interfaces.
sourceimpl<Signer: Sign> ChannelMonitor<Signer>
impl<Signer: Sign> ChannelMonitor<Signer>
sourcepub fn get_claimable_balances(&self) -> Vec<Balance>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
pub fn get_claimable_balances(&self) -> Vec<Balance>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,
Gets the balances in this channel which are either claimable by us if we were to force-close the channel now or which are claimable on-chain (possibly awaiting confirmation).
Any balances in the channel which are available on-chain (excluding on-chain fees) are
included here until an Event::SpendableOutputs
event has been generated for the
balance, or until our counterparty has claimed the balance and accrued several
confirmations on the claim transaction.
Note that for ChannelMonitors
which track a channel which went on-chain with versions of
LDK prior to 0.0.111, balances may not be fully captured if our counterparty broadcasted
a revoked state.
See Balance
for additional details on the types of claimable balances which
may be returned here and their meanings.
Trait Implementations
sourceimpl<Signer: Sign> Writeable for ChannelMonitor<Signer>
impl<Signer: Sign> Writeable for ChannelMonitor<Signer>
sourcefn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error>
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error>
sourcefn encode(&self) -> Vec<u8>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
fn encode(&self) -> Vec<u8>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A>where
A: Allocator,
A: Allocator,