Skip to content

Commit af89dc1

Browse files
committed
Testing for channel_reserve check
and max_htlc_value_in_flight_msat
1 parent 23c12a2 commit af89dc1

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed

src/ln/channelmanager.rs

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3835,6 +3835,244 @@ mod tests {
38353835
}
38363836
}
38373837

3838+
#[test]
3839+
fn channel_reserve_test() {
3840+
use util::rng;
3841+
use std::sync::atomic::Ordering;
3842+
use ln::msgs::HandleError;
3843+
3844+
macro_rules! get_channel_value_stat {
3845+
($node: expr, $channel_id: expr) => {{
3846+
let chan_lock = $node.node.channel_state.lock().unwrap();
3847+
let chan = chan_lock.by_id.get(&$channel_id).unwrap();
3848+
chan.get_value_stat()
3849+
}}
3850+
}
3851+
3852+
let mut nodes = create_network(3);
3853+
let chan_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1900, 1001);
3854+
let chan_2 = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1900, 1001);
3855+
3856+
let mut stat01 = get_channel_value_stat!(nodes[0], chan_1.2);
3857+
let mut stat11 = get_channel_value_stat!(nodes[1], chan_1.2);
3858+
3859+
let mut stat12 = get_channel_value_stat!(nodes[1], chan_2.2);
3860+
let mut stat22 = get_channel_value_stat!(nodes[2], chan_2.2);
3861+
3862+
macro_rules! get_route_and_payment_hash {
3863+
($recv_value: expr) => {{
3864+
let route = nodes[0].router.get_route(&nodes.last().unwrap().node.get_our_node_id(), None, &Vec::new(), $recv_value, TEST_FINAL_CLTV).unwrap();
3865+
let payment_preimage = [*nodes[0].network_payment_count.borrow(); 32];
3866+
*nodes[0].network_payment_count.borrow_mut() += 1;
3867+
let payment_hash = {
3868+
let mut sha = Sha256::new();
3869+
sha.input(&payment_preimage[..]);
3870+
let mut ret = [0; 32];
3871+
sha.result(&mut ret);
3872+
ret
3873+
};
3874+
(route, payment_hash, payment_preimage)
3875+
}}
3876+
};
3877+
3878+
macro_rules! expect_pending_htlcs_forwardable {
3879+
($node: expr) => {{
3880+
let events = $node.node.get_and_clear_pending_events();
3881+
assert_eq!(events.len(), 1);
3882+
match events[0] {
3883+
Event::PendingHTLCsForwardable { .. } => { },
3884+
_ => panic!("Unexpected event"),
3885+
};
3886+
$node.node.channel_state.lock().unwrap().next_forward = Instant::now();
3887+
$node.node.process_pending_htlc_forwards();
3888+
}}
3889+
};
3890+
3891+
macro_rules! expect_forward {
3892+
($node: expr) => {{
3893+
let mut events = $node.node.get_and_clear_pending_events();
3894+
assert_eq!(events.len(), 1);
3895+
let payment_event = SendEvent::from_event(events.remove(0));
3896+
assert_eq!(payment_event.msgs.len(), 1);
3897+
check_added_monitors!($node, 1);
3898+
payment_event
3899+
}}
3900+
}
3901+
3902+
macro_rules! expect_payment_received {
3903+
($node: expr, $expected_payment_hash: expr, $expected_recv_value: expr) => {
3904+
let events = $node.node.get_and_clear_pending_events();
3905+
assert_eq!(events.len(), 1);
3906+
match events[0] {
3907+
Event::PaymentReceived { ref payment_hash, amt } => {
3908+
assert_eq!($expected_payment_hash, *payment_hash);
3909+
assert_eq!($expected_recv_value, amt);
3910+
},
3911+
_ => panic!("Unexpected event"),
3912+
}
3913+
}
3914+
};
3915+
3916+
let feemsat = 239; // somehow we know?
3917+
let total_fee_msat = (nodes.len() - 2) as u64 * 239;
3918+
3919+
let recv_value_0 = stat01.their_max_htlc_value_in_flight_msat - total_fee_msat;
3920+
3921+
// attempt to send amt_msat > their_max_htlc_value_in_flight_msat
3922+
{
3923+
let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_0 + 1);
3924+
assert!(route.hops.iter().rev().skip(1).all(|h| h.fee_msat == feemsat));
3925+
let err = nodes[0].node.send_payment(route, our_payment_hash).err().unwrap();
3926+
match err {
3927+
APIError::RouteError{err} => assert_eq!(err, "Cannot send value that would put us over our max HTLC value in flight"),
3928+
_ => panic!("Unknown error variants"),
3929+
}
3930+
}
3931+
3932+
let mut htlc_id = 0;
3933+
// channel reserve is bigger than max_htlc_msat so loop to deplete
3934+
// nodes[0]'s wealth
3935+
loop {
3936+
let amt_msat = recv_value_0 + total_fee_msat;
3937+
if stat01.value_to_self_msat - amt_msat < stat01.channel_reserve_msat {
3938+
break;
3939+
}
3940+
send_payment(&nodes[0], &vec![&nodes[1], &nodes[2]][..], recv_value_0);
3941+
htlc_id += 1;
3942+
3943+
let (stat01_, stat11_, stat12_, stat22_) = (
3944+
get_channel_value_stat!(nodes[0], chan_1.2),
3945+
get_channel_value_stat!(nodes[1], chan_1.2),
3946+
get_channel_value_stat!(nodes[1], chan_2.2),
3947+
get_channel_value_stat!(nodes[2], chan_2.2),
3948+
);
3949+
3950+
assert_eq!(stat01_.value_to_self_msat, stat01.value_to_self_msat - amt_msat);
3951+
assert_eq!(stat11_.value_to_self_msat, stat11.value_to_self_msat + amt_msat);
3952+
assert_eq!(stat12_.value_to_self_msat, stat12.value_to_self_msat - (amt_msat - feemsat));
3953+
assert_eq!(stat22_.value_to_self_msat, stat22.value_to_self_msat + (amt_msat - feemsat));
3954+
stat01 = stat01_; stat11 = stat11_; stat12 = stat12_; stat22 = stat22_;
3955+
}
3956+
3957+
{
3958+
let recv_value = stat01.value_to_self_msat - stat01.channel_reserve_msat - total_fee_msat;
3959+
// attempt to get channel_reserve violation
3960+
let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value + 1);
3961+
let err = nodes[0].node.send_payment(route.clone(), our_payment_hash).err().unwrap();
3962+
match err {
3963+
APIError::RouteError{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
3964+
_ => panic!("Unknown error variants"),
3965+
}
3966+
}
3967+
3968+
// adding pending output
3969+
let recv_value_1 = (stat01.value_to_self_msat - stat01.channel_reserve_msat - total_fee_msat)/2;
3970+
let amt_msat_1 = recv_value_1 + total_fee_msat;
3971+
3972+
let (route_1, our_payment_hash_1, our_payment_preimage_1) = get_route_and_payment_hash!(recv_value_1);
3973+
let payment_event = {
3974+
nodes[0].node.send_payment(route_1, our_payment_hash_1).unwrap();
3975+
check_added_monitors!(nodes[0], 1);
3976+
3977+
let mut events = nodes[0].node.get_and_clear_pending_events();
3978+
assert_eq!(events.len(), 1);
3979+
SendEvent::from_event(events.remove(0))
3980+
};
3981+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
3982+
3983+
let recv_value_2 = stat01.value_to_self_msat - amt_msat_1 - stat01.channel_reserve_msat - total_fee_msat;
3984+
{
3985+
let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_2 + 1);
3986+
match nodes[0].node.send_payment(route, our_payment_hash).err().unwrap() {
3987+
APIError::RouteError{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
3988+
_ => panic!("Unknown error variants"),
3989+
}
3990+
}
3991+
3992+
{
3993+
// test channel_reserve test on nodes[1] side
3994+
let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_2 + 1);
3995+
3996+
// Need to manually create update_add_htlc message to go around the channel reserve check in send_htlc()
3997+
let secp_ctx = Secp256k1::new();
3998+
let session_priv = SecretKey::from_slice(&secp_ctx, &{
3999+
let mut session_key = [0; 32];
4000+
rng::fill_bytes(&mut session_key);
4001+
session_key
4002+
}).expect("RNG is bad!");
4003+
4004+
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
4005+
let onion_keys = ChannelManager::construct_onion_keys(&secp_ctx, &route, &session_priv).unwrap();
4006+
let (onion_payloads, htlc_msat, htlc_cltv) = ChannelManager::build_onion_payloads(&route, cur_height).unwrap();
4007+
let onion_packet = ChannelManager::construct_onion_packet(onion_payloads, onion_keys, &our_payment_hash);
4008+
let msg = msgs::UpdateAddHTLC {
4009+
channel_id: chan_1.2,
4010+
htlc_id,
4011+
amount_msat: htlc_msat,
4012+
payment_hash: our_payment_hash,
4013+
cltv_expiry: htlc_cltv,
4014+
onion_routing_packet: onion_packet,
4015+
};
4016+
4017+
let err = nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &msg).err().unwrap();
4018+
match err {
4019+
HandleError{err, .. } => assert_eq!(err, "Remote HTLC add would put them over their reserve value"),
4020+
}
4021+
}
4022+
4023+
// now see if it goes through on both sides
4024+
let (route_2, our_payment_hash_2, our_payment_preimage_2) = get_route_and_payment_hash!(recv_value_2);
4025+
// but this will stuck the in the holding cell b/c nodes[0] is in
4026+
// AwaitingRemoteRevoke state
4027+
nodes[0].node.send_payment(route_2, our_payment_hash_2).unwrap();
4028+
check_added_monitors!(nodes[0], 0);
4029+
let events = nodes[0].node.get_and_clear_pending_events();
4030+
assert_eq!(events.len(), 0);
4031+
4032+
check_added_monitors!(nodes[1], 0);
4033+
let (as_revoke_and_ack, as_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &payment_event.commitment_msg).unwrap();
4034+
check_added_monitors!(nodes[1], 1);
4035+
check_added_monitors!(nodes[0], 0);
4036+
let commitment_update_2 = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &as_revoke_and_ack).unwrap().unwrap();
4037+
check_added_monitors!(nodes[0], 1);
4038+
let (bs_revoke_and_ack, bs_none) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &as_commitment_signed.unwrap()).unwrap();
4039+
assert!(bs_none.is_none());
4040+
check_added_monitors!(nodes[0], 1);
4041+
assert!(nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &bs_revoke_and_ack).unwrap().is_none());
4042+
check_added_monitors!(nodes[1], 1);
4043+
4044+
expect_pending_htlcs_forwardable!(nodes[1]);
4045+
4046+
let payment_event_1 = expect_forward!(nodes[1]);
4047+
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_1.msgs[0]).unwrap();
4048+
commitment_signed_dance!(nodes[2], nodes[1], &payment_event_1.commitment_msg, false);
4049+
4050+
expect_pending_htlcs_forwardable!(nodes[2]);
4051+
expect_payment_received!(nodes[2], our_payment_hash_1, recv_value_1);
4052+
4053+
// second payment
4054+
assert_eq!(commitment_update_2.update_add_htlcs.len(), 1);
4055+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &commitment_update_2.update_add_htlcs[0]).unwrap();
4056+
commitment_signed_dance!(nodes[1], nodes[0], &commitment_update_2.commitment_signed, false);
4057+
expect_pending_htlcs_forwardable!(nodes[1]);
4058+
4059+
let payment_event_2 = expect_forward!(nodes[1]);
4060+
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_2.msgs[0]).unwrap();
4061+
4062+
commitment_signed_dance!(nodes[2], nodes[1], &payment_event_2.commitment_msg, false);
4063+
expect_pending_htlcs_forwardable!(nodes[2]);
4064+
4065+
expect_payment_received!(nodes[2], our_payment_hash_2, recv_value_2);
4066+
4067+
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_1);
4068+
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_2);
4069+
4070+
let expected_value_to_self = stat01.value_to_self_msat - (recv_value_1 + total_fee_msat) - (recv_value_2 + total_fee_msat);
4071+
let stat = get_channel_value_stat!(nodes[0], chan_1.2);
4072+
assert_eq!(stat.value_to_self_msat, expected_value_to_self);
4073+
assert_eq!(stat.value_to_self_msat, stat.channel_reserve_msat);
4074+
}
4075+
38384076
#[test]
38394077
fn channel_monitor_network_test() {
38404078
// Simple test which builds a network of ChannelManagers, connects them to each other, and

0 commit comments

Comments
 (0)