mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
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:
parent
7df042b334
commit
492983f54f
1 changed files with 11 additions and 4 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue