From b5def67165dc369ea52883a6c058096da8617697 Mon Sep 17 00:00:00 2001 From: Duddino Date: Wed, 22 Jan 2025 13:45:15 +0100 Subject: [PATCH 1/3] Fix bug where address extractor would not capture vins if they were no addresses --- .../src/address_index/address_extractor.rs | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/address_index/address_extractor.rs b/src-tauri/src/address_index/address_extractor.rs index e1e8598..7dd7c0a 100644 --- a/src-tauri/src/address_index/address_extractor.rs +++ b/src-tauri/src/address_index/address_extractor.rs @@ -225,11 +225,19 @@ impl AddressExtractor { let mut is_proof_of_stake = false; for i in 0..txs { - let (tx, first_vout_empty) = Self::get_addresses_from_tx(byte_source)?; + let (mut tx, first_vout_empty) = Self::get_addresses_from_tx(byte_source)?; if i == 1 && first_vout_empty { is_proof_of_stake = true; } - if !tx.addresses.is_empty() { + if let Some(first_vin) = tx.vin.get(0) { + // We're not interested in coinbase/coinstake txs + if first_vin.txid + == "0000000000000000000000000000000000000000000000000000000000000000" + { + tx.vin.remove(0); + } + } + if !(tx.addresses.is_empty() && tx.vin.is_empty()) { block.txs.push(tx); } } @@ -338,11 +346,19 @@ mod test { fn it_gets_address_from_sapling_block() -> crate::error::Result<()> { let bytes = hex::decode(include_str!("test/sapling_block.hex")).unwrap(); let block = AddressExtractor::get_addresses_from_block(&mut Cursor::new(bytes))?; - assert_eq!(block.txs.len(), 2); + assert_eq!(block.txs.len(), 3); assert_eq!( block.txs[0].txid, "3f64c3328bac6d5bb8c002a46cd767e367ef6f9dd2298ba04ca51c2ef4f0cc2c" ); + assert_eq!( + block.txs[0].vin[0], + Vin { + txid: "0ed21cb2aebc007881c080c2efba39c5cb4387dabc1a6ac15afcab322d2f478d".into(), + n: 4, + } + ); + assert_eq!( block.txs[0].addresses, vec![ @@ -350,12 +366,26 @@ mod test { "DM2TWw1NvJ7sPxNXPZ8Cmn4DNGxYfa6yfX" ] ); + assert_eq!( block.txs[1].txid, + "374a46e4b905e1709fee2e3e6451be7b144af57d96d766f6fbbfc45d79d91cc7" + ); + assert_eq!( + block.txs[1].vin[0], + Vin { + txid: "401f6c52e7ae71ce31db1f05f0c4e506fa090cc55bacfebdc000dbbf41d37f1e".into(), + n: 0, + } + ); + assert_eq!(block.txs[1].addresses, vec![] as Vec); + assert_eq!( + block.txs[2].txid, "997938165e83478f25bd14b203e492b9ce39a3979384527868f72fd394e68a45" ); + assert_eq!(block.txs[2].vin, vec![] as Vec); assert_eq!( - block.txs[1].addresses, + block.txs[2].addresses, vec!["DExue43LyQduJzkUwFq53LfSppAzdRGWU2"] ); Ok(()) From b0fa12c3830722eba6890692a31bb8b94616a788 Mon Sep 17 00:00:00 2001 From: Duddino Date: Wed, 22 Jan 2025 13:46:39 +0100 Subject: [PATCH 2/3] Change iterator to loop to avoid stack overflows --- .../src/address_index/block_file_source.rs | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src-tauri/src/address_index/block_file_source.rs b/src-tauri/src/address_index/block_file_source.rs index c57a0f3..838eb1d 100644 --- a/src-tauri/src/address_index/block_file_source.rs +++ b/src-tauri/src/address_index/block_file_source.rs @@ -44,27 +44,34 @@ impl Iterator for BlockFileIterator { type Item = Block; fn next(&mut self) -> Option { - let mut file = match &self.open_file { - Some(file) => file, - None => { - println!( - "opening file {:?}...", - self.db_path.join(format!("blk{:0>5}.dat", self.counter)) - ); - self.open_file = Some( - File::open(self.db_path.join(format!("blk{:0>5}.dat", self.counter))).ok()?, - ); - self.counter += 1; - self.open_file.as_ref().unwrap() - } - }; - let block = AddressExtractor::get_addresses_from_block(&mut file); - match block { - Ok(block) => Some(block), - Err(PIVXErrors::InvalidBlock) => self.next(), - Err(_) => { - self.open_file = None; - self.next() + loop { + let mut file = match &self.open_file { + Some(file) => file, + None => { + self.open_file = Some( + File::open(self.db_path.join(format!("blk{:0>5}.dat", self.counter))) + .ok()?, + ); + println!( + "opened file {:?}...", + self.db_path.join(format!("blk{:0>5}.dat", self.counter)) + ); + self.counter += 1; + self.open_file.as_ref().unwrap() + } + }; + let block = AddressExtractor::get_addresses_from_block(&mut file); + match block { + Ok(block) => break Some(block), + Err(PIVXErrors::InvalidBlock) => {} + Err(e) => { + println!("{:?}", e); + self.open_file = None; + println!( + "Done with file {:?}", + self.db_path.join(format!("blk{:0>5}.dat", self.counter)) + ); + } } } } From 7e07f77c6ec1b5689e73012c3c386901f826eee7 Mon Sep 17 00:00:00 2001 From: Duddino Date: Wed, 22 Jan 2025 13:48:10 +0100 Subject: [PATCH 3/3] Cargo clippy suggestion --- src-tauri/src/address_index/address_extractor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/address_index/address_extractor.rs b/src-tauri/src/address_index/address_extractor.rs index 7dd7c0a..48240fa 100644 --- a/src-tauri/src/address_index/address_extractor.rs +++ b/src-tauri/src/address_index/address_extractor.rs @@ -229,7 +229,7 @@ impl AddressExtractor { if i == 1 && first_vout_empty { is_proof_of_stake = true; } - if let Some(first_vin) = tx.vin.get(0) { + if let Some(first_vin) = tx.vin.first() { // We're not interested in coinbase/coinstake txs if first_vin.txid == "0000000000000000000000000000000000000000000000000000000000000000"