]> Untitled Git - bdk/commitdiff
feat: update logging of electrum examples
author志宇 <hello@evanlinjin.me>
Sat, 4 May 2024 11:27:11 +0000 (19:27 +0800)
committer志宇 <hello@evanlinjin.me>
Fri, 10 May 2024 06:54:28 +0000 (14:54 +0800)
* Syncing with `example_electrum` now shows progress as a percentage.
* Flush stdout more aggressively.

example-crates/example_electrum/src/main.rs
example-crates/wallet_electrum/src/main.rs

index d321ded7ea76dd06f112c5f90c5e75b72b340fd0..58474668f5a95a609840dc101a9859427b5cdf24 100644 (file)
@@ -180,11 +180,11 @@ fn main() -> anyhow::Result<()> {
                         let mut once = BTreeSet::new();
                         move |k, spk_i, _| {
                             if once.insert(k) {
-                                eprint!("\nScanning {}: ", k);
+                                eprint!("\nScanning {}: {} ", k, spk_i);
                             } else {
                                 eprint!("{} ", spk_i);
                             }
-                            let _ = io::stdout().flush();
+                            io::stdout().flush().expect("must flush");
                         }
                     })
             };
@@ -229,7 +229,7 @@ fn main() -> anyhow::Result<()> {
                     .map(|(k, i, spk)| (k.to_owned(), i, spk.to_owned()))
                     .collect::<Vec<_>>();
                 request = request.chain_spks(all_spks.into_iter().map(|(k, spk_i, spk)| {
-                    eprintln!("scanning {}: {}", k, spk_i);
+                    eprint!("Scanning {}: {}", k, spk_i);
                     spk
                 }));
             }
@@ -241,7 +241,7 @@ fn main() -> anyhow::Result<()> {
                     .collect::<Vec<_>>();
                 request =
                     request.chain_spks(unused_spks.into_iter().map(move |(k, spk_i, spk)| {
-                        eprintln!(
+                        eprint!(
                             "Checking if address {} {}:{} has been used",
                             Address::from_script(&spk, args.network).unwrap(),
                             k,
@@ -260,7 +260,7 @@ fn main() -> anyhow::Result<()> {
                     .map(|(_, utxo)| utxo)
                     .collect::<Vec<_>>();
                 request = request.chain_outpoints(utxos.into_iter().map(|utxo| {
-                    eprintln!(
+                    eprint!(
                         "Checking if outpoint {} (value: {}) has been spent",
                         utxo.outpoint, utxo.txout.value
                     );
@@ -279,10 +279,36 @@ fn main() -> anyhow::Result<()> {
                 request = request.chain_txids(
                     unconfirmed_txids
                         .into_iter()
-                        .inspect(|txid| eprintln!("Checking if {} is confirmed yet", txid)),
+                        .inspect(|txid| eprint!("Checking if {} is confirmed yet", txid)),
                 );
             }
 
+            let total_spks = request.spks.len();
+            let total_txids = request.txids.len();
+            let total_ops = request.outpoints.len();
+            request = request
+                .inspect_spks({
+                    let mut visited = 0;
+                    move |_| {
+                        visited += 1;
+                        eprintln!(" [ {:>6.2}% ]", (visited * 100) as f32 / total_spks as f32)
+                    }
+                })
+                .inspect_txids({
+                    let mut visited = 0;
+                    move |_| {
+                        visited += 1;
+                        eprintln!(" [ {:>6.2}% ]", (visited * 100) as f32 / total_txids as f32)
+                    }
+                })
+                .inspect_outpoints({
+                    let mut visited = 0;
+                    move |_| {
+                        visited += 1;
+                        eprintln!(" [ {:>6.2}% ]", (visited * 100) as f32 / total_ops as f32)
+                    }
+                });
+
             let res = client
                 .sync(request, scan_options.batch_size)
                 .context("scanning the blockchain")?;
index bdbf32120207449ec891c9b76ad8dc3e6a385463..e1fe009847b574b12f97e2233fd17958ee47ad05 100644 (file)
@@ -3,6 +3,7 @@ const SEND_AMOUNT: Amount = Amount::from_sat(5000);
 const STOP_GAP: usize = 50;
 const BATCH_SIZE: usize = 5;
 
+use std::io::Write;
 use std::str::FromStr;
 
 use bdk::bitcoin::{Address, Amount};
@@ -38,13 +39,19 @@ fn main() -> Result<(), anyhow::Error> {
     print!("Syncing...");
     let client = electrum_client::Client::new("ssl://electrum.blockstream.info:60002")?;
 
-    let request = wallet.start_full_scan().inspect_spks_for_all_keychains({
-        let mut once = HashSet::<KeychainKind>::new();
-        move |k, spk_i, _| match once.insert(k) {
-            true => print!("\nScanning keychain [{:?}]", k),
-            false => print!(" {:<3}", spk_i),
-        }
-    });
+    let request = wallet
+        .start_full_scan()
+        .inspect_spks_for_all_keychains({
+            let mut once = HashSet::<KeychainKind>::new();
+            move |k, spk_i, _| {
+                if once.insert(k) {
+                    print!("\nScanning keychain [{:?}]", k)
+                } else {
+                    print!(" {:<3}", spk_i)
+                }
+            }
+        })
+        .inspect_spks_for_all_keychains(|_, _, _| std::io::stdout().flush().expect("must flush"));
 
     let mut update = client
         .full_scan(request, STOP_GAP, BATCH_SIZE)?