Add some logging to script_sync
This commit is contained in:
parent
aaad560a91
commit
5eadf5ccf9
@ -5,9 +5,11 @@ returns associated transactions i.e. electrum.
|
|||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
use crate::{
|
use crate::{
|
||||||
database::{BatchDatabase, BatchOperations, DatabaseUtils},
|
database::{BatchDatabase, BatchOperations, DatabaseUtils},
|
||||||
|
wallet::time::Instant,
|
||||||
ConfirmationTime, Error, KeychainKind, LocalUtxo, TransactionDetails,
|
ConfirmationTime, Error, KeychainKind, LocalUtxo, TransactionDetails,
|
||||||
};
|
};
|
||||||
use bitcoin::{OutPoint, Script, Transaction, TxOut, Txid};
|
use bitcoin::{OutPoint, Script, Transaction, TxOut, Txid};
|
||||||
|
use log::*;
|
||||||
use std::collections::{HashMap, HashSet, VecDeque};
|
use std::collections::{HashMap, HashSet, VecDeque};
|
||||||
|
|
||||||
/// A reqeust for on-chain information
|
/// A reqeust for on-chain information
|
||||||
@ -33,14 +35,7 @@ pub fn start<D: BatchDatabase>(db: &D, stop_gap: usize) -> Result<Request<'_, D>
|
|||||||
.iter_script_pubkeys(Some(keychain))?
|
.iter_script_pubkeys(Some(keychain))?
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.collect();
|
.collect();
|
||||||
let state = State {
|
let state = State::new(db);
|
||||||
db,
|
|
||||||
last_active_index: HashMap::default(),
|
|
||||||
conftime_needed: VecDeque::default(),
|
|
||||||
observed_txs: vec![],
|
|
||||||
tx_needed: VecDeque::default(),
|
|
||||||
tx_missing_conftime: HashMap::default(),
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(Request::Script(ScriptReq {
|
Ok(Request::Script(ScriptReq {
|
||||||
state,
|
state,
|
||||||
@ -76,7 +71,12 @@ impl<'a, D: BatchDatabase> ScriptReq<'a, D> {
|
|||||||
// we want to know the txids assoiciated with the script and their height
|
// we want to know the txids assoiciated with the script and their height
|
||||||
txids: Vec<Vec<(Txid, Option<u32>)>>,
|
txids: Vec<Vec<(Txid, Option<u32>)>>,
|
||||||
) -> Result<Request<'a, D>, Error> {
|
) -> Result<Request<'a, D>, Error> {
|
||||||
for txid_list in txids.iter() {
|
for (txid_list, script) in txids.iter().zip(self.scripts_needed.iter()) {
|
||||||
|
debug!(
|
||||||
|
"found {} transactions for script pubkey {}",
|
||||||
|
txid_list.len(),
|
||||||
|
script
|
||||||
|
);
|
||||||
if !txid_list.is_empty() {
|
if !txid_list.is_empty() {
|
||||||
// the address is active
|
// the address is active
|
||||||
self.state
|
self.state
|
||||||
@ -131,6 +131,10 @@ impl<'a, D: BatchDatabase> ScriptReq<'a, D> {
|
|||||||
if self.script_index > last_active_index + self.stop_gap
|
if self.script_index > last_active_index + self.stop_gap
|
||||||
|| self.scripts_needed.is_empty()
|
|| self.scripts_needed.is_empty()
|
||||||
{
|
{
|
||||||
|
debug!(
|
||||||
|
"finished scanning for transactions for keychain {:?} at index {}",
|
||||||
|
self.keychain, last_active_index
|
||||||
|
);
|
||||||
// we're done here -- check if we need to do the next keychain
|
// we're done here -- check if we need to do the next keychain
|
||||||
if let Some(keychain) = self.next_keychains.pop() {
|
if let Some(keychain) = self.next_keychains.pop() {
|
||||||
self.keychain = keychain;
|
self.keychain = keychain;
|
||||||
@ -154,11 +158,6 @@ impl<'a, D: BatchDatabase> ScriptReq<'a, D> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Next step is to get confirmation times for those we are interested in.
|
|
||||||
pub struct ConftimeReq<'a, D> {
|
|
||||||
state: State<'a, D>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Then we get full transactions
|
/// Then we get full transactions
|
||||||
pub struct TxReq<'a, D> {
|
pub struct TxReq<'a, D> {
|
||||||
state: State<'a, D>,
|
state: State<'a, D>,
|
||||||
@ -177,6 +176,7 @@ impl<'a, D: BatchDatabase> TxReq<'a, D> {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.zip(self.state.tx_needed.iter())
|
.zip(self.state.tx_needed.iter())
|
||||||
.map(|((vin, tx), txid)| {
|
.map(|((vin, tx), txid)| {
|
||||||
|
debug!("found tx_details for {}", txid);
|
||||||
assert_eq!(tx.txid(), *txid);
|
assert_eq!(tx.txid(), *txid);
|
||||||
let mut sent: u64 = 0;
|
let mut sent: u64 = 0;
|
||||||
let mut received: u64 = 0;
|
let mut received: u64 = 0;
|
||||||
@ -240,6 +240,11 @@ impl<'a, D: BatchDatabase> TxReq<'a, D> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Final step is to get confirmation times
|
||||||
|
pub struct ConftimeReq<'a, D> {
|
||||||
|
state: State<'a, D>,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, D: BatchDatabase> ConftimeReq<'a, D> {
|
impl<'a, D: BatchDatabase> ConftimeReq<'a, D> {
|
||||||
pub fn request(&self) -> impl Iterator<Item = &Txid> + Clone {
|
pub fn request(&self) -> impl Iterator<Item = &Txid> + Clone {
|
||||||
self.state.conftime_needed.iter()
|
self.state.conftime_needed.iter()
|
||||||
@ -252,6 +257,7 @@ impl<'a, D: BatchDatabase> ConftimeReq<'a, D> {
|
|||||||
let n = confirmation_times.len();
|
let n = confirmation_times.len();
|
||||||
let conftime_needed = self.state.conftime_needed.iter();
|
let conftime_needed = self.state.conftime_needed.iter();
|
||||||
for (confirmation_time, txid) in confirmation_times.into_iter().zip(conftime_needed) {
|
for (confirmation_time, txid) in confirmation_times.into_iter().zip(conftime_needed) {
|
||||||
|
debug!("confirmation time for {} was {:?}", txid, confirmation_time);
|
||||||
// this is written awkwardly to avoid lifetime issues with using cleaner .or_else
|
// this is written awkwardly to avoid lifetime issues with using cleaner .or_else
|
||||||
let mut tx_details = self.state.tx_missing_conftime.remove(txid);
|
let mut tx_details = self.state.tx_missing_conftime.remove(txid);
|
||||||
if tx_details.is_none() {
|
if tx_details.is_none() {
|
||||||
@ -283,10 +289,22 @@ struct State<'a, D> {
|
|||||||
conftime_needed: VecDeque<Txid>,
|
conftime_needed: VecDeque<Txid>,
|
||||||
observed_txs: Vec<TransactionDetails>,
|
observed_txs: Vec<TransactionDetails>,
|
||||||
tx_missing_conftime: HashMap<Txid, TransactionDetails>,
|
tx_missing_conftime: HashMap<Txid, TransactionDetails>,
|
||||||
|
start_time: Instant,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, D: BatchDatabase> State<'a, D> {
|
impl<'a, D: BatchDatabase> State<'a, D> {
|
||||||
pub fn into_db_update(self) -> Result<D::Batch, Error> {
|
fn new(db: &'a D) -> Self {
|
||||||
|
State {
|
||||||
|
db,
|
||||||
|
last_active_index: HashMap::default(),
|
||||||
|
conftime_needed: VecDeque::default(),
|
||||||
|
observed_txs: vec![],
|
||||||
|
tx_needed: VecDeque::default(),
|
||||||
|
tx_missing_conftime: HashMap::default(),
|
||||||
|
start_time: Instant::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn into_db_update(self) -> Result<D::Batch, Error> {
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
self.tx_needed.is_empty()
|
self.tx_needed.is_empty()
|
||||||
&& self.tx_missing_conftime.is_empty()
|
&& self.tx_missing_conftime.is_empty()
|
||||||
@ -356,6 +374,10 @@ impl<'a, D: BatchDatabase> State<'a, D> {
|
|||||||
batch.set_last_index(keychain, last_active_index as u32)?;
|
batch.set_last_index(keychain, last_active_index as u32)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"finished setup, elapsed {:?}ms",
|
||||||
|
self.start_time.elapsed().as_millis()
|
||||||
|
);
|
||||||
Ok(batch)
|
Ok(batch)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user