add request to remove tx in new blocks from the pool

This commit is contained in:
Boog900 2024-10-14 01:00:02 +01:00
parent 5ab5b062fd
commit 74a07cb8ba
No known key found for this signature in database
GPG key ID: 42AB1287CB0041C2
4 changed files with 79 additions and 5 deletions

View file

@ -5,7 +5,7 @@ use cuprate_types::TransactionVerificationData;
use std::collections::HashMap; use std::collections::HashMap;
use std::{collections::HashSet, sync::Arc}; use std::{collections::HashSet, sync::Arc};
use crate::types::{TransactionBlobHash, TransactionHash}; use crate::types::{KeyImage, TransactionBlobHash, TransactionHash};
//---------------------------------------------------------------------------------------------------- TxpoolReadRequest //---------------------------------------------------------------------------------------------------- TxpoolReadRequest
/// The transaction pool [`tower::Service`] read request type. /// The transaction pool [`tower::Service`] read request type.
@ -68,6 +68,11 @@ pub enum TxpoolWriteRequest {
/// ///
/// Returns [`TxpoolWriteResponse::Ok`]. /// Returns [`TxpoolWriteResponse::Ok`].
Promote(TransactionHash), Promote(TransactionHash),
NewBlock {
blockchain_height: usize,
spent_key_images: Vec<KeyImage>,
},
} }
//---------------------------------------------------------------------------------------------------- TxpoolWriteResponse //---------------------------------------------------------------------------------------------------- TxpoolWriteResponse

View file

@ -1,6 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use cuprate_database::{ConcreteEnv, DatabaseRw, Env, EnvInner, RuntimeError, TxRw}; use cuprate_database::{ConcreteEnv, DatabaseRo, DatabaseRw, Env, EnvInner, RuntimeError, TxRw};
use cuprate_database_service::DatabaseWriteHandle; use cuprate_database_service::DatabaseWriteHandle;
use cuprate_types::TransactionVerificationData; use cuprate_types::TransactionVerificationData;
@ -10,8 +10,8 @@ use crate::{
interface::{TxpoolWriteRequest, TxpoolWriteResponse}, interface::{TxpoolWriteRequest, TxpoolWriteResponse},
types::TxpoolWriteHandle, types::TxpoolWriteHandle,
}, },
tables::{OpenTables, TransactionInfos}, tables::{OpenTables, Tables, TablesMut, TransactionInfos},
types::{TransactionHash, TxStateFlags}, types::{KeyImage, PoolInfo, TransactionHash, TxStateFlags},
}; };
//---------------------------------------------------------------------------------------------------- init_write_service //---------------------------------------------------------------------------------------------------- init_write_service
@ -32,6 +32,10 @@ fn handle_txpool_request(
} }
TxpoolWriteRequest::RemoveTransaction(tx_hash) => remove_transaction(env, tx_hash), TxpoolWriteRequest::RemoveTransaction(tx_hash) => remove_transaction(env, tx_hash),
TxpoolWriteRequest::Promote(tx_hash) => promote(env, tx_hash), TxpoolWriteRequest::Promote(tx_hash) => promote(env, tx_hash),
TxpoolWriteRequest::NewBlock {
blockchain_height,
spent_key_images,
} => new_block(env, *blockchain_height, spent_key_images),
} }
} }
@ -118,5 +122,60 @@ fn promote(
Some(info) Some(info)
})?; })?;
drop(tx_infos);
TxRw::commit(tx_rw)?;
Ok(TxpoolWriteResponse::Ok)
}
fn new_block(
env: &ConcreteEnv,
blockchain_height: usize,
spent_key_images: &[KeyImage],
) -> Result<TxpoolWriteResponse, RuntimeError> {
let env_inner = env.env_inner();
let tx_rw = env_inner.tx_rw()?;
// FIXME: use try blocks once stable.
let result = || {
let mut tables_mut = env_inner.open_tables_mut(&tx_rw)?;
for key_image in spent_key_images {
match tables_mut
.spent_key_images()
.get(key_image)
.and_then(|tx_hash| ops::remove_transaction(&tx_hash, &mut tables_mut))
{
Ok(()) | Err(RuntimeError::KeyNotFound) => (),
Err(e) => return Err(e),
}
}
let res = tables_mut.pool_stats_mut().update(&(), |mut info| {
info.last_known_blockchain_height = blockchain_height;
Some(info)
});
match res {
Ok(()) => (),
Err(RuntimeError::KeyNotFound) => tables_mut.pool_stats_mut().put(
&(),
&PoolInfo {
last_known_blockchain_height: blockchain_height,
},
)?,
Err(e) => return Err(e),
}
Ok(())
};
if let Err(e) = result() {
TxRw::abort(tx_rw)?;
return Err(e);
}
TxRw::commit(tx_rw)?;
Ok(TxpoolWriteResponse::Ok) Ok(TxpoolWriteResponse::Ok)
} }

View file

@ -17,7 +17,8 @@
use cuprate_database::{define_tables, StorableVec}; use cuprate_database::{define_tables, StorableVec};
use crate::types::{ use crate::types::{
KeyImage, RawCachedVerificationState, TransactionBlobHash, TransactionHash, TransactionInfo, KeyImage, PoolInfo, RawCachedVerificationState, TransactionBlobHash, TransactionHash,
TransactionInfo,
}; };
define_tables! { define_tables! {
@ -48,4 +49,7 @@ define_tables! {
/// Transaction blob hashes that are in the pool. /// Transaction blob hashes that are in the pool.
4 => KnownBlobHashes, 4 => KnownBlobHashes,
TransactionBlobHash => TransactionHash, TransactionBlobHash => TransactionHash,
5 => PoolStats,
() => PoolInfo,
} }

View file

@ -19,6 +19,12 @@ pub type TransactionHash = [u8; 32];
/// A transaction blob hash. /// A transaction blob hash.
pub type TransactionBlobHash = [u8; 32]; pub type TransactionBlobHash = [u8; 32];
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Pod, Zeroable)]
#[repr(C)]
pub struct PoolInfo {
pub last_known_blockchain_height: usize,
}
bitflags::bitflags! { bitflags::bitflags! {
/// Flags representing the state of the transaction in the pool. /// Flags representing the state of the transaction in the pool.
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Pod, Zeroable)] #[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Pod, Zeroable)]