Skip to content

Commit ed0d5d1

Browse files
authored
Merge pull request #554 from TheBlueMatt/2020-03-stale-mon-fail-man-deser
Fail to deserialize ChannelManager if it is ahead of any monitor(s)
2 parents 8bd155e + 4aa95af commit ed0d5d1

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3470,10 +3470,17 @@ impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: De
34703470
let funding_txo = channel.get_funding_txo().ok_or(DecodeError::InvalidValue)?;
34713471
funding_txo_set.insert(funding_txo.clone());
34723472
if let Some(ref mut monitor) = args.channel_monitors.get_mut(&funding_txo) {
3473-
if channel.get_cur_local_commitment_transaction_number() != monitor.get_cur_local_commitment_number() ||
3474-
channel.get_revoked_remote_commitment_transaction_number() != monitor.get_min_seen_secret() ||
3475-
channel.get_cur_remote_commitment_transaction_number() != monitor.get_cur_remote_commitment_number() ||
3476-
channel.get_latest_monitor_update_id() != monitor.get_latest_update_id() {
3473+
if channel.get_cur_local_commitment_transaction_number() < monitor.get_cur_local_commitment_number() ||
3474+
channel.get_revoked_remote_commitment_transaction_number() < monitor.get_min_seen_secret() ||
3475+
channel.get_cur_remote_commitment_transaction_number() < monitor.get_cur_remote_commitment_number() ||
3476+
channel.get_latest_monitor_update_id() > monitor.get_latest_update_id() {
3477+
// If the channel is ahead of the monitor, return InvalidValue:
3478+
return Err(DecodeError::InvalidValue);
3479+
} else if channel.get_cur_local_commitment_transaction_number() > monitor.get_cur_local_commitment_number() ||
3480+
channel.get_revoked_remote_commitment_transaction_number() > monitor.get_min_seen_secret() ||
3481+
channel.get_cur_remote_commitment_transaction_number() > monitor.get_cur_remote_commitment_number() ||
3482+
channel.get_latest_monitor_update_id() < monitor.get_latest_update_id() {
3483+
// But if the channel is behind of the monitor, close the channel:
34773484
let (_, _, mut new_failed_htlcs) = channel.force_shutdown(true);
34783485
failed_htlcs.append(&mut new_failed_htlcs);
34793486
monitor.broadcast_latest_local_commitment_txn(&args.tx_broadcaster);

lightning/src/ln/functional_tests.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3839,6 +3839,13 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
38393839
create_announced_chan_between_nodes(&nodes, 2, 0, InitFeatures::supported(), InitFeatures::supported());
38403840
let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 3, InitFeatures::supported(), InitFeatures::supported());
38413841

3842+
let mut node_0_stale_monitors_serialized = Vec::new();
3843+
for monitor in nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter() {
3844+
let mut writer = test_utils::TestVecWriter(Vec::new());
3845+
monitor.1.write_for_disk(&mut writer).unwrap();
3846+
node_0_stale_monitors_serialized.push(writer.0);
3847+
}
3848+
38423849
let (our_payment_preimage, _) = route_payment(&nodes[2], &[&nodes[0], &nodes[1]], 1000000);
38433850

38443851
// Serialize the ChannelManager here, but the monitor we keep up-to-date
@@ -3861,6 +3868,15 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
38613868
fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
38623869
new_chan_monitor = test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), &fee_estimator);
38633870
nodes[0].chan_monitor = &new_chan_monitor;
3871+
3872+
let mut node_0_stale_monitors = Vec::new();
3873+
for serialized in node_0_stale_monitors_serialized.iter() {
3874+
let mut read = &serialized[..];
3875+
let (_, monitor) = <(Sha256dHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut read, Arc::new(test_utils::TestLogger::new())).unwrap();
3876+
assert!(read.is_empty());
3877+
node_0_stale_monitors.push(monitor);
3878+
}
3879+
38643880
let mut node_0_monitors = Vec::new();
38653881
for serialized in node_0_monitors_serialized.iter() {
38663882
let mut read = &serialized[..];
@@ -3869,9 +3885,25 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
38693885
node_0_monitors.push(monitor);
38703886
}
38713887

3872-
let mut nodes_0_read = &nodes_0_serialized[..];
38733888
keys_manager = test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new()));
3874-
let (_, nodes_0_deserialized_tmp) = <(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
3889+
3890+
let mut nodes_0_read = &nodes_0_serialized[..];
3891+
if let Err(msgs::DecodeError::InvalidValue) =
3892+
<(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
3893+
default_config: UserConfig::default(),
3894+
keys_manager: &keys_manager,
3895+
fee_estimator: &fee_estimator,
3896+
monitor: nodes[0].chan_monitor,
3897+
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
3898+
logger: Arc::new(test_utils::TestLogger::new()),
3899+
channel_monitors: &mut node_0_stale_monitors.iter_mut().map(|monitor| { (monitor.get_funding_txo().unwrap(), monitor) }).collect(),
3900+
}) { } else {
3901+
panic!("If the monitor(s) are stale, this indicates a bug and we should get an Err return");
3902+
};
3903+
3904+
let mut nodes_0_read = &nodes_0_serialized[..];
3905+
let (_, nodes_0_deserialized_tmp) =
3906+
<(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
38753907
default_config: UserConfig::default(),
38763908
keys_manager: &keys_manager,
38773909
fee_estimator: &fee_estimator,

0 commit comments

Comments
 (0)