[verify] Cache txs to avoid multiple db/network lookups
This commit is contained in:
parent
7873dd5e40
commit
a67aca32c0
@ -9,6 +9,7 @@
|
|||||||
// You may not use this file except in accordance with one or both of these
|
// You may not use this file except in accordance with one or both of these
|
||||||
// licenses.
|
// licenses.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use bitcoin::consensus::serialize;
|
use bitcoin::consensus::serialize;
|
||||||
@ -34,9 +35,12 @@ pub fn verify_tx<D: Database, B: Blockchain>(
|
|||||||
log::debug!("Verifying {}", tx.txid());
|
log::debug!("Verifying {}", tx.txid());
|
||||||
|
|
||||||
let serialized_tx = serialize(tx);
|
let serialized_tx = serialize(tx);
|
||||||
|
let mut tx_cache = HashMap::<_, Transaction>::new();
|
||||||
|
|
||||||
for (index, input) in tx.input.iter().enumerate() {
|
for (index, input) in tx.input.iter().enumerate() {
|
||||||
let prev_tx = if let Some(prev_tx) = database.get_raw_tx(&input.previous_output.txid)? {
|
let prev_tx = if let Some(prev_tx) = tx_cache.get(&input.previous_output.txid) {
|
||||||
|
prev_tx.clone()
|
||||||
|
} else if let Some(prev_tx) = database.get_raw_tx(&input.previous_output.txid)? {
|
||||||
prev_tx
|
prev_tx
|
||||||
} else if let Some(prev_tx) = blockchain.get_tx(&input.previous_output.txid)? {
|
} else if let Some(prev_tx) = blockchain.get_tx(&input.previous_output.txid)? {
|
||||||
prev_tx
|
prev_tx
|
||||||
@ -55,6 +59,10 @@ pub fn verify_tx<D: Database, B: Blockchain>(
|
|||||||
&serialized_tx,
|
&serialized_tx,
|
||||||
index,
|
index,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
// Since we have a local cache we might as well cache stuff from the db, as it will very
|
||||||
|
// likely decrease latency compared to reading from disk or performing an SQL query.
|
||||||
|
tx_cache.insert(prev_tx.txid(), prev_tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user