Skip to content

Commit 84ea158

Browse files
fixup! Add commitment transaction broadcast as a ChannelMonitor event
1 parent 8b5502b commit 84ea158

File tree

3 files changed

+13
-22
lines changed

3 files changed

+13
-22
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2970,11 +2970,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
29702970
/// Process pending events from the ManyChannelMonitor.
29712971
fn process_pending_monitor_events(&self) {
29722972
let mut failed_channels = Vec::new();
2973-
// TODO: Event release to users and serialization is currently race-y: it's very easy for a
2974-
// user to serialize a ChannelManager with pending events in it and lose those events on
2975-
// restart. This is doubly true for the fail/fulfill-backs from monitor events!
29762973
{
2977-
//TODO: This behavior should be documented.
29782974
for monitor_event in self.monitor.get_and_clear_pending_monitor_events() {
29792975
match monitor_event {
29802976
MonitorEvent::HTLCEvent(htlc_update) => {
@@ -3022,6 +3018,8 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
30223018
L::Target: Logger,
30233019
{
30243020
fn get_and_clear_pending_msg_events(&self) -> Vec<events::MessageSendEvent> {
3021+
//TODO: This behavior should be documented. It's non-intuitive that we query
3022+
// ChannelMonitors when clearing other events.
30253023
self.process_pending_monitor_events();
30263024

30273025
let mut ret = Vec::new();
@@ -3039,6 +3037,8 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
30393037
L::Target: Logger,
30403038
{
30413039
fn get_and_clear_pending_events(&self) -> Vec<events::Event> {
3040+
//TODO: This behavior should be documented. It's non-intuitive that we query
3041+
// ChannelMonitors when clearing other events.
30423042
self.process_pending_monitor_events();
30433043

30443044
let mut ret = Vec::new();

lightning/src/ln/channelmonitor.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1934,7 +1934,9 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
19341934
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.funding_info.0.txid.clone(), vout: self.funding_info.0.index as u32 }, witness_data: InputMaterial::Funding { funding_redeemscript: self.funding_redeemscript.clone() }});
19351935
}
19361936
if should_broadcast {
1937+
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
19371938
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
1939+
self.local_tx_signed = true;
19381940
let (mut new_outpoints, new_outputs, _) = self.broadcast_by_local_state(&commitment_tx, &self.current_local_commitment_tx);
19391941
if !new_outputs.is_empty() {
19401942
watch_outputs.push((self.current_local_commitment_tx.txid.clone(), new_outputs));
@@ -1963,10 +1965,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
19631965
}
19641966
}
19651967

1966-
let broadcasted_commit_tx = self.onchain_tx_handler.block_connected(txn_matched, claimable_outpoints, height, &*broadcaster, &*fee_estimator, &*logger);
1967-
if broadcasted_commit_tx {
1968-
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
1969-
}
1968+
self.onchain_tx_handler.block_connected(txn_matched, claimable_outpoints, height, &*broadcaster, &*fee_estimator, &*logger);
19701969

19711970
self.last_block_hash = block_hash.clone();
19721971
for &(ref txid, ref output_scripts) in watch_outputs.iter() {
@@ -1988,10 +1987,7 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
19881987
//- maturing spendable output has transaction paying us has been disconnected
19891988
}
19901989

1991-
let broadcasted_commit_tx = self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger);
1992-
if broadcasted_commit_tx {
1993-
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
1994-
}
1990+
self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger);
19951991

19961992
self.last_block_hash = block_hash.clone();
19971993
}
@@ -2165,7 +2161,9 @@ impl<ChanSigner: ChannelKeys> ChannelMonitor<ChanSigner> {
21652161
}
21662162
} else if offered_preimage_claim {
21672163
if !self.pending_monitor_events.iter().any(
2168-
|update| if let &MonitorEvent::HTLCEvent(ref upd) = update { upd.source == source } else { false }) {
2164+
|update| if let &MonitorEvent::HTLCEvent(ref upd) = update {
2165+
upd.source == source
2166+
} else { false }) {
21692167
payment_preimage.0.copy_from_slice(&input.witness[1]);
21702168
self.pending_monitor_events.push(MonitorEvent::HTLCEvent(HTLCUpdate {
21712169
source,

lightning/src/ln/onchaintx.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
657657
None
658658
}
659659

660-
pub(super) fn block_connected<B: Deref, F: Deref, L: Deref>(&mut self, txn_matched: &[&Transaction], claimable_outpoints: Vec<ClaimRequest>, height: u32, broadcaster: B, fee_estimator: F, logger: L) -> bool
660+
pub(super) fn block_connected<B: Deref, F: Deref, L: Deref>(&mut self, txn_matched: &[&Transaction], claimable_outpoints: Vec<ClaimRequest>, height: u32, broadcaster: B, fee_estimator: F, logger: L)
661661
where B::Target: BroadcasterInterface,
662662
F::Target: FeeEstimator,
663663
L::Target: Logger,
@@ -666,7 +666,6 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
666666
let mut new_claims = Vec::new();
667667
let mut aggregated_claim = HashMap::new();
668668
let mut aggregated_soonest = ::std::u32::MAX;
669-
let mut broadcasted = false;
670669

671670
// Try to aggregate outputs if their timelock expiration isn't imminent (absolute_timelock
672671
// <= CLTV_SHARED_CLAIM_BUFFER) and they don't require an immediate nLockTime (aggregable).
@@ -703,7 +702,6 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
703702
self.pending_claim_requests.insert(txid, claim_material);
704703
log_trace!(logger, "Broadcast onchain {}", log_tx!(tx));
705704
broadcaster.broadcast_transaction(&tx);
706-
broadcasted = true;
707705
}
708706
}
709707

@@ -823,17 +821,15 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
823821
if let Some((new_timer, new_feerate, bump_tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator, &*logger) {
824822
log_trace!(logger, "Broadcast onchain {}", log_tx!(bump_tx));
825823
broadcaster.broadcast_transaction(&bump_tx);
826-
broadcasted = true;
827824
if let Some(claim_material) = self.pending_claim_requests.get_mut(first_claim_txid) {
828825
claim_material.height_timer = new_timer;
829826
claim_material.feerate_previous = new_feerate;
830827
}
831828
}
832829
}
833-
broadcasted
834830
}
835831

836-
pub(super) fn block_disconnected<B: Deref, F: Deref, L: Deref>(&mut self, height: u32, broadcaster: B, fee_estimator: F, logger: L) -> bool
832+
pub(super) fn block_disconnected<B: Deref, F: Deref, L: Deref>(&mut self, height: u32, broadcaster: B, fee_estimator: F, logger: L)
837833
where B::Target: BroadcasterInterface,
838834
F::Target: FeeEstimator,
839835
L::Target: Logger,
@@ -858,13 +854,11 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
858854
}
859855
}
860856
}
861-
let mut broadcasted = false;
862857
for (_, claim_material) in bump_candidates.iter_mut() {
863858
if let Some((new_timer, new_feerate, bump_tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator, &*logger) {
864859
claim_material.height_timer = new_timer;
865860
claim_material.feerate_previous = new_feerate;
866861
broadcaster.broadcast_transaction(&bump_tx);
867-
broadcasted = true;
868862
}
869863
}
870864
for (ancestor_claim_txid, claim_material) in bump_candidates.drain() {
@@ -881,7 +875,6 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
881875
for req in remove_request {
882876
self.pending_claim_requests.remove(&req);
883877
}
884-
broadcasted
885878
}
886879

887880
pub(super) fn provide_latest_local_tx(&mut self, tx: LocalCommitmentTransaction) -> Result<(), ()> {

0 commit comments

Comments
 (0)