Skip to content

Commit da37a9b

Browse files
committed
Fix + test disconnect/reconnect prior to FundingLocked
1 parent 7fd3f11 commit da37a9b

File tree

2 files changed

+84
-4
lines changed

2 files changed

+84
-4
lines changed

src/ln/channel.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,15 +2215,32 @@ impl Channel {
22152215
return Err(ChannelError::Close("Peer sent a loose channel_reestablish not after reconnect"));
22162216
}
22172217

2218-
if msg.next_local_commitment_number == 0 || msg.next_local_commitment_number >= INITIAL_COMMITMENT_NUMBER ||
2219-
msg.next_remote_commitment_number == 0 || msg.next_remote_commitment_number >= INITIAL_COMMITMENT_NUMBER {
2218+
if msg.next_local_commitment_number >= INITIAL_COMMITMENT_NUMBER || msg.next_remote_commitment_number >= INITIAL_COMMITMENT_NUMBER {
22202219
return Err(ChannelError::Close("Peer sent a garbage channel_reestablish"));
22212220
}
22222221

22232222
// Go ahead and unmark PeerDisconnected as various calls we may make check for it (and all
22242223
// remaining cases either succeed or ErrorMessage-fail).
22252224
self.channel_state &= !(ChannelState::PeerDisconnected as u32);
22262225

2226+
if self.channel_state & (ChannelState::FundingSent as u32 | ChannelState::OurFundingLocked as u32) == ChannelState::FundingSent as u32 {
2227+
// Short circuit the whole handler as there is nothing we can resend them
2228+
return Ok((None, None, None, None, RAACommitmentOrder::CommitmentFirst));
2229+
}
2230+
2231+
if msg.next_local_commitment_number == 0 || msg.next_remote_commitment_number == 0 {
2232+
if self.channel_state & (ChannelState::FundingSent as u32) != ChannelState::FundingSent as u32 {
2233+
return Err(ChannelError::Close("Peer sent a pre-funding channel_reestablish after we exchanged funding_locked"));
2234+
}
2235+
// We have OurFundingLocked set!
2236+
let next_per_commitment_secret = self.build_local_commitment_secret(self.cur_local_commitment_transaction_number);
2237+
let next_per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &next_per_commitment_secret);
2238+
return Ok((Some(msgs::FundingLocked {
2239+
channel_id: self.channel_id(),
2240+
next_per_commitment_point: next_per_commitment_point,
2241+
}), None, None, None, RAACommitmentOrder::CommitmentFirst));
2242+
}
2243+
22272244
let required_revoke = if msg.next_remote_commitment_number == INITIAL_COMMITMENT_NUMBER - self.cur_local_commitment_transaction_number {
22282245
// Remote isn't waiting on any RevokeAndACK from us!
22292246
// Note that if we need to repeat our FundingLocked we'll do that in the next if block.
@@ -2950,7 +2967,8 @@ impl Channel {
29502967
msgs::ChannelReestablish {
29512968
channel_id: self.channel_id(),
29522969
next_local_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_local_commitment_transaction_number,
2953-
next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_remote_commitment_transaction_number,
2970+
next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_remote_commitment_transaction_number -
2971+
if self.channel_state & (ChannelState::FundingSent as u32 | ChannelState::OurFundingLocked as u32) == (ChannelState::FundingSent as u32) { 1 } else { 0 },
29542972
data_loss_protect: None,
29552973
}
29562974
}

src/ln/channelmanager.rs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3175,7 +3175,7 @@ impl<'a, R : ::std::io::Read> ReadableArgs<R, ChannelManagerReadArgs<'a>> for (S
31753175
mod tests {
31763176
use chain::chaininterface;
31773177
use chain::transaction::OutPoint;
3178-
use chain::chaininterface::ChainListener;
3178+
use chain::chaininterface::{ChainListener, ChainWatchInterface};
31793179
use chain::keysinterface::KeysInterface;
31803180
use chain::keysinterface;
31813181
use ln::channelmanager::{ChannelManager,ChannelManagerReadArgs,OnionKeys,PaymentFailReason,RAACommitmentOrder};
@@ -6869,6 +6869,68 @@ mod tests {
68696869
}
68706870
}
68716871

6872+
#[test]
6873+
fn test_no_txn_manager_serialize_deserialize() {
6874+
let mut nodes = create_network(2);
6875+
6876+
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001);
6877+
6878+
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
6879+
6880+
let nodes_0_serialized = nodes[0].node.encode();
6881+
let mut chan_0_monitor_serialized = VecWriter(Vec::new());
6882+
nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
6883+
6884+
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone()));
6885+
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
6886+
let (_, chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
6887+
assert!(chan_0_monitor_read.is_empty());
6888+
6889+
let mut nodes_0_read = &nodes_0_serialized[..];
6890+
let keys_manager = Arc::new(keysinterface::KeysManager::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new())));
6891+
let (_, nodes_0_deserialized) = {
6892+
let mut channel_monitors = HashMap::new();
6893+
channel_monitors.insert(chan_0_monitor.get_funding_txo().unwrap(), &chan_0_monitor);
6894+
<(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
6895+
keys_manager,
6896+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
6897+
monitor: nodes[0].chan_monitor.clone(),
6898+
chain_monitor: nodes[0].chain_monitor.clone(),
6899+
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
6900+
logger: Arc::new(test_utils::TestLogger::new()),
6901+
channel_monitors: &channel_monitors,
6902+
}).unwrap()
6903+
};
6904+
assert!(nodes_0_read.is_empty());
6905+
6906+
assert!(nodes[0].chan_monitor.add_update_monitor(chan_0_monitor.get_funding_txo().unwrap(), chan_0_monitor).is_ok());
6907+
nodes[0].node = Arc::new(nodes_0_deserialized);
6908+
let nodes_0_as_listener: Arc<ChainListener> = nodes[0].node.clone();
6909+
nodes[0].chain_monitor.register_listener(Arc::downgrade(&nodes_0_as_listener));
6910+
assert_eq!(nodes[0].node.list_channels().len(), 1);
6911+
check_added_monitors!(nodes[0], 1);
6912+
6913+
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
6914+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
6915+
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
6916+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
6917+
6918+
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]).unwrap();
6919+
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
6920+
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]).unwrap();
6921+
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
6922+
6923+
let (funding_locked, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
6924+
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &funding_locked);
6925+
for node in nodes.iter() {
6926+
assert!(node.router.handle_channel_announcement(&announcement).unwrap());
6927+
node.router.handle_channel_update(&as_update).unwrap();
6928+
node.router.handle_channel_update(&bs_update).unwrap();
6929+
}
6930+
6931+
send_payment(&nodes[0], &[&nodes[1]], 1000000);
6932+
}
6933+
68726934
#[test]
68736935
fn test_simple_manager_serialize_deserialize() {
68746936
let mut nodes = create_network(2);

0 commit comments

Comments
 (0)