@@ -13,11 +13,12 @@ use std::time::{Duration, Instant};
1313
1414use bitcoin:: Amount ;
1515use 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} ;
1920use 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 } ;
2122use ldk_node:: { Event , Node } ;
2223use lightning:: ln:: channelmanager:: PaymentId ;
2324use 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
4042fn 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+
78136fn 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+
302393async fn wait_for_payment_success ( node : & Node , expected_payment_id : PaymentId ) {
303394 loop {
304395 match node. next_event_async ( ) . await {
0 commit comments