Skip to content

Commit b8b718b

Browse files
authored
Merge pull request #101 from TheBlueMatt/main
Include node details when the node is new
2 parents b414c4d + a9b18e9 commit b8b718b

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)