Skip to content

Commit bd06c80

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 e294f87 commit bd06c80

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;
@@ -33,6 +34,7 @@ struct StoreBenchConfig {
3334

3435
fn operations_benchmark(c: &mut Criterion) {
3536
forwarding_benchmark(c);
37+
channel_open_benchmark(c);
3638
}
3739

3840
fn forwarding_benchmark(c: &mut Criterion) {
@@ -73,6 +75,62 @@ fn forwarding_benchmark(c: &mut Criterion) {
7375
}
7476
}
7577

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

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

0 commit comments

Comments
 (0)