Skip to content

Commit 1da1ffa

Browse files
committed
Add tests for handling channel updates
1 parent 37f0c1a commit 1da1ffa

File tree

1 file changed

+133
-1
lines changed

1 file changed

+133
-1
lines changed

lightning/src/ln/router.rs

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ mod tests {
10561056
use ln::router::{Router,NodeInfo,NetworkMap,ChannelInfo,DirectionalChannelInfo,RouteHint};
10571057
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
10581058
use ln::msgs::{ErrorAction, LightningError, RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
1059-
UnsignedChannelAnnouncement, ChannelAnnouncement};
1059+
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate};
10601060
use util::test_utils;
10611061
use util::test_utils::TestVecWriter;
10621062
use util::logger::Logger;
@@ -2163,4 +2163,136 @@ mod tests {
21632163
Err(e) => assert_eq!(e.err, "Channel announcement node had a channel with itself")
21642164
};
21652165
}
2166+
2167+
#[test]
2168+
fn handling_channel_update() {
2169+
let (secp_ctx, _, router) = create_router();
2170+
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
2171+
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
2172+
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_1_privkey);
2173+
let node_id_2 = PublicKey::from_secret_key(&secp_ctx, node_2_privkey);
2174+
let node_1_btckey = &SecretKey::from_slice(&[40; 32]).unwrap();
2175+
let node_2_btckey = &SecretKey::from_slice(&[39; 32]).unwrap();
2176+
2177+
let zero_hash = Sha256dHash::hash(&[0; 32]);
2178+
let short_channel_id = 0;
2179+
let chain_hash = genesis_block(Network::Testnet).header.bitcoin_hash();
2180+
let channel_key = NetworkMap::get_key(short_channel_id, chain_hash);
2181+
2182+
2183+
{
2184+
// Announce a channel we will update
2185+
let unsigned_announcement = UnsignedChannelAnnouncement {
2186+
features: ChannelFeatures::empty(),
2187+
chain_hash,
2188+
short_channel_id,
2189+
node_id_1,
2190+
node_id_2,
2191+
bitcoin_key_1: PublicKey::from_secret_key(&secp_ctx, node_1_btckey),
2192+
bitcoin_key_2: PublicKey::from_secret_key(&secp_ctx, node_2_btckey),
2193+
excess_data: Vec::new(),
2194+
};
2195+
2196+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2197+
let valid_channel_announcement = ChannelAnnouncement {
2198+
node_signature_1: secp_ctx.sign(&msghash, node_1_privkey),
2199+
node_signature_2: secp_ctx.sign(&msghash, node_2_privkey),
2200+
bitcoin_signature_1: secp_ctx.sign(&msghash, node_1_btckey),
2201+
bitcoin_signature_2: secp_ctx.sign(&msghash, node_2_btckey),
2202+
contents: unsigned_announcement.clone(),
2203+
};
2204+
match router.handle_channel_announcement(&valid_channel_announcement) {
2205+
Ok(_) => (),
2206+
Err(_) => panic!()
2207+
};
2208+
2209+
}
2210+
2211+
let mut unsigned_channel_update = UnsignedChannelUpdate {
2212+
chain_hash,
2213+
short_channel_id,
2214+
timestamp: 100,
2215+
flags: 0,
2216+
cltv_expiry_delta: 144,
2217+
htlc_minimum_msat: 1000000,
2218+
fee_base_msat: 10000,
2219+
fee_proportional_millionths: 20,
2220+
excess_data: Vec::new()
2221+
};
2222+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2223+
let valid_channel_update = ChannelUpdate {
2224+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2225+
contents: unsigned_channel_update.clone()
2226+
};
2227+
2228+
match router.handle_channel_update(&valid_channel_update) {
2229+
Ok(res) => assert!(res),
2230+
_ => panic!()
2231+
};
2232+
2233+
{
2234+
let network = router.network_map.write().unwrap();
2235+
match network.channels.get(&channel_key) {
2236+
None => panic!(),
2237+
Some(channel_info) => {
2238+
assert_eq!(channel_info.one_to_two.cltv_expiry_delta, 144);
2239+
assert_eq!(channel_info.two_to_one.cltv_expiry_delta, u16::max_value());
2240+
}
2241+
}
2242+
}
2243+
2244+
unsigned_channel_update.timestamp += 100;
2245+
unsigned_channel_update.excess_data.push(1);
2246+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2247+
let valid_channel_update = ChannelUpdate {
2248+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2249+
contents: unsigned_channel_update.clone()
2250+
};
2251+
// Return false because contains excess data
2252+
match router.handle_channel_update(&valid_channel_update) {
2253+
Ok(res) => assert!(!res),
2254+
_ => panic!()
2255+
};
2256+
2257+
unsigned_channel_update.short_channel_id += 1;
2258+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2259+
let valid_channel_update = ChannelUpdate {
2260+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2261+
contents: unsigned_channel_update.clone()
2262+
};
2263+
2264+
match router.handle_channel_update(&valid_channel_update) {
2265+
Ok(_) => panic!(),
2266+
Err(e) => assert_eq!(e.err, "Couldn't find channel for update")
2267+
};
2268+
unsigned_channel_update.short_channel_id = short_channel_id;
2269+
2270+
2271+
// Even though previous update was not relayed further, we still accepted it,
2272+
// so we now won't accept update before the previous one.
2273+
unsigned_channel_update.timestamp -= 10;
2274+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2275+
let valid_channel_update = ChannelUpdate {
2276+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2277+
contents: unsigned_channel_update.clone()
2278+
};
2279+
2280+
match router.handle_channel_update(&valid_channel_update) {
2281+
Ok(_) => panic!(),
2282+
Err(e) => assert_eq!(e.err, "Update older than last processed update")
2283+
};
2284+
unsigned_channel_update.timestamp += 500;
2285+
2286+
let fake_msghash = hash_to_message!(&zero_hash);
2287+
let invalid_sig_channel_update = ChannelUpdate {
2288+
signature: secp_ctx.sign(&fake_msghash, node_1_privkey),
2289+
contents: unsigned_channel_update.clone()
2290+
};
2291+
2292+
match router.handle_channel_update(&invalid_sig_channel_update) {
2293+
Ok(_) => panic!(),
2294+
Err(e) => assert_eq!(e.err, "Invalid signature from remote node")
2295+
};
2296+
2297+
}
21662298
}

0 commit comments

Comments
 (0)