Skip to content

Commit 07f6692

Browse files
committed
Include node details when the node is new
In cases where we only receive node details for the first time after the last-seen timestamp, we were mistakenly not including the node info at all in the snapshot. This was the most egregious for initial syncs, where we'd include no node info at all. Luckily the fix is simple, just include a full node info sync in such cases.
1 parent b414c4d commit 07f6692

File tree

2 files changed

+68
-26
lines changed

2 files changed

+68
-26
lines changed

src/serialization.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,10 @@ pub(super) fn serialize_delta_set(channel_delta_set: DeltaSet, node_delta_set: N
240240
}
241241
Some((id, delta))
242242
} else {
243-
None
243+
// If the node details didn't exist before the last-update timestamp, send a full
244+
// update.
245+
delta.strategy = Some(NodeSerializationStrategy::Full);
246+
Some((id, delta))
244247
}
245248
}).collect();
246249

src/tests/mod.rs

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,12 @@ fn generate_node_announcement(private_key: Option<SecretKey>) -> NodeAnnouncemen
7575
}
7676

7777

78-
fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
78+
fn generate_channel_announcement_between_nodes(short_channel_id: u64, random_private_key_1: &SecretKey, random_private_key_2: &SecretKey) -> ChannelAnnouncement {
7979
let secp_context = Secp256k1::new();
8080

81-
let random_private_key_1 = SecretKey::from_slice(&[1; 32]).unwrap();
8281
let random_public_key_1 = random_private_key_1.public_key(&secp_context);
8382
let node_id_1 = NodeId::from_pubkey(&random_public_key_1);
8483

85-
let random_private_key_2 = SecretKey::from_slice(&[2; 32]).unwrap();
8684
let random_public_key_2 = random_private_key_2.public_key(&secp_context);
8785
let node_id_2 = NodeId::from_pubkey(&random_public_key_2);
8886

@@ -98,8 +96,8 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
9896
};
9997

10098
let msg_hash = bitcoin::secp256k1::Message::from_slice(&Sha256dHash::hash(&announcement.encode()[..])[..]).unwrap();
101-
let node_signature_1 = secp_context.sign_ecdsa(&msg_hash, &random_private_key_1);
102-
let node_signature_2 = secp_context.sign_ecdsa(&msg_hash, &random_private_key_2);
99+
let node_signature_1 = secp_context.sign_ecdsa(&msg_hash, random_private_key_1);
100+
let node_signature_2 = secp_context.sign_ecdsa(&msg_hash, random_private_key_2);
103101

104102
ChannelAnnouncement {
105103
node_signature_1,
@@ -110,6 +108,12 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
110108
}
111109
}
112110

111+
fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
112+
let random_private_key_1 = SecretKey::from_slice(&[1; 32]).unwrap();
113+
let random_private_key_2 = SecretKey::from_slice(&[2; 32]).unwrap();
114+
generate_channel_announcement_between_nodes(short_channel_id, &random_private_key_1, &random_private_key_2)
115+
}
116+
113117
fn generate_update(scid: u64, direction: bool, timestamp: u32, expiry_delta: u16, min_msat: u64, max_msat: u64, base_msat: u32, fee_rate: u32) -> ChannelUpdate {
114118
let flag_mask = if direction { 1 } else { 0 };
115119
ChannelUpdate {
@@ -360,30 +364,59 @@ async fn test_node_announcement_delta_detection() {
360364
let timestamp = current_time() - 10;
361365

362366
{ // seed the db
367+
let third_node = SecretKey::from_slice(&[3; 32]).unwrap();
368+
let fourth_node = SecretKey::from_slice(&[4; 32]).unwrap();
363369

364370
{ // necessary for the node announcements to be considered relevant
365371
let announcement = generate_channel_announcement(1);
366-
let update_1 = generate_update(1, false, timestamp, 0, 0, 0, 6, 0);
367-
let update_2 = generate_update(1, true, timestamp, 0, 0, 0, 6, 0);
372+
let update_1 = generate_update(1, false, timestamp - 10, 0, 0, 0, 6, 0);
373+
let update_2 = generate_update(1, true, timestamp - 10, 0, 0, 0, 6, 0);
368374

369375
network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap();
370376
network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap();
371377
network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap();
372378

373-
receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp))).await.unwrap();
374-
receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp))).await.unwrap();
375-
receiver.send(GossipMessage::ChannelUpdate(update_2, Some(timestamp))).await.unwrap();
379+
receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - 10))).await.unwrap();
380+
receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - 10))).await.unwrap();
381+
receiver.send(GossipMessage::ChannelUpdate(update_2, Some(timestamp - 10))).await.unwrap();
376382
}
377383

378-
let mut announcement = generate_node_announcement(None);
379-
announcement.contents.timestamp = timestamp - 10;
380-
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
381-
receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap();
382-
announcement.contents.timestamp = timestamp - 8;
383-
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
384-
receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap();
384+
{ // necessary for the second node announcements to be considered relevant
385+
let announcement = generate_channel_announcement_between_nodes(2, &third_node, &fourth_node);
386+
let update_1 = generate_update(2, false, timestamp - 10, 0, 0, 0, 6, 0);
387+
let update_2 = generate_update(2, true, timestamp - 10, 0, 0, 0, 6, 0);
388+
389+
network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap();
390+
network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap();
391+
network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap();
392+
393+
receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - 10))).await.unwrap();
394+
receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - 10))).await.unwrap();
395+
receiver.send(GossipMessage::ChannelUpdate(update_2, Some(timestamp - 10))).await.unwrap();
396+
}
397+
398+
{
399+
// Add some node announcements from before the last sync for node 1.
400+
let mut announcement = generate_node_announcement(None);
401+
announcement.contents.timestamp = timestamp - 10;
402+
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
403+
receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap();
404+
announcement.contents.timestamp = timestamp - 8;
405+
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
406+
receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap();
407+
}
408+
409+
{
410+
// Add a node announcement from before the last sync for node 4.
411+
let mut announcement = generate_node_announcement(Some(fourth_node.clone()));
412+
announcement.contents.timestamp = timestamp - 10;
413+
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
414+
receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap();
415+
}
385416

386417
{
418+
// Add current announcement for node two, which should be included in its entirety as
419+
// its new since the last sync time
387420
let mut current_announcement = generate_node_announcement(Some(SecretKey::from_slice(&[2; 32]).unwrap()));
388421
current_announcement.contents.features = NodeFeatures::from_be_bytes(vec![23, 48]);
389422
current_announcement.contents.timestamp = timestamp;
@@ -392,19 +425,22 @@ async fn test_node_announcement_delta_detection() {
392425
}
393426

394427
{
395-
let mut current_announcement = generate_node_announcement(Some(SecretKey::from_slice(&[3; 32]).unwrap()));
428+
// Note that we do *not* add the node announcement for node three to the network graph,
429+
// simulating its channels having timed out, and thus the node announcement (which is
430+
// new) will not be included.
431+
let mut current_announcement = generate_node_announcement(Some(third_node));
396432
current_announcement.contents.features = NodeFeatures::from_be_bytes(vec![22, 49]);
397433
current_announcement.contents.timestamp = timestamp;
398434
receiver.send(GossipMessage::NodeAnnouncement(current_announcement, Some(timestamp))).await.unwrap();
399435
}
400436

401437
{
402-
// modify announcement to contain a bunch of addresses
438+
// modify announcement of node 1 to contain a bunch of addresses
439+
let mut announcement = generate_node_announcement(None);
403440
announcement.contents.addresses.push(SocketAddress::Hostname {
404441
hostname: "google.com".to_string().try_into().unwrap(),
405442
port: 443,
406443
});
407-
announcement.contents.features = NodeFeatures::from_be_bytes(vec![23, 48]);
408444
announcement.contents.addresses.push(SocketAddress::TcpIpV4 { addr: [127, 0, 0, 1], port: 9635 });
409445
announcement.contents.addresses.push(SocketAddress::TcpIpV6 { addr: [1; 16], port: 1337 });
410446
announcement.contents.addresses.push(SocketAddress::OnionV2([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]));
@@ -415,9 +451,9 @@ async fn test_node_announcement_delta_detection() {
415451
port: 4,
416452
});
417453
announcement.contents.timestamp = timestamp;
454+
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
455+
receiver.send(GossipMessage::NodeAnnouncement(announcement, Some(timestamp))).await.unwrap();
418456
}
419-
network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap();
420-
receiver.send(GossipMessage::NodeAnnouncement(announcement, Some(timestamp))).await.unwrap();
421457

422458
drop(receiver);
423459
persister.persist_gossip().await;
@@ -431,11 +467,14 @@ async fn test_node_announcement_delta_detection() {
431467
let serialization = serialize_delta(&delta, 2, logger.clone());
432468
clean_test_db().await;
433469

434-
assert_eq!(serialization.message_count, 3);
470+
// All channel updates completed prior to the last sync timestamp, so none are included.
471+
assert_eq!(serialization.message_count, 0);
472+
// We should have updated addresses for node 1, full announcements for node 2 and 3, and no
473+
// announcement for node 4.
435474
assert_eq!(serialization.node_announcement_count, 2);
436-
assert_eq!(serialization.node_update_count, 1);
475+
assert_eq!(serialization.node_update_count, 2);
437476
assert_eq!(serialization.node_feature_update_count, 1);
438-
assert_eq!(serialization.node_address_update_count, 1);
477+
assert_eq!(serialization.node_address_update_count, 2);
439478
}
440479

441480
/// If a channel has only seen updates in one direction, it should not be announced

0 commit comments

Comments
 (0)