Skip to content

Commit b6036e1

Browse files
committed
Add tests for handling channel updates
1 parent 680dc7b commit b6036e1

File tree

1 file changed

+132
-1
lines changed

1 file changed

+132
-1
lines changed

lightning/src/ln/router.rs

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ mod tests {
10581058
use ln::router::{Router,NodeInfo,NetworkMap,ChannelInfo,DirectionalChannelInfo,RouteHint};
10591059
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
10601060
use ln::msgs::{ErrorAction, LightningError, RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
1061-
UnsignedChannelAnnouncement, ChannelAnnouncement};
1061+
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate};
10621062
use util::test_utils;
10631063
use util::test_utils::TestVecWriter;
10641064
use util::logger::Logger;
@@ -2163,4 +2163,135 @@ 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+
let node = network.nodes.get(&node_id_1).unwrap();
2243+
assert_eq!(node.lowest_inbound_channel_fee_base_msat, u32::max_value());
2244+
}
2245+
2246+
unsigned_channel_update.timestamp += 100;
2247+
unsigned_channel_update.excess_data.push(1);
2248+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2249+
let valid_channel_update = ChannelUpdate {
2250+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2251+
contents: unsigned_channel_update.clone()
2252+
};
2253+
// Return false because contains excess data
2254+
match router.handle_channel_update(&valid_channel_update) {
2255+
Ok(res) => assert!(!res),
2256+
_ => panic!()
2257+
};
2258+
2259+
unsigned_channel_update.short_channel_id += 1;
2260+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2261+
let valid_channel_update = ChannelUpdate {
2262+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2263+
contents: unsigned_channel_update.clone()
2264+
};
2265+
2266+
match router.handle_channel_update(&valid_channel_update) {
2267+
Ok(_) => panic!(),
2268+
Err(e) => assert_eq!(e.err, "Couldn't find channel for update")
2269+
};
2270+
unsigned_channel_update.short_channel_id = short_channel_id;
2271+
2272+
unsigned_channel_update.timestamp = 0;
2273+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2274+
let valid_channel_update = ChannelUpdate {
2275+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2276+
contents: unsigned_channel_update.clone()
2277+
};
2278+
2279+
match router.handle_channel_update(&valid_channel_update) {
2280+
Ok(_) => panic!(),
2281+
Err(e) => assert_eq!(e.err, "Update older than last processed update")
2282+
};
2283+
unsigned_channel_update.timestamp = 100;
2284+
2285+
let fake_msghash = hash_to_message!(&zero_hash);
2286+
let invalid_sig_channel_update = ChannelUpdate {
2287+
signature: secp_ctx.sign(&fake_msghash, node_1_privkey),
2288+
contents: unsigned_channel_update.clone()
2289+
};
2290+
2291+
match router.handle_channel_update(&invalid_sig_channel_update) {
2292+
Ok(_) => panic!(),
2293+
Err(e) => assert_eq!(e.err, "Invalid signature from remote node")
2294+
};
2295+
2296+
}
21662297
}

0 commit comments

Comments
 (0)