diff --git a/common/credential-verification/src/ecash/double_spending.rs b/common/credential-verification/src/ecash/double_spending.rs deleted file mode 100644 index 812eea1fc1..0000000000 --- a/common/credential-verification/src/ecash/double_spending.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2022-2024 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use crate::ecash::error::EcashTicketError; -use crate::ecash::state::SharedState; -use nym_ecash_double_spending::DoubleSpendingFilter; -use nym_gateway_storage::Storage; -use nym_task::TaskClient; -use nym_validator_client::client::NymApiClientExt; -use nym_validator_client::EcashApiClient; -use rand::prelude::SliceRandom; -use rand::thread_rng; -use std::sync::Arc; -use tokio::sync::{RwLock, RwLockReadGuard}; -use tokio::time::{interval, Duration}; -use tracing::{info, trace, warn}; - -#[derive(Clone)] -pub(crate) struct DoubleSpendingDetector { - spent_serial_numbers: Arc>, - shared_state: SharedState, -} - -impl DoubleSpendingDetector -where - S: Storage + Clone + Send + Sync + 'static, -{ - pub(crate) fn new(shared_state: SharedState) -> Self { - DoubleSpendingDetector { - spent_serial_numbers: Arc::new(RwLock::new(DoubleSpendingFilter::new_empty_ecash())), - shared_state, - } - } - - pub(crate) async fn check(&self, serial_number: &Vec) -> bool { - self.spent_serial_numbers.read().await.check(serial_number) - } - - async fn latest_api_endpoints( - &self, - ) -> Result>, EcashTicketError> { - let epoch_id = self.shared_state.current_epoch_id().await?; - self.shared_state.api_clients(epoch_id).await - } - - async fn refresh_bloomfilter(&self) { - let mut filter_builder = self.spent_serial_numbers.read().await.rebuild(); - - let api_clients = match self.latest_api_endpoints().await { - Ok(clients) => clients, - Err(err) => { - warn!("failed to obtain current api clients: {err}"); - return; - } - }; - - let mut clients = api_clients - .iter() - .map(|c| c.api_client.clone()) - .collect::>(); - clients.shuffle(&mut thread_rng()); - - for client in clients { - match client.nym_api.double_spending_filter_v1().await { - Ok(response) => { - // due to relative big size of the filter, query only one api since all of them should contain - // roughly the same data anyway. - filter_builder.add_bytes(&response.bitmap); - *self.spent_serial_numbers.write().await = filter_builder.build(); - return; - } - Err(err) => { - warn!("Validator @ {} could not be reached. There might be a problem with the ecash endpoint: {err}", client.api_url()); - } - } - } - - warn!("none of the validators could be reached. the bloomfilter will remain unchanged."); - } - - async fn run(&self, mut shutdown: TaskClient) { - info!("Starting Ecash DoubleSpendingDetector"); - let mut interval = interval(Duration::from_secs(600)); - - while !shutdown.is_shutdown() { - tokio::select! { - biased; - _ = shutdown.recv() => { - trace!("ecash_verifier::DoubleSpendingDetector : received shutdown"); - }, - _ = interval.tick() => self.refresh_bloomfilter().await, - - } - } - } - - pub(crate) fn start(self, shutdown: nym_task::TaskClient) { - tokio::spawn(async move { self.run(shutdown).await }); - } -} diff --git a/common/credential-verification/src/ecash/mod.rs b/common/credential-verification/src/ecash/mod.rs index 1fc847bc36..2c86dee586 100644 --- a/common/credential-verification/src/ecash/mod.rs +++ b/common/credential-verification/src/ecash/mod.rs @@ -4,7 +4,6 @@ use crate::Error; use credential_sender::CredentialHandler; use credential_sender::CredentialHandlerConfig; -use double_spending::DoubleSpendingDetector; use error::EcashTicketError; use futures::channel::mpsc::{self, UnboundedSender}; use nym_credentials::CredentialSpendingData; @@ -18,7 +17,6 @@ use tokio::sync::{Mutex, RwLockReadGuard}; use tracing::error; pub mod credential_sender; -pub(crate) mod double_spending; pub mod error; mod helpers; mod state; @@ -31,7 +29,6 @@ pub struct EcashManager { pk_bytes: [u8; 32], // bytes representation of a pub key representing the verifier pay_infos: Mutex>, cred_sender: UnboundedSender, - double_spend_detector: DoubleSpendingDetector, } impl EcashManager @@ -47,9 +44,6 @@ where ) -> Result { let shared_state = SharedState::new(nyxd_client, storage).await?; - let double_spend_detector = DoubleSpendingDetector::new(shared_state.clone()); - double_spend_detector.clone().start(shutdown.clone()); - let (cred_sender, cred_receiver) = mpsc::unbounded(); let cs = @@ -62,7 +56,6 @@ where pk_bytes, pay_infos: Default::default(), cred_sender, - double_spend_detector, }) } @@ -163,10 +156,6 @@ where Ok(()) } - pub async fn check_double_spend(&self, serial_number: &Vec) -> bool { - self.double_spend_detector.check(serial_number).await - } - pub fn async_verify(&self, ticket: ClientTicket) { // TODO: I guess do something for shutdowns let _ = self diff --git a/common/credential-verification/src/lib.rs b/common/credential-verification/src/lib.rs index 4d2e7be2da..0ffe090a06 100644 --- a/common/credential-verification/src/lib.rs +++ b/common/credential-verification/src/lib.rs @@ -53,18 +53,6 @@ impl CredentialVerifier { Ok(()) } - async fn check_bloomfilter(&self, serial_number: &Vec) -> Result<()> { - trace!("checking the bloomfilter..."); - - let spent = self.ecash_verifier.check_double_spend(serial_number).await; - - if spent { - trace!("the credential has already been spent before at some gateway before (bloomfilter failure)"); - return Err(Error::BandwidthCredentialAlreadySpent); - } - Ok(()) - } - async fn check_local_db_for_double_spending(&self, serial_number: &[u8]) -> Result<()> { trace!("checking local db for double spending..."); @@ -128,7 +116,6 @@ impl CredentialVerifier { } self.check_credential_spending_date(spend_date.ecash_date())?; - self.check_bloomfilter(&serial_number).await?; self.check_local_db_for_double_spending(&serial_number) .await?;