Skip to content

Commit 2c003b9

Browse files
Update monitor with preimage after channel close
If the channel is hitting the chain right as we receive a preimage, previous to this commit the relevant ChannelMonitor would never learn of this preimage.
1 parent 37c4cff commit 2c003b9

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use bitcoin::secp256k1;
3737
use chain;
3838
use chain::Watch;
3939
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
40-
use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateErr, HTLC_FAIL_BACK_BUFFER, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY, MonitorEvent};
40+
use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateStep, ChannelMonitorUpdateErr, HTLC_FAIL_BACK_BUFFER, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY, MonitorEvent};
4141
use chain::transaction::{OutPoint, TransactionData};
4242
use ln::channel::{Channel, ChannelError};
4343
use ln::features::{InitFeatures, NodeFeatures};
@@ -2159,13 +2159,31 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
21592159
});
21602160
},
21612161
HTLCSource::PreviousHopData(hop_data) => {
2162+
let prev_hop_data_node_id = hop_data.counterparty_node_id;
2163+
let prev_outpoint = hop_data.outpoint;
21622164
if let Err((counterparty_node_id, err)) = match self.claim_funds_from_hop(&mut channel_state_lock, hop_data, payment_preimage) {
21632165
Ok(()) => Ok(()),
21642166
Err(None) => {
2165-
// TODO: There is probably a channel monitor somewhere that needs to
2166-
// learn the preimage as the channel already hit the chain and that's
2167-
// why it's missing.
2168-
Ok(())
2167+
let preimage_update = ChannelMonitorUpdate {
2168+
update_id: std::u64::MAX,
2169+
updates: vec![ChannelMonitorUpdateStep::PaymentPreimage {
2170+
payment_preimage: payment_preimage.clone(),
2171+
}],
2172+
};
2173+
// We update the ChannelMonitor on the backward link, after
2174+
// receiving an offchain preimage event from the forward link (the
2175+
// event being update_fulfill_htlc).
2176+
match self.chain_monitor.update_channel(prev_outpoint, preimage_update) {
2177+
Err(ChannelMonitorUpdateErr::PermanentFailure) => {
2178+
let err_msg = MsgHandleErrInternal::send_err_msg_no_close("Failed to update channel with preimage provided from forward link".to_owned(), prev_outpoint.to_channel_id());
2179+
Err((prev_hop_data_node_id, err_msg))
2180+
}
2181+
Err(ChannelMonitorUpdateErr::TemporaryFailure) => {
2182+
let err_msg = MsgHandleErrInternal::from_chan_no_close(ChannelError::Ignore("Failed to update channel with preimage provided from forward link".to_owned()), prev_outpoint.to_channel_id());
2183+
Err((prev_hop_data_node_id, err_msg))
2184+
}
2185+
Ok(()) => Ok(())
2186+
}
21692187
},
21702188
Err(Some(res)) => Err(res),
21712189
} {

0 commit comments

Comments
 (0)