@@ -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 ;
@@ -33,6 +34,7 @@ struct StoreBenchConfig {
3334
3435fn operations_benchmark ( c : & mut Criterion ) {
3536 forwarding_benchmark ( c) ;
37+ channel_open_benchmark ( c) ;
3638}
3739
3840fn 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+
76134fn 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+
300391async fn wait_for_payment_success ( node : & Node , expected_payment_id : PaymentId ) {
301392 loop {
302393 match node. next_event_async ( ) . await {
0 commit comments