Skip to content

Commit 63276f6

Browse files
committed
Provide destination_script from ChannelMonitor to OnchainTxHandler
The `ChannelMonitor` and `OnchainTxHandler` have historically been tied together, often tracking some of the same state twice. As we introduce support for splices in the `ChannelMonitor`, we'd like to avoid leaking some of those details to the `OnchainTxHandler`. Ultimately, the `OnchainTxHandler` should stand on its own and support claiming funds from multiple `ChannelMonitor`s, allowing us to save on fees by batching aggregatable claims across multiple in-flight closing channels. This commit removes the internal usage of `OnchainTxHandler::destination_script` and deprecates it, opting to instead provide it as a function argument wherever needed.
1 parent ae487a9 commit 63276f6

File tree

2 files changed

+64
-28
lines changed

2 files changed

+64
-28
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2131,12 +2131,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
21312131
L::Target: Logger,
21322132
{
21332133
let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator);
2134-
let mut inner = self.inner.lock().unwrap();
2134+
let mut lock = self.inner.lock().unwrap();
2135+
let inner = &mut *lock;
21352136
let logger = WithChannelMonitor::from_impl(logger, &*inner, None);
21362137
let current_height = inner.best_block.height;
21372138
let conf_target = inner.closure_conf_target();
21382139
inner.onchain_tx_handler.rebroadcast_pending_claims(
2139-
current_height, FeerateStrategy::HighestOfPreviousOrNew, &broadcaster, conf_target, &fee_estimator, &logger,
2140+
current_height, FeerateStrategy::HighestOfPreviousOrNew, &broadcaster, conf_target,
2141+
&inner.destination_script, &fee_estimator, &logger,
21402142
);
21412143
}
21422144

@@ -2157,12 +2159,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
21572159
L::Target: Logger,
21582160
{
21592161
let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator);
2160-
let mut inner = self.inner.lock().unwrap();
2162+
let mut lock = self.inner.lock().unwrap();
2163+
let inner = &mut *lock;
21612164
let logger = WithChannelMonitor::from_impl(logger, &*inner, None);
21622165
let current_height = inner.best_block.height;
21632166
let conf_target = inner.closure_conf_target();
21642167
inner.onchain_tx_handler.rebroadcast_pending_claims(
2165-
current_height, FeerateStrategy::RetryPrevious, &broadcaster, conf_target, &fee_estimator, &logger,
2168+
current_height, FeerateStrategy::RetryPrevious, &broadcaster, conf_target,
2169+
&inner.destination_script, &fee_estimator, &logger,
21662170
);
21672171
}
21682172

@@ -3212,7 +3216,10 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
32123216
($commitment_number: expr, $txid: expr, $htlcs: expr) => {
32133217
let (htlc_claim_reqs, _) = self.get_counterparty_output_claim_info($commitment_number, $txid, None, $htlcs);
32143218
let conf_target = self.closure_conf_target();
3215-
self.onchain_tx_handler.update_claims_view_from_requests(htlc_claim_reqs, self.best_block.height, self.best_block.height, broadcaster, conf_target, fee_estimator, logger);
3219+
self.onchain_tx_handler.update_claims_view_from_requests(
3220+
htlc_claim_reqs, self.best_block.height, self.best_block.height, broadcaster,
3221+
conf_target, &self.destination_script, fee_estimator, logger,
3222+
);
32163223
}
32173224
}
32183225
if let Some(txid) = self.funding.current_counterparty_commitment_txid {
@@ -3261,7 +3268,10 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
32613268
// transactions.
32623269
let (claim_reqs, _) = self.get_broadcasted_holder_claims(&holder_commitment.tx, self.best_block.height);
32633270
let conf_target = self.closure_conf_target();
3264-
self.onchain_tx_handler.update_claims_view_from_requests(claim_reqs, self.best_block.height, self.best_block.height, broadcaster, conf_target, fee_estimator, logger);
3271+
self.onchain_tx_handler.update_claims_view_from_requests(
3272+
claim_reqs, self.best_block.height, self.best_block.height, broadcaster,
3273+
conf_target, &self.destination_script, fee_estimator, logger,
3274+
);
32653275
}
32663276
}
32673277
}
@@ -3324,7 +3334,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
33243334
let conf_target = self.closure_conf_target();
33253335
self.onchain_tx_handler.update_claims_view_from_requests(
33263336
claimable_outpoints, self.best_block.height, self.best_block.height, broadcaster,
3327-
conf_target, fee_estimator, logger,
3337+
conf_target, &self.destination_script, fee_estimator, logger,
33283338
);
33293339
}
33303340

@@ -4216,7 +4226,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
42164226
log_trace!(logger, "Best block re-orged, replaced with new block {} at height {}", block_hash, height);
42174227
self.onchain_events_awaiting_threshold_conf.retain(|ref entry| entry.height <= height);
42184228
let conf_target = self.closure_conf_target();
4219-
self.onchain_tx_handler.block_disconnected(height + 1, broadcaster, conf_target, fee_estimator, logger);
4229+
self.onchain_tx_handler.block_disconnected(
4230+
height + 1, broadcaster, conf_target, &self.destination_script, fee_estimator, logger,
4231+
);
42204232
Vec::new()
42214233
} else { Vec::new() }
42224234
}
@@ -4540,8 +4552,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
45404552
}
45414553

45424554
let conf_target = self.closure_conf_target();
4543-
self.onchain_tx_handler.update_claims_view_from_requests(claimable_outpoints, conf_height, self.best_block.height, broadcaster, conf_target, fee_estimator, logger);
4544-
self.onchain_tx_handler.update_claims_view_from_matched_txn(&txn_matched, conf_height, conf_hash, self.best_block.height, broadcaster, conf_target, fee_estimator, logger);
4555+
self.onchain_tx_handler.update_claims_view_from_requests(
4556+
claimable_outpoints, conf_height, self.best_block.height, broadcaster, conf_target,
4557+
&self.destination_script, fee_estimator, logger,
4558+
);
4559+
self.onchain_tx_handler.update_claims_view_from_matched_txn(
4560+
&txn_matched, conf_height, conf_hash, self.best_block.height, broadcaster, conf_target,
4561+
&self.destination_script, fee_estimator, logger,
4562+
);
45454563

45464564
// Determine new outputs to watch by comparing against previously known outputs to watch,
45474565
// updating the latter in the process.
@@ -4581,7 +4599,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
45814599

45824600
let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator);
45834601
let conf_target = self.closure_conf_target();
4584-
self.onchain_tx_handler.block_disconnected(height, broadcaster, conf_target, &bounded_fee_estimator, logger);
4602+
self.onchain_tx_handler.block_disconnected(
4603+
height, broadcaster, conf_target, &self.destination_script, &bounded_fee_estimator, logger
4604+
);
45854605

45864606
self.best_block = BestBlock::new(header.prev_blockhash, height - 1);
45874607
}
@@ -4616,7 +4636,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
46164636
debug_assert!(!self.onchain_events_awaiting_threshold_conf.iter().any(|ref entry| entry.txid == *txid));
46174637

46184638
let conf_target = self.closure_conf_target();
4619-
self.onchain_tx_handler.transaction_unconfirmed(txid, broadcaster, conf_target, fee_estimator, logger);
4639+
self.onchain_tx_handler.transaction_unconfirmed(
4640+
txid, broadcaster, conf_target, &self.destination_script, fee_estimator, logger
4641+
);
46204642
}
46214643

46224644
/// Filters a block's `txdata` for transactions spending watched outputs or for any child

lightning/src/chain/onchaintx.rs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ pub(crate) enum FeerateStrategy {
232232
pub struct OnchainTxHandler<ChannelSigner: EcdsaChannelSigner> {
233233
channel_value_satoshis: u64,
234234
channel_keys_id: [u8; 32],
235-
destination_script: ScriptBuf,
235+
destination_script: ScriptBuf, // Deprecated as of 0.2.
236236
holder_commitment: HolderCommitmentTransaction,
237237
prev_holder_commitment: Option<HolderCommitmentTransaction>,
238238

@@ -487,7 +487,8 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
487487
/// connections, like on mobile.
488488
pub(super) fn rebroadcast_pending_claims<B: Deref, F: Deref, L: Logger>(
489489
&mut self, current_height: u32, feerate_strategy: FeerateStrategy, broadcaster: &B,
490-
conf_target: ConfirmationTarget, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
490+
conf_target: ConfirmationTarget, destination_script: &Script,
491+
fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
491492
)
492493
where
493494
B::Target: BroadcasterInterface,
@@ -500,7 +501,10 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
500501
bump_requests.push((*claim_id, request.clone()));
501502
}
502503
for (claim_id, request) in bump_requests {
503-
self.generate_claim(current_height, &request, &feerate_strategy, conf_target, fee_estimator, logger)
504+
self.generate_claim(
505+
current_height, &request, &feerate_strategy, conf_target, destination_script,
506+
fee_estimator, logger,
507+
)
504508
.map(|(_, new_feerate, claim)| {
505509
let mut feerate_was_bumped = false;
506510
if let Some(mut_request) = self.pending_claim_requests.get_mut(&claim_id) {
@@ -551,8 +555,9 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
551555
/// Panics if there are signing errors, because signing operations in reaction to on-chain
552556
/// events are not expected to fail, and if they do, we may lose funds.
553557
fn generate_claim<F: Deref, L: Logger>(
554-
&mut self, cur_height: u32, cached_request: &PackageTemplate, feerate_strategy: &FeerateStrategy,
555-
conf_target: ConfirmationTarget, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
558+
&mut self, cur_height: u32, cached_request: &PackageTemplate,
559+
feerate_strategy: &FeerateStrategy, conf_target: ConfirmationTarget,
560+
destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
556561
) -> Option<(u32, u64, OnchainClaim)>
557562
where F::Target: FeeEstimator,
558563
{
@@ -617,15 +622,15 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
617622
}
618623
}
619624

620-
let predicted_weight = cached_request.package_weight(&self.destination_script);
625+
let predicted_weight = cached_request.package_weight(destination_script);
621626
if let Some((output_value, new_feerate)) = cached_request.compute_package_output(
622-
predicted_weight, self.destination_script.minimal_non_dust().to_sat(),
627+
predicted_weight, destination_script.minimal_non_dust().to_sat(),
623628
feerate_strategy, conf_target, fee_estimator, logger,
624629
) {
625630
assert!(new_feerate != 0);
626631

627632
let transaction = cached_request.maybe_finalize_malleable_package(
628-
cur_height, self, Amount::from_sat(output_value), self.destination_script.clone(), logger
633+
cur_height, self, Amount::from_sat(output_value), destination_script.into(), logger
629634
).unwrap();
630635
assert!(predicted_weight >= transaction.0.weight().to_wu());
631636
return Some((new_timer, new_feerate, OnchainClaim::Tx(transaction)));
@@ -727,7 +732,7 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
727732
/// `cur_height`, however it must never be higher than `cur_height`.
728733
pub(super) fn update_claims_view_from_requests<B: Deref, F: Deref, L: Logger>(
729734
&mut self, mut requests: Vec<PackageTemplate>, conf_height: u32, cur_height: u32,
730-
broadcaster: &B, conf_target: ConfirmationTarget,
735+
broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script,
731736
fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
732737
) where
733738
B::Target: BroadcasterInterface,
@@ -815,7 +820,8 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
815820
// height timer expiration (i.e in how many blocks we're going to take action).
816821
for mut req in preprocessed_requests {
817822
if let Some((new_timer, new_feerate, claim)) = self.generate_claim(
818-
cur_height, &req, &FeerateStrategy::ForceBump, conf_target, &*fee_estimator, &*logger,
823+
cur_height, &req, &FeerateStrategy::ForceBump, conf_target, destination_script,
824+
&*fee_estimator, &*logger,
819825
) {
820826
req.set_timer(new_timer);
821827
req.set_feerate(new_feerate);
@@ -881,7 +887,7 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
881887
pub(super) fn update_claims_view_from_matched_txn<B: Deref, F: Deref, L: Logger>(
882888
&mut self, txn_matched: &[&Transaction], conf_height: u32, conf_hash: BlockHash,
883889
cur_height: u32, broadcaster: &B, conf_target: ConfirmationTarget,
884-
fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
890+
destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
885891
) where
886892
B::Target: BroadcasterInterface,
887893
F::Target: FeeEstimator,
@@ -1032,7 +1038,8 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
10321038

10331039
for (claim_id, request) in bump_candidates.iter() {
10341040
if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(
1035-
cur_height, &request, &FeerateStrategy::ForceBump, conf_target, &*fee_estimator, &*logger,
1041+
cur_height, &request, &FeerateStrategy::ForceBump, conf_target, destination_script,
1042+
&*fee_estimator, &*logger,
10361043
) {
10371044
match bump_claim {
10381045
OnchainClaim::Tx(bump_tx) => {
@@ -1068,6 +1075,7 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
10681075
txid: &Txid,
10691076
broadcaster: B,
10701077
conf_target: ConfirmationTarget,
1078+
destination_script: &Script,
10711079
fee_estimator: &LowerBoundedFeeEstimator<F>,
10721080
logger: &L,
10731081
) where
@@ -1083,13 +1091,15 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
10831091
}
10841092

10851093
if let Some(height) = height {
1086-
self.block_disconnected(height, broadcaster, conf_target, fee_estimator, logger);
1094+
self.block_disconnected(
1095+
height, broadcaster, conf_target, destination_script, fee_estimator, logger,
1096+
);
10871097
}
10881098
}
10891099

10901100
pub(super) fn block_disconnected<B: Deref, F: Deref, L: Logger>(
10911101
&mut self, height: u32, broadcaster: B, conf_target: ConfirmationTarget,
1092-
fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
1102+
destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
10931103
)
10941104
where B::Target: BroadcasterInterface,
10951105
F::Target: FeeEstimator,
@@ -1122,7 +1132,8 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
11221132
// `height` is the height being disconnected, so our `current_height` is 1 lower.
11231133
let current_height = height - 1;
11241134
if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(
1125-
current_height, &request, &FeerateStrategy::ForceBump, conf_target, fee_estimator, logger
1135+
current_height, &request, &FeerateStrategy::ForceBump, conf_target,
1136+
destination_script, fee_estimator, logger
11261137
) {
11271138
request.set_timer(new_timer);
11281139
request.set_feerate(new_feerate);
@@ -1375,10 +1386,11 @@ mod tests {
13751386
));
13761387
}
13771388
let holder_commit = HolderCommitmentTransaction::dummy(1000000, &mut htlcs);
1389+
let destination_script = ScriptBuf::new();
13781390
let mut tx_handler = OnchainTxHandler::new(
13791391
1000000,
13801392
[0; 32],
1381-
ScriptBuf::new(),
1393+
destination_script.clone(),
13821394
signer,
13831395
chan_params,
13841396
holder_commit,
@@ -1418,6 +1430,7 @@ mod tests {
14181430
1,
14191431
&&broadcaster,
14201432
ConfirmationTarget::UrgentOnChainSweep,
1433+
&destination_script,
14211434
&fee_estimator,
14221435
&logger,
14231436
);
@@ -1441,6 +1454,7 @@ mod tests {
14411454
2,
14421455
&&broadcaster,
14431456
ConfirmationTarget::UrgentOnChainSweep,
1457+
&destination_script,
14441458
&fee_estimator,
14451459
&logger,
14461460
);

0 commit comments

Comments
 (0)