diff --git a/src/api/dart_ffi.rs b/src/api/dart_ffi.rs index c51ae45..60a92d4 100644 --- a/src/api/dart_ffi.rs +++ b/src/api/dart_ffi.rs @@ -647,12 +647,12 @@ pub unsafe extern "C" fn derive_zip32( #[no_mangle] pub unsafe extern "C" fn get_downloaded_size() -> usize { - DOWNLOADED_BYTES.load(Ordering::SeqCst) + DOWNLOADED_BYTES.load(Ordering::Acquire) } #[no_mangle] pub unsafe extern "C" fn get_trial_decryptions_count() -> usize { - TRIAL_DECRYPTIONS.load(Ordering::SeqCst) + TRIAL_DECRYPTIONS.load(Ordering::Acquire) } #[no_mangle] diff --git a/src/chain.rs b/src/chain.rs index 3da6de6..7bf17a9 100644 --- a/src/chain.rs +++ b/src/chain.rs @@ -7,6 +7,8 @@ use crate::{advance_tree, has_cuda}; use ff::PrimeField; use futures::{future, FutureExt}; use log::info; +use rand::prelude::SliceRandom; +use rand::rngs::OsRng; use rayon::prelude::*; use std::collections::HashMap; use std::convert::TryInto; @@ -166,15 +168,15 @@ pub async fn download_chain( hash: vec![], }), }; - DOWNLOADED_BYTES.store(0, Ordering::SeqCst); - TRIAL_DECRYPTIONS.store(0, Ordering::SeqCst); + DOWNLOADED_BYTES.store(0, Ordering::Release); + TRIAL_DECRYPTIONS.store(0, Ordering::Release); let mut block_stream = client .get_block_range(Request::new(range)) .await? .into_inner(); while let Some(mut block) = block_stream.message().await? { let block_size = get_block_size(&block); - DOWNLOADED_BYTES.fetch_add(block_size, Ordering::SeqCst); + DOWNLOADED_BYTES.fetch_add(block_size, Ordering::Release); if cancel.load(Ordering::Acquire) { log::info!("Canceling download"); break; @@ -606,7 +608,8 @@ pub async fn get_best_server(servers: &[String]) -> Option { tokio::spawn(timeout(Duration::from_secs(1), get_height(s.to_string()))).boxed(); server_heights.push(server_height); } - let server_heights = future::try_join_all(server_heights).await.ok()?; + let mut server_heights = future::try_join_all(server_heights).await.ok()?; + server_heights.shuffle(&mut OsRng); server_heights .into_iter() diff --git a/src/gpu.rs b/src/gpu.rs index fc38645..a6ce1f0 100644 --- a/src/gpu.rs +++ b/src/gpu.rs @@ -125,7 +125,7 @@ fn collect_decrypted_notes( for (output_index, co) in tx.outputs.iter().enumerate() { let plaintext = &output_buffer[i * buffer_stride + 64..i * buffer_stride + 116]; // version and amount must be in range - 21 million ZEC is less than 0x0008 0000 0000 0000 - if plaintext[0] <= 2 || plaintext[18] <= 0x07 || plaintext[19] != 0 { + if plaintext[0] <= 2 && plaintext[18] < 0x08 && plaintext[19] == 0 { if let Some((note, pa)) = domain.parse_note_plaintext_without_memo_ivk(&ivk, plaintext) { diff --git a/src/scan.rs b/src/scan.rs index f0d4527..195d9ff 100644 --- a/src/scan.rs +++ b/src/scan.rs @@ -140,7 +140,7 @@ pub async fn sync_async( .iter() .map(|db| db.count_outputs as usize) .sum::(); - TRIAL_DECRYPTIONS.fetch_add(n_ivks * outputs, AtomicOrdering::SeqCst); + TRIAL_DECRYPTIONS.fetch_add(n_ivks * outputs, AtomicOrdering::Release); for b in dec_blocks.iter() { let mut my_nfs: Vec = vec![]; for nf in b.spends.iter() {