Fail to deserialize ChannelManager if it is ahead of any monitor(s)

If any monitors are out of sync with the Channel, we previously
closed the channel, but we should really only do that if the
monitor is ahead of the channel, opting to call the whole thing
invalid if the channel is ahead of the monitor.
This commit is contained in:
Matt Corallo 2020-03-19 19:15:06 -04:00
parent 7df042b334
commit 492983f54f

View file

@ -3470,10 +3470,17 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
let funding_txo = channel.get_funding_txo().ok_or(DecodeError::InvalidValue)?;
funding_txo_set.insert(funding_txo.clone());
if let Some(ref mut monitor) = args.channel_monitors.get_mut(&funding_txo) {
if channel.get_cur_local_commitment_transaction_number() != monitor.get_cur_local_commitment_number() ||
channel.get_revoked_remote_commitment_transaction_number() != monitor.get_min_seen_secret() ||
channel.get_cur_remote_commitment_transaction_number() != monitor.get_cur_remote_commitment_number() ||
channel.get_latest_monitor_update_id() != monitor.get_latest_update_id() {
if channel.get_cur_local_commitment_transaction_number() < monitor.get_cur_local_commitment_number() ||
channel.get_revoked_remote_commitment_transaction_number() < monitor.get_min_seen_secret() ||
channel.get_cur_remote_commitment_transaction_number() < monitor.get_cur_remote_commitment_number() ||
channel.get_latest_monitor_update_id() > monitor.get_latest_update_id() {
// If the channel is ahead of the monitor, return InvalidValue:
return Err(DecodeError::InvalidValue);
} else if channel.get_cur_local_commitment_transaction_number() > monitor.get_cur_local_commitment_number() ||
channel.get_revoked_remote_commitment_transaction_number() > monitor.get_min_seen_secret() ||
channel.get_cur_remote_commitment_transaction_number() > monitor.get_cur_remote_commitment_number() ||
channel.get_latest_monitor_update_id() < monitor.get_latest_update_id() {
// But if the channel is behind of the monitor, close the channel:
let (_, _, mut new_failed_htlcs) = channel.force_shutdown(true);
failed_htlcs.append(&mut new_failed_htlcs);
monitor.broadcast_latest_local_commitment_txn(&args.tx_broadcaster);