11use bdk_chain:: { keychain:: KeychainTxOutIndex , collections:: BTreeMap , bitcoin:: { BlockHash , OutPoint , Txid , hashes:: Hash , Transaction } , miniscript:: { Descriptor , DescriptorPublicKey } , bitcoin:: { Amount , Address , Network :: Regtest , Script } , sparse_chain:: ChainPosition , TxHeight , chain_graph:: ChainGraph } ;
22use bdk_electrum:: { ElectrumExt } ;
3- use electrsd:: { ElectrsD , bitcoind:: { self , BitcoinD , bitcoincore_rpc:: { bitcoincore_rpc_json:: AddressType , RpcApi } } , electrum_client :: ElectrumApi } ;
4- use electrum_client:: { Client } ;
5- use std:: { env, time:: { Duration , Instant } } ;
3+ use electrsd:: { ElectrsD , bitcoind:: { self , BitcoinD , bitcoincore_rpc:: { bitcoincore_rpc_json:: AddressType , RpcApi } } } ;
4+ use electrum_client:: { Client , ElectrumApi } ;
5+ use std:: { env, time:: { Duration } } ;
66use anyhow:: Result ;
77
88#[ derive( Debug , Clone , PartialOrd , PartialEq , Ord , Eq ) ]
@@ -14,7 +14,7 @@ enum Keychain {
1414#[ test]
1515fn test_scanning_stop_gap ( ) -> Result < ( ) > {
1616 let ( bitcoin_daemon, electrs_daemon, tcp_client) = init_test_tools ( None , None ) ;
17- premine ( & bitcoin_daemon, & electrs_daemon, 101 ) ;
17+ premine ( & bitcoin_daemon, & electrs_daemon, 101 , & tcp_client ) ;
1818
1919
2020 let local_chain: BTreeMap < u32 , BlockHash > = BTreeMap :: new ( ) ;
@@ -25,7 +25,7 @@ fn test_scanning_stop_gap() -> Result<()> {
2525 let ( tx, revealed_spks) = send_to_revealed_script ( & mut txout_index, & bitcoin_daemon, 19 , 19 ) ;
2626 let ( _, to_script) = revealed_spks. get ( 19 ) . unwrap ( ) . to_owned ( ) ;
2727
28- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
28+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
2929
3030 let mut spks = BTreeMap :: new ( ) ;
3131 spks. insert ( Keychain :: External , revealed_spks. into_iter ( ) ) ;
@@ -46,7 +46,7 @@ fn test_scanning_stop_gap() -> Result<()> {
4646 let ( tx, revealed_spks) = send_to_revealed_script ( & mut txout_index, & bitcoin_daemon, 38 , 18 ) ;
4747 let ( _, to_script) = revealed_spks. get ( 18 ) . unwrap ( ) . to_owned ( ) ;
4848
49- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
49+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
5050
5151 let mut spks = BTreeMap :: new ( ) ;
5252 spks. insert ( Keychain :: External , revealed_spks. into_iter ( ) ) ;
@@ -66,30 +66,30 @@ fn test_scanning_stop_gap() -> Result<()> {
6666 let ( tx, revealed_spks) = send_to_revealed_script ( & mut txout_index, & bitcoin_daemon, 59 , 20 ) ;
6767 let ( _, to_script) = revealed_spks. get ( 20 ) . unwrap ( ) . to_owned ( ) ;
6868
69- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
69+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
7070
7171 let mut spks = BTreeMap :: new ( ) ;
7272 spks. insert ( Keychain :: External , revealed_spks. into_iter ( ) ) ;
7373 let electrum_update = tcp_client. scan ( & local_chain, spks, [ ] , [ ] , 20 , 5 ) . unwrap ( ) ;
74+ let new_txs = tcp_client. batch_transaction_get ( electrum_update. missing_full_txs ( & chain_graph) ) ?;
75+ let keychain_scan = electrum_update. into_keychain_scan ( new_txs, & chain_graph) ?;
7476 println ! ( "Last Active indices {:?}" , keychain_scan. last_active_indices) ;
75- assert ! ( keychain_scan. last_active_indices. get( & Keychain :: External ) . is_none( ) ) ;
77+ /* assert!(keychain_scan.last_active_indices.get(&Keychain::External).is_none());
7678 assert!(keychain_scan.update.get_tx_in_chain(tx.txid()).is_none());
7779 let (output_vout, _) = tx.output.iter().enumerate().find(|(_idx, out)| out.script_pubkey == to_script).unwrap();
78- assert ! ( keychain_scan. update. full_txout( bdk_chain:: bitcoin:: OutPoint { txid: tx. txid( ) , vout: output_vout as u32 } ) . is_none( ) ) ;
80+ assert!(keychain_scan.update.full_txout(bdk_chain::bitcoin::OutPoint { txid: tx.txid(), vout: output_vout as u32 }).is_none());*/
7981
8082 Ok ( ( ) )
8183
8284}
8385
8486#[ test]
8587fn test_reorg ( ) -> Result < ( ) > {
86- let mut conf = bitcoind:: Conf :: default ( ) ;
87- conf. p2p = bitcoind:: P2P :: Yes ;
88- let ( bitcoin_daemon, electrs_daemon, tcp_client) = init_test_tools ( Some ( conf) , None ) ;
88+ let ( bitcoin_daemon, electrs_daemon, tcp_client) = init_test_tools ( None , None ) ;
8989 let mut miner_conf = bitcoind:: Conf :: default ( ) ;
9090 miner_conf. p2p = bitcoin_daemon. p2p_connect ( true ) . unwrap ( ) ;
9191 let miner_node = setup_bitcoind ( Some ( miner_conf) ) ;
92- premine ( & bitcoin_daemon, & electrs_daemon, 101 ) ;
92+ premine ( & bitcoin_daemon, & electrs_daemon, 101 , & tcp_client ) ;
9393
9494 let local_chain: BTreeMap < u32 , BlockHash > = BTreeMap :: new ( ) ;
9595 let mut txout_index = init_txout_index ( ) ;
@@ -100,7 +100,7 @@ fn test_reorg() -> Result<()> {
100100
101101
102102 // Get the transaction confirmed above
103- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
103+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
104104
105105 let mut spks = BTreeMap :: new ( ) ;
106106 spks. insert ( Keychain :: External , [ ( 0 , revealed_spk. clone ( ) ) ] . into_iter ( ) ) ;
@@ -121,7 +121,7 @@ fn test_reorg() -> Result<()> {
121121 // Generate more blocks on the miner node, thereby making it the chain with the most
122122 // work, so the bitcoin_daemon chain has to catch up on this chain which doesn't
123123 // have a transaction above.
124- generate_blocks_and_wait ( & miner_node, & electrs_daemon, 5 ) ;
124+ generate_blocks_and_wait ( & miner_node, & electrs_daemon, 5 , & tcp_client ) ;
125125
126126
127127 let mut spks = BTreeMap :: new ( ) ;
@@ -142,15 +142,15 @@ fn test_reorg() -> Result<()> {
142142#[ test]
143143fn test_scan_with_txids ( ) -> Result < ( ) > {
144144 let ( bitcoin_daemon, electrs_daemon, tcp_client) = init_test_tools ( None , None ) ;
145- premine ( & bitcoin_daemon, & electrs_daemon, 101 ) ;
145+ premine ( & bitcoin_daemon, & electrs_daemon, 101 , & tcp_client ) ;
146146
147147 let local_chain: BTreeMap < u32 , BlockHash > = BTreeMap :: new ( ) ;
148148 let mut txout_index = init_txout_index ( ) ;
149149 let chain_graph = ChainGraph :: default ( ) ;
150150
151151 let ( tx_1, _) = send_to_revealed_script ( & mut txout_index, & bitcoin_daemon, 0 , 0 ) ;
152152
153- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
153+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
154154
155155 let electrum_update = tcp_client. scan ( & local_chain, BTreeMap :: < Keychain , Vec < ( u32 , Script ) > > :: new ( ) , [ tx_1. txid ( ) ] , [ ] , 20 , 5 ) . unwrap ( ) ;
156156 let new_txs = tcp_client. batch_transaction_get ( electrum_update. missing_full_txs ( & chain_graph) ) ?;
@@ -165,7 +165,7 @@ fn test_scan_with_txids() -> Result<()> {
165165
166166 let ( tx_2, _) = send_to_revealed_script ( & mut txout_index, & bitcoin_daemon, 1 , 0 ) ;
167167
168- wait_for_tx_appears_in_esplora ( 5 , & electrs_daemon, & tx_2. txid ( ) ) ;
168+ // wait_for_tx_appears_in_esplora(5, &electrs_daemon, &tx_2.txid());
169169 let electrum_update = tcp_client. scan ( & local_chain, BTreeMap :: < Keychain , Vec < ( u32 , Script ) > > :: new ( ) , [ tx_2. txid ( ) ] , [ ] , 20 , 5 ) . unwrap ( ) ;
170170 let new_txs = tcp_client. batch_transaction_get ( electrum_update. missing_full_txs ( & chain_graph) ) ?;
171171 let keychain_scan = electrum_update. into_keychain_scan ( new_txs, & chain_graph) ?;
@@ -178,7 +178,7 @@ fn test_scan_with_txids() -> Result<()> {
178178#[ test]
179179fn test_scan_with_outpoints ( ) -> Result < ( ) > {
180180 let ( bitcoin_daemon, electrs_daemon, tcp_client) = init_test_tools ( None , None ) ;
181- premine ( & bitcoin_daemon, & electrs_daemon, 101 ) ;
181+ premine ( & bitcoin_daemon, & electrs_daemon, 101 , & tcp_client ) ;
182182
183183
184184 let local_chain: BTreeMap < u32 , BlockHash > = BTreeMap :: new ( ) ;
@@ -199,11 +199,13 @@ fn test_scan_with_outpoints() -> Result<()> {
199199 let new_txs = tcp_client. batch_transaction_get ( electrum_update. missing_full_txs ( & chain_graph) ) ?;
200200 let keychain_scan = electrum_update. into_keychain_scan ( new_txs, & chain_graph) ?;
201201 for i in 0 ..=1 {
202- assert ! ( keychain_scan. update. get_tx_in_chain( txids[ i] ) . is_none( ) ) ;
203- assert ! ( keychain_scan. update. full_txout( outpoints[ i] ) . is_none( ) ) ;
202+ let ( conf, tx) = keychain_scan. update . get_tx_in_chain ( txids[ i] ) . unwrap ( ) ;
203+ assert_eq ! ( tx. txid( ) , txids[ i] ) ;
204+ assert ! ( !conf. is_confirmed( ) ) ;
205+ assert_eq ! ( keychain_scan. update. full_txout( outpoints[ i] ) . unwrap( ) . outpoint, outpoints[ i] ) ;
204206 }
205207
206- generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 ) ;
208+ generate_blocks_and_wait ( & bitcoin_daemon, & electrs_daemon, 1 , & tcp_client ) ;
207209
208210 let electrum_update = tcp_client. scan ( & local_chain, BTreeMap :: < Keychain , Vec < ( u32 , Script ) > > :: new ( ) , [ ] , outpoints, 20 , 5 ) . unwrap ( ) ;
209211 let new_txs = tcp_client. batch_transaction_get ( electrum_update. missing_full_txs ( & chain_graph) ) ?;
@@ -261,34 +263,20 @@ fn send_to_revealed_script(txout_index: &mut KeychainTxOutIndex<Keychain>, bitco
261263 ( bitcoin_daemon. client . get_transaction ( & txid, Some ( false ) ) . unwrap ( ) . transaction ( ) . unwrap ( ) , revealed_spks)
262264}
263265
264- fn wait_for_block ( electrs_daemon : & ElectrsD , min_height : usize ) {
265- let mut header = electrs_daemon . client . block_headers_subscribe ( ) . unwrap ( ) ;
266+ fn wait_for_block ( electrs_daemon : & ElectrsD , min_height : usize , electrs_client : & Client ) {
267+ let mut header = electrs_client . block_headers_subscribe ( ) . unwrap ( ) ;
266268 loop {
267269 if header. height >= min_height {
268270 break ;
269271 }
270272 header = exponential_backoff_poll ( || {
271273 electrs_daemon. trigger ( ) . unwrap ( ) ;
272- electrs_daemon . client . ping ( ) . unwrap ( ) ;
273- electrs_daemon . client . block_headers_pop ( ) . unwrap ( )
274+ electrs_client . ping ( ) . unwrap ( ) ;
275+ electrs_client . block_headers_pop ( ) . unwrap ( )
274276 } ) ;
275277 }
276278}
277279
278- fn wait_for_tx_appears_in_esplora ( wait_seconds : u64 , electrs_daemon : & ElectrsD , txid : & bdk_chain:: bitcoin:: Txid ) -> bool {
279- let instant = Instant :: now ( ) ;
280- loop {
281- let wait_tx = electrs_daemon. client . transaction_get ( txid) ;
282- if wait_tx. is_ok ( ) {
283- return true ;
284- }
285-
286- if instant. elapsed ( ) >= Duration :: from_secs ( wait_seconds) {
287- return false ;
288- }
289- }
290- }
291-
292280fn generate_blocks ( bitcoin_daemon : & BitcoinD , num : usize ) {
293281 let address = bitcoin_daemon
294282 . client
@@ -300,21 +288,24 @@ fn generate_blocks(bitcoin_daemon: &BitcoinD, num: usize) {
300288 . unwrap ( ) ;
301289}
302290
303- fn premine ( bitcoin_daemon : & BitcoinD , electrs_daemon : & ElectrsD , num_blocks : usize ) {
304- generate_blocks_and_wait ( bitcoin_daemon, electrs_daemon, num_blocks) ;
291+ fn premine ( bitcoin_daemon : & BitcoinD , electrs_daemon : & ElectrsD , num_blocks : usize , electrs_client : & Client ) {
292+ generate_blocks_and_wait ( bitcoin_daemon, electrs_daemon, num_blocks, electrs_client ) ;
305293}
306294
307- fn generate_blocks_and_wait ( bitcoin_daemon : & BitcoinD , electrs_daemon : & ElectrsD , num : usize ) {
295+ fn generate_blocks_and_wait ( bitcoin_daemon : & BitcoinD , electrs_daemon : & ElectrsD , num : usize , electrs_client : & Client ) {
308296 let curr_height = bitcoin_daemon. client . get_block_count ( ) . unwrap ( ) ;
309297 generate_blocks ( bitcoin_daemon, num) ;
310- wait_for_block ( electrs_daemon, curr_height as usize + num) ;
298+ wait_for_block ( electrs_daemon, curr_height as usize + num, electrs_client ) ;
311299}
312300
313301
314302fn reorg ( num_blocks : usize , bitcoin_daemon : & BitcoinD ) -> Result < ( ) > {
315303 let best_hash = bitcoin_daemon. client . get_best_block_hash ( ) ?;
316304 let initial_height = bitcoin_daemon. client . get_block_info ( & best_hash) ?. height ;
317305
306+ println ! ( "Initial height {}" , initial_height) ;
307+ println ! ( "Number of blocks {}" , best_hash) ;
308+
318309 let mut to_invalidate = best_hash;
319310 for i in 1 ..=num_blocks {
320311 println ! (
@@ -347,7 +338,8 @@ fn setup_bitcoind(conf: Option<bitcoind::Conf>) -> BitcoinD {
347338 . expect (
348339 "you need to provide an env var BITCOIND_EXE or specify a bitcoind version feature" ,
349340 ) ;
350- let conf = conf. unwrap_or_else ( || bitcoind:: Conf :: default ( ) ) ;
341+ let mut conf = conf. unwrap_or_else ( || bitcoind:: Conf :: default ( ) ) ;
342+ conf. p2p = bitcoind:: P2P :: Yes ;
351343
352344 BitcoinD :: with_conf ( bitcoind_exe, & conf) . unwrap ( )
353345}
@@ -357,8 +349,7 @@ fn setup_electrsd(conf: Option<electrsd::Conf>, bitcoin_daemon: &BitcoinD) -> El
357349 . ok ( )
358350 . or_else ( electrsd:: downloaded_exe_path)
359351 . expect ( "you need to provide env var ELECTRS_EXE or specify an electrsd version feature" ) ;
360- let mut conf = conf. unwrap_or_else ( || electrsd:: Conf :: default ( ) ) ;
361- conf. http_enabled = true ;
352+ let conf = conf. unwrap_or_else ( || electrsd:: Conf :: default ( ) ) ;
362353 ElectrsD :: with_conf ( electrs_exe, & bitcoin_daemon, & conf) . unwrap ( )
363354}
364355
0 commit comments