Skip to content

Commit 79c8491

Browse files
committed
Add tests for getting node announcements
1 parent 4258750 commit 79c8491

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

lightning/src/ln/router.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2516,4 +2516,122 @@ mod tests {
25162516
let channels_with_announcements = router.get_next_channel_announcements(channel_key + 1000, 1);
25172517
assert_eq!(channels_with_announcements.len(), 0);
25182518
}
2519+
2520+
#[test]
2521+
fn getting_next_node_announcements() {
2522+
let (secp_ctx, _, router) = create_router();
2523+
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
2524+
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
2525+
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_1_privkey);
2526+
let node_id_2 = PublicKey::from_secret_key(&secp_ctx, node_2_privkey);
2527+
let node_1_btckey = &SecretKey::from_slice(&[40; 32]).unwrap();
2528+
let node_2_btckey = &SecretKey::from_slice(&[39; 32]).unwrap();
2529+
2530+
let short_channel_id = 1;
2531+
let chain_hash = genesis_block(Network::Testnet).header.bitcoin_hash();
2532+
2533+
// No nodes yet.
2534+
let next_announcements = router.get_next_node_announcements(None, 10);
2535+
assert_eq!(next_announcements.len(), 0);
2536+
2537+
{
2538+
// Announce a channel to add 2 nodes
2539+
let unsigned_announcement = UnsignedChannelAnnouncement {
2540+
features: ChannelFeatures::empty(),
2541+
chain_hash,
2542+
short_channel_id,
2543+
node_id_1,
2544+
node_id_2,
2545+
bitcoin_key_1: PublicKey::from_secret_key(&secp_ctx, node_1_btckey),
2546+
bitcoin_key_2: PublicKey::from_secret_key(&secp_ctx, node_2_btckey),
2547+
excess_data: Vec::new(),
2548+
};
2549+
2550+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2551+
let valid_channel_announcement = ChannelAnnouncement {
2552+
node_signature_1: secp_ctx.sign(&msghash, node_1_privkey),
2553+
node_signature_2: secp_ctx.sign(&msghash, node_2_privkey),
2554+
bitcoin_signature_1: secp_ctx.sign(&msghash, node_1_btckey),
2555+
bitcoin_signature_2: secp_ctx.sign(&msghash, node_2_btckey),
2556+
contents: unsigned_announcement.clone(),
2557+
};
2558+
match router.handle_channel_announcement(&valid_channel_announcement) {
2559+
Ok(_) => (),
2560+
Err(_) => panic!()
2561+
};
2562+
}
2563+
2564+
2565+
// Nodes were never announced
2566+
let next_announcements = router.get_next_node_announcements(None, 3);
2567+
assert_eq!(next_announcements.len(), 0);
2568+
2569+
{
2570+
let mut unsigned_announcement = UnsignedNodeAnnouncement {
2571+
features: NodeFeatures::supported(),
2572+
timestamp: 1000,
2573+
node_id: node_id_1,
2574+
rgb: [0; 3],
2575+
alias: [0; 32],
2576+
addresses: Vec::new(),
2577+
excess_address_data: Vec::new(),
2578+
excess_data: Vec::new(),
2579+
};
2580+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2581+
let valid_announcement = NodeAnnouncement {
2582+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2583+
contents: unsigned_announcement.clone()
2584+
};
2585+
match router.handle_node_announcement(&valid_announcement) {
2586+
Ok(_) => (),
2587+
Err(_) => panic!()
2588+
};
2589+
2590+
unsigned_announcement.node_id = node_id_2;
2591+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2592+
let valid_announcement = NodeAnnouncement {
2593+
signature: secp_ctx.sign(&msghash, node_2_privkey),
2594+
contents: unsigned_announcement.clone()
2595+
};
2596+
2597+
match router.handle_node_announcement(&valid_announcement) {
2598+
Ok(_) => (),
2599+
Err(_) => panic!()
2600+
};
2601+
}
2602+
2603+
let next_announcements = router.get_next_node_announcements(None, 3);
2604+
assert_eq!(next_announcements.len(), 2);
2605+
2606+
// Skip the first node.
2607+
let next_announcements = router.get_next_node_announcements(Some(&node_id_1), 2);
2608+
assert_eq!(next_announcements.len(), 1);
2609+
2610+
{
2611+
// Later announcement which should not be relayed (excess data) prevent us from sharing a node
2612+
let unsigned_announcement = UnsignedNodeAnnouncement {
2613+
features: NodeFeatures::supported(),
2614+
timestamp: 1010,
2615+
node_id: node_id_2,
2616+
rgb: [0; 3],
2617+
alias: [0; 32],
2618+
addresses: Vec::new(),
2619+
excess_address_data: Vec::new(),
2620+
excess_data: [1; 3].to_vec(),
2621+
};
2622+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2623+
let valid_announcement = NodeAnnouncement {
2624+
signature: secp_ctx.sign(&msghash, node_2_privkey),
2625+
contents: unsigned_announcement.clone()
2626+
};
2627+
match router.handle_node_announcement(&valid_announcement) {
2628+
Ok(res) => assert!(!res),
2629+
Err(_) => panic!()
2630+
};
2631+
}
2632+
2633+
let next_announcements = router.get_next_node_announcements(Some(&node_id_1), 2);
2634+
assert_eq!(next_announcements.len(), 0);
2635+
2636+
}
25192637
}

0 commit comments

Comments
 (0)