Skip to content

Commit 300d171

Browse files
committed
Shakedown zero reserve channels
1 parent 0fcc0f9 commit 300d171

File tree

2 files changed

+272
-1
lines changed

2 files changed

+272
-1
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,6 +1659,109 @@ pub fn exchange_open_accept_zero_conf_chan<'a, 'b, 'c, 'd>(
16591659
accept_channel.common_fields.temporary_channel_id
16601660
}
16611661

1662+
pub fn exchange_open_accept_zero_reserve_chan<'a, 'b, 'c, 'd>(
1663+
initiator: &'a Node<'b, 'c, 'd>, receiver: &'a Node<'b, 'c, 'd>, channel_value_sat: u64,
1664+
push_msat: u64,
1665+
) -> ChannelId {
1666+
let receiver_node_id = receiver.node.get_our_node_id();
1667+
let initiator_node_id = initiator.node.get_our_node_id();
1668+
1669+
initiator
1670+
.node
1671+
.create_channel(receiver_node_id, channel_value_sat, push_msat, 42, None, None)
1672+
.unwrap();
1673+
let open_channel =
1674+
get_event_msg!(initiator, MessageSendEvent::SendOpenChannel, receiver_node_id);
1675+
1676+
receiver.node.handle_open_channel(initiator_node_id, &open_channel);
1677+
let events = receiver.node.get_and_clear_pending_events();
1678+
assert_eq!(events.len(), 1);
1679+
match events[0] {
1680+
Event::OpenChannelRequest { temporary_channel_id, .. } => {
1681+
receiver
1682+
.node
1683+
.accept_inbound_channel_from_trusted_peer(
1684+
&temporary_channel_id,
1685+
&initiator_node_id,
1686+
0,
1687+
false,
1688+
true,
1689+
None,
1690+
)
1691+
.unwrap();
1692+
},
1693+
_ => panic!("Unexpected event"),
1694+
};
1695+
1696+
let accept_channel =
1697+
get_event_msg!(receiver, MessageSendEvent::SendAcceptChannel, initiator_node_id);
1698+
assert_eq!(accept_channel.channel_reserve_satoshis, 0);
1699+
initiator.node.handle_accept_channel(receiver_node_id, &accept_channel);
1700+
1701+
accept_channel.common_fields.temporary_channel_id
1702+
}
1703+
1704+
pub fn create_zero_reserve_chan_between_nodes_with_value_init<'a, 'b, 'c>(
1705+
node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a, 'b, 'c>, channel_value: u64, push_msat: u64,
1706+
) -> Transaction {
1707+
let create_chan_id =
1708+
exchange_open_accept_zero_reserve_chan(node_a, node_b, channel_value, push_msat);
1709+
sign_funding_transaction(node_a, node_b, channel_value, create_chan_id)
1710+
}
1711+
1712+
pub fn create_zero_reserve_chan_between_nodes_with_value_a<'a, 'b, 'c: 'd, 'd>(
1713+
node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64,
1714+
) -> ((msgs::ChannelReady, msgs::AnnouncementSignatures), ChannelId, Transaction) {
1715+
let tx = create_zero_reserve_chan_between_nodes_with_value_init(
1716+
node_a,
1717+
node_b,
1718+
channel_value,
1719+
push_msat,
1720+
);
1721+
let (msgs, chan_id) = create_chan_between_nodes_with_value_confirm(node_a, node_b, &tx);
1722+
(msgs, chan_id, tx)
1723+
}
1724+
1725+
pub fn create_zero_reserve_chan_between_nodes_with_value<'a, 'b, 'c: 'd, 'd>(
1726+
node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64,
1727+
) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate, ChannelId, Transaction) {
1728+
let (channel_ready, channel_id, tx) = create_zero_reserve_chan_between_nodes_with_value_a(
1729+
node_a,
1730+
node_b,
1731+
channel_value,
1732+
push_msat,
1733+
);
1734+
let (announcement, as_update, bs_update) =
1735+
create_chan_between_nodes_with_value_b(node_a, node_b, &channel_ready);
1736+
(announcement, as_update, bs_update, channel_id, tx)
1737+
}
1738+
1739+
pub fn create_announced_zero_reserve_chan_between_nodes_with_value<'a, 'b, 'c: 'd, 'd>(
1740+
nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize, channel_value: u64, push_msat: u64,
1741+
) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, ChannelId, Transaction) {
1742+
let chan_announcement = create_zero_reserve_chan_between_nodes_with_value(
1743+
&nodes[a],
1744+
&nodes[b],
1745+
channel_value,
1746+
push_msat,
1747+
);
1748+
update_nodes_with_chan_announce(
1749+
nodes,
1750+
a,
1751+
b,
1752+
&chan_announcement.0,
1753+
&chan_announcement.1,
1754+
&chan_announcement.2,
1755+
);
1756+
(chan_announcement.1, chan_announcement.2, chan_announcement.3, chan_announcement.4)
1757+
}
1758+
1759+
pub fn create_announced_zero_reserve_chan_between_nodes<'a, 'b, 'c: 'd, 'd>(
1760+
nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize,
1761+
) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, ChannelId, Transaction) {
1762+
create_announced_zero_reserve_chan_between_nodes_with_value(nodes, a, b, 100000, 10001)
1763+
}
1764+
16621765
pub fn open_zero_conf_channel_with_value<'a, 'b, 'c, 'd>(
16631766
initiator: &'a Node<'b, 'c, 'd>, receiver: &'a Node<'b, 'c, 'd>,
16641767
initiator_config: Option<UserConfig>, channel_value_sat: u64, push_msat: u64,

lightning/src/ln/htlc_reserve_unit_tests.rs

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::ln::functional_test_utils::*;
1414
use crate::ln::msgs::{self, BaseMessageHandler, ChannelMessageHandler, MessageSendEvent};
1515
use crate::ln::onion_utils::{self, AttributionData};
1616
use crate::ln::outbound_payment::RecipientOnionFields;
17-
use crate::routing::router::PaymentParameters;
17+
use crate::routing::router::{PaymentParameters, RouteParameters};
1818
use crate::sign::ecdsa::EcdsaChannelSigner;
1919
use crate::sign::tx_builder::{SpecTxBuilder, TxBuilder};
2020
use crate::types::features::ChannelTypeFeatures;
@@ -2438,3 +2438,171 @@ pub fn do_test_dust_limit_fee_accounting(can_afford: bool) {
24382438
check_added_monitors(&nodes[1], 3);
24392439
}
24402440
}
2441+
2442+
#[test]
2443+
fn test_create_channel_to_trusted_peer() {
2444+
let chanmon_cfgs = create_chanmon_cfgs(2);
2445+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
2446+
let mut config = test_default_channel_config();
2447+
config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = 100;
2448+
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = false;
2449+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[Some(config), None]);
2450+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
2451+
2452+
let node_a_id = nodes[0].node.get_our_node_id();
2453+
let node_b_id = nodes[1].node.get_our_node_id();
2454+
2455+
let feerate_per_kw = 253;
2456+
let channel_type_features = ChannelTypeFeatures::only_static_remote_key();
2457+
2458+
let default_config = UserConfig::default();
2459+
2460+
let mut push_amt = 100_000_000;
2461+
push_amt -= chan_utils::commit_tx_fee_sat(
2462+
feerate_per_kw,
2463+
MIN_AFFORDABLE_HTLC_COUNT,
2464+
&channel_type_features,
2465+
) * 1000;
2466+
push_amt -= get_holder_selected_channel_reserve_satoshis(100_000, &default_config) * 1000;
2467+
2468+
let temp_channel_id = nodes[0]
2469+
.node
2470+
.create_channel_to_trusted_peer(node_b_id, 100_000, push_amt, 42, None, None)
2471+
.unwrap();
2472+
let mut open_channel_message =
2473+
get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, node_b_id);
2474+
2475+
handle_and_accept_open_channel(&nodes[1], node_a_id, &open_channel_message);
2476+
2477+
let mut accept_channel_message =
2478+
get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, node_a_id);
2479+
2480+
nodes[0].node.handle_accept_channel(node_b_id, &accept_channel_message);
2481+
2482+
let funding_tx = sign_funding_transaction(&nodes[0], &nodes[1], 100_000, temp_channel_id);
2483+
let funding_msgs =
2484+
create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &funding_tx);
2485+
create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &funding_msgs.0);
2486+
2487+
send_payment(&nodes[1], &[&nodes[0]], push_amt);
2488+
}
2489+
2490+
#[test]
2491+
fn test_accept_inbound_channel_from_trusted_peer_0reserve() {
2492+
let chanmon_cfgs = create_chanmon_cfgs(2);
2493+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
2494+
let mut config = test_default_channel_config();
2495+
config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = 100;
2496+
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = false;
2497+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(config)]);
2498+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
2499+
2500+
let initial_channel_value_sat = 100_000;
2501+
let (_, _, chan_id, _) = create_announced_zero_reserve_chan_between_nodes_with_value(
2502+
&nodes,
2503+
0,
2504+
1,
2505+
initial_channel_value_sat,
2506+
0,
2507+
);
2508+
2509+
let channel_type = ChannelTypeFeatures::only_static_remote_key();
2510+
2511+
let delta = chan_utils::commit_tx_fee_sat(
2512+
253 * FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE as u32,
2513+
2,
2514+
&channel_type,
2515+
);
2516+
2517+
let _ = send_payment(&nodes[0], &[&nodes[1]], (100_000 - delta) * 1000);
2518+
2519+
{
2520+
let per_peer_state_lock;
2521+
let mut peer_state_lock;
2522+
let chan =
2523+
get_channel_ref!(nodes[1], nodes[0], per_peer_state_lock, peer_state_lock, chan_id);
2524+
assert_eq!(chan.funding().holder_selected_channel_reserve_satoshis, 0);
2525+
}
2526+
}
2527+
2528+
#[test]
2529+
fn test_zero_reserve_no_outputs() {
2530+
let chanmon_cfgs = create_chanmon_cfgs(2);
2531+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
2532+
let mut config = test_default_channel_config();
2533+
config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = 100;
2534+
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = false;
2535+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(config)]);
2536+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
2537+
let channel_type = ChannelTypeFeatures::only_static_remote_key();
2538+
2539+
let node_a_id = nodes[0].node.get_our_node_id();
2540+
let node_b_id = nodes[1].node.get_our_node_id();
2541+
2542+
nodes[0].node.create_channel(node_b_id, 1000 + 2, 0, 42, None, None).unwrap();
2543+
let mut open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, node_b_id);
2544+
open_channel.common_fields.max_htlc_value_in_flight_msat = 1_000_000;
2545+
open_channel.common_fields.dust_limit_satoshis = 546;
2546+
nodes[1].node.handle_open_channel(node_a_id, &open_channel);
2547+
let events = nodes[1].node.get_and_clear_pending_events();
2548+
assert_eq!(events.len(), 1);
2549+
match events[0] {
2550+
Event::OpenChannelRequest { temporary_channel_id: chan_id, .. } => {
2551+
nodes[1]
2552+
.node
2553+
.accept_inbound_channel_from_trusted_peer(
2554+
&chan_id, &node_a_id, 0, false, true, None,
2555+
)
2556+
.unwrap();
2557+
},
2558+
_ => panic!("Unexpected event"),
2559+
};
2560+
2561+
nodes[0].node.handle_accept_channel(
2562+
node_b_id,
2563+
&get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, node_a_id),
2564+
);
2565+
2566+
let (chan_id, tx, _) = create_funding_transaction(&nodes[0], &node_b_id, 1000 + 2, 42);
2567+
2568+
{
2569+
let mut per_peer_lock;
2570+
let mut peer_state_lock;
2571+
let channel = get_channel_ref!(nodes[0], nodes[1], per_peer_lock, peer_state_lock, chan_id);
2572+
if let Some(mut chan) = channel.as_unfunded_outbound_v1_mut() {
2573+
chan.context.holder_dust_limit_satoshis = 546;
2574+
} else {
2575+
panic!("Unexpected Channel phase");
2576+
}
2577+
}
2578+
2579+
nodes[0].node.funding_transaction_generated(chan_id, node_b_id, tx.clone()).unwrap();
2580+
nodes[1].node.handle_funding_created(
2581+
node_a_id,
2582+
&get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, node_b_id),
2583+
);
2584+
check_added_monitors(&nodes[1], 1);
2585+
expect_channel_pending_event(&nodes[1], &node_a_id);
2586+
2587+
nodes[0].node.handle_funding_signed(
2588+
node_b_id,
2589+
&get_event_msg!(nodes[1], MessageSendEvent::SendFundingSigned, node_a_id),
2590+
);
2591+
check_added_monitors(&nodes[0], 1);
2592+
expect_channel_pending_event(&nodes[0], &node_b_id);
2593+
2594+
let (channel_ready, _channel_id) =
2595+
create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
2596+
let (announcement, as_update, bs_update) =
2597+
create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &channel_ready);
2598+
update_nodes_with_chan_announce(&nodes, 0, 1, &announcement, &as_update, &bs_update);
2599+
2600+
let delta = chan_utils::commit_tx_fee_sat(253 * 2, 2, &channel_type);
2601+
//let _ = send_payment(&nodes[0], &[&nodes[1]], delta * 1000);
2602+
2603+
let payment_params =
2604+
PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV);
2605+
2606+
let route_params = RouteParameters::from_payment_params_and_value(payment_params, delta * 1000);
2607+
assert!(get_route(&nodes[0], &route_params).is_err());
2608+
}

0 commit comments

Comments
 (0)