Skip to content

Commit f23517b

Browse files
committed
Add channel open operations benchmark
Add a channel-open benchmark that measures the open_channel call while leaving chain confirmation cleanup outside the timed section. AI-assisted-by: OpenAI Codex
1 parent 8e9fa64 commit f23517b

1 file changed

Lines changed: 94 additions & 3 deletions

File tree

benches/operations.rs

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ use std::time::{Duration, Instant};
1313

1414
use bitcoin::Amount;
1515
use common::{
16-
expect_event, generate_blocks_and_wait, premine_and_distribute_funds, random_config,
17-
setup_bitcoind_and_electrsd, setup_node,
16+
expect_channel_pending_event, expect_channel_ready_event, expect_event,
17+
generate_blocks_and_wait, premine_and_distribute_funds, random_chain_source, random_config,
18+
setup_bitcoind_and_electrsd, setup_node, setup_two_nodes_with_store,
1819
};
1920
use criterion::{criterion_group, criterion_main, Criterion};
20-
use electrsd::corepc_node::Node as BitcoinD;
21+
use electrsd::corepc_node::{Client as BitcoindClient, Node as BitcoinD};
2122
use ldk_node::{Event, Node};
2223
use lightning::ln::channelmanager::PaymentId;
2324
use lightning::routing::router::RouteParametersConfig;
@@ -35,6 +36,7 @@ fn operations_benchmark(c: &mut Criterion) {
3536
dotenvy::dotenv().ok();
3637

3738
forwarding_benchmark(c);
39+
channel_open_benchmark(c);
3840
}
3941

4042
fn forwarding_benchmark(c: &mut Criterion) {
@@ -75,6 +77,62 @@ fn forwarding_benchmark(c: &mut Criterion) {
7577
}
7678
}
7779

80+
fn channel_open_benchmark(c: &mut Criterion) {
81+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
82+
let chain_source = random_chain_source(&bitcoind, &electrsd);
83+
let runtime =
84+
tokio::runtime::Builder::new_multi_thread().worker_threads(4).enable_all().build().unwrap();
85+
86+
let mut group = c.benchmark_group("channel_open");
87+
group.sample_size(10);
88+
89+
for store_config in store_bench_configs() {
90+
if !should_register_bench("channel_open", store_config.name) {
91+
continue;
92+
}
93+
let (node_a, node_b) =
94+
setup_two_nodes_with_store(&chain_source, false, true, false, store_config.store_type);
95+
let node_a = Arc::new(node_a);
96+
let node_b = Arc::new(node_b);
97+
98+
runtime.block_on(async {
99+
let address_a = node_a.onchain_payment().new_address().unwrap();
100+
premine_and_distribute_funds(
101+
&bitcoind.client,
102+
&electrsd.client,
103+
vec![address_a],
104+
Amount::from_sat(35_000_000),
105+
)
106+
.await;
107+
node_a.sync_wallets().unwrap();
108+
});
109+
110+
let node_a = Arc::clone(&node_a);
111+
let node_b = Arc::clone(&node_b);
112+
113+
group.bench_function(store_config.name, |b| {
114+
b.iter_custom(|iter| {
115+
let node_a = Arc::clone(&node_a);
116+
let node_b = Arc::clone(&node_b);
117+
118+
runtime.block_on(async {
119+
let mut total = Duration::ZERO;
120+
for _ in 0..iter {
121+
total += open_channel(
122+
Arc::clone(&node_a),
123+
Arc::clone(&node_b),
124+
&bitcoind.client,
125+
&electrsd,
126+
)
127+
.await;
128+
}
129+
total
130+
})
131+
});
132+
});
133+
}
134+
}
135+
78136
fn should_register_bench(group: &str, name: &str) -> bool {
79137
let target = format!("{}/{}", group, name);
80138
let filters: Vec<String> =
@@ -299,6 +357,39 @@ fn route_parameters() -> RouteParametersConfig {
299357
}
300358
}
301359

360+
async fn open_channel(
361+
node_a: Arc<Node>, node_b: Arc<Node>, bitcoind: &BitcoindClient, electrsd: &electrsd::ElectrsD,
362+
) -> Duration {
363+
let start = Instant::now();
364+
365+
node_a
366+
.open_channel(
367+
node_b.node_id(),
368+
node_b.listening_addresses().unwrap().first().unwrap().clone(),
369+
100_000,
370+
None,
371+
None,
372+
)
373+
.unwrap();
374+
let duration = start.elapsed();
375+
376+
assert!(node_a.list_peers().iter().any(|peer| peer.node_id == node_b.node_id()));
377+
378+
let funding_txo_a = expect_channel_pending_event!(node_a, node_b.node_id());
379+
let funding_txo_b = expect_channel_pending_event!(node_b, node_a.node_id());
380+
assert_eq!(funding_txo_a, funding_txo_b);
381+
common::wait_for_tx(&electrsd.client, funding_txo_a.txid).await;
382+
383+
generate_blocks_and_wait(bitcoind, &electrsd.client, 6).await;
384+
node_a.sync_wallets().unwrap();
385+
node_b.sync_wallets().unwrap();
386+
387+
expect_channel_ready_event!(node_b, node_a.node_id());
388+
expect_channel_ready_event!(node_a, node_b.node_id());
389+
390+
duration
391+
}
392+
302393
async fn wait_for_payment_success(node: &Node, expected_payment_id: PaymentId) {
303394
loop {
304395
match node.next_event_async().await {

0 commit comments

Comments
 (0)