diff --git a/nym-api/src/ecash/api_routes/spending.rs b/nym-api/src/ecash/api_routes/spending.rs index b5eedbcdbe..a45d6f62ad 100644 --- a/nym-api/src/ecash/api_routes/spending.rs +++ b/nym-api/src/ecash/api_routes/spending.rs @@ -193,10 +193,7 @@ pub async fn batch_redeem_tickets( #[openapi(tag = "Ecash")] #[get("/double-spending-filter-v1")] pub async fn double_spending_filter_v1( - state: &RocketState, + _state: &RocketState, ) -> crate::ecash::error::Result> { - let spent_credentials_export = state.get_bloomfilter_bytes().await; - Ok(Json(SpentCredentialsResponse::new( - spent_credentials_export, - ))) + Err(EcashError::Restricted) } diff --git a/nym-api/src/ecash/api_routes/spending_axum.rs b/nym-api/src/ecash/api_routes/spending_axum.rs index aca64b7f0c..74be06674f 100644 --- a/nym-api/src/ecash/api_routes/spending_axum.rs +++ b/nym-api/src/ecash/api_routes/spending_axum.rs @@ -3,7 +3,7 @@ use crate::ecash::error::EcashError; use crate::ecash::state::EcashState; -use crate::node_status_api::models::AxumResult; +use crate::node_status_api::models::{AxumErrorResponse, AxumResult}; use crate::v2::AxumAppState; use axum::{Json, Router}; use nym_api_requests::constants::MIN_BATCH_REDEMPTION_DELAY; @@ -11,6 +11,7 @@ use nym_api_requests::ecash::models::{ BatchRedeemTicketsBody, EcashBatchTicketRedemptionResponse, EcashTicketVerificationRejection, EcashTicketVerificationResponse, SpentCredentialsResponse, VerifyEcashTicketBody, }; +use nym_api_requests::models::RequestError; use nym_compact_ecash::identify::IdentifyResult; use nym_ecash_time::EcashTime; use std::collections::HashSet; @@ -236,10 +237,7 @@ async fn batch_redeem_tickets( ) )] async fn double_spending_filter_v1( - state: Arc, + _state: Arc, ) -> AxumResult> { - let spent_credentials_export = state.get_bloomfilter_bytes().await; - Ok(Json(SpentCredentialsResponse::new( - spent_credentials_export, - ))) + AxumResult::Err(AxumErrorResponse::internal_msg("permanently restricted")) } diff --git a/nym-api/src/ecash/error.rs b/nym-api/src/ecash/error.rs index 94201847dc..3590f235a5 100644 --- a/nym-api/src/ecash/error.rs +++ b/nym-api/src/ecash/error.rs @@ -32,6 +32,9 @@ pub type Result = std::result::Result; #[derive(Debug, Error)] pub enum EcashError { + #[error("permanently restricted")] + Restricted, + #[error(transparent)] IOError(#[from] std::io::Error), diff --git a/nym-api/src/ecash/state/local.rs b/nym-api/src/ecash/state/local.rs index fd3b5080b1..d18935dd0e 100644 --- a/nym-api/src/ecash/state/local.rs +++ b/nym-api/src/ecash/state/local.rs @@ -9,9 +9,8 @@ use crate::ecash::keys::KeyPair; use nym_config::defaults::BloomfilterParameters; use nym_crypto::asymmetric::identity; use nym_ecash_double_spending::DoubleSpendingFilter; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use time::{Date, OffsetDateTime}; +use time::Date; use tokio::sync::RwLock; pub(crate) struct TicketDoubleSpendingFilter { @@ -70,10 +69,6 @@ impl TicketDoubleSpendingFilter { self.today_filter.dump_bitmap() } - pub(crate) fn export_global_bitmap(&self) -> Vec { - self.global_filter.dump_bitmap() - } - pub(crate) fn advance_day(&mut self, date: Date, new_global: DoubleSpendingFilter) { self.built_on = date; self.global_filter = new_global; @@ -81,17 +76,6 @@ impl TicketDoubleSpendingFilter { } } -pub(crate) struct ExportedDoubleSpendingFilterData { - pub(crate) last_exported_at: OffsetDateTime, - pub(crate) bytes: Vec, -} - -#[derive(Clone)] -pub(crate) struct ExportedDoubleSpendingFilter { - pub(crate) being_exported: Arc, - pub(crate) data: Arc>, -} - pub(crate) struct LocalEcashState { pub(crate) ecash_keypair: KeyPair, pub(crate) identity_keypair: identity::KeyPair, @@ -102,9 +86,6 @@ pub(crate) struct LocalEcashState { // the actual, up to date, bloomfilter pub(crate) double_spending_filter: Arc>, - - // the cached byte representation of the bloomfilter to be used by the clients - pub(crate) exported_double_spending_filter: ExportedDoubleSpendingFilter, } impl LocalEcashState { @@ -118,38 +99,7 @@ impl LocalEcashState { identity_keypair, partial_coin_index_signatures: Default::default(), partial_expiration_date_signatures: Default::default(), - exported_double_spending_filter: ExportedDoubleSpendingFilter { - being_exported: Arc::new(Default::default()), - data: Arc::new(RwLock::new(ExportedDoubleSpendingFilterData { - last_exported_at: OffsetDateTime::now_utc(), - bytes: double_spending_filter.export_global_bitmap(), - })), - }, double_spending_filter: Arc::new(RwLock::new(double_spending_filter)), } } - - pub(crate) fn maybe_background_update_exported_bloomfilter(&self) { - // make sure another query hasn't already spawned an exporting task - let Ok(should_export) = self - .exported_double_spending_filter - .being_exported - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) - else { - return; - }; - - let filter = self.double_spending_filter.clone(); - let exported = self.exported_double_spending_filter.clone(); - - if should_export { - tokio::spawn(async move { - log::debug!("exporting bloomfilter bitmap"); - let new = filter.read().await.export_global_bitmap(); - let mut exported_guard = exported.data.write().await; - exported_guard.last_exported_at = OffsetDateTime::now_utc(); - exported_guard.bytes = new; - }); - } - } } diff --git a/nym-api/src/ecash/state/mod.rs b/nym-api/src/ecash/state/mod.rs index b55117ea1e..8676dba935 100644 --- a/nym-api/src/ecash/state/mod.rs +++ b/nym-api/src/ecash/state/mod.rs @@ -45,7 +45,7 @@ use nym_ecash_time::cred_exp_date; use nym_validator_client::nyxd::AccountId; use nym_validator_client::EcashApiClient; use time::ext::NumericalDuration; -use time::{Date, Duration, OffsetDateTime}; +use time::{Date, OffsetDateTime}; use tokio::sync::RwLockReadGuard; pub(crate) mod auxiliary; @@ -839,17 +839,4 @@ impl EcashState { res } - - pub async fn get_bloomfilter_bytes(&self) -> Vec { - let guard = self.local.exported_double_spending_filter.data.read().await; - - let bytes = guard.bytes.clone(); - - // see if it's been > 5min since last export (that value is arbitrary) - if guard.last_exported_at + Duration::minutes(5) < OffsetDateTime::now_utc() { - self.local.maybe_background_update_exported_bloomfilter(); - } - - bytes - } }