mirror of
https://github.com/Cuprate/cuprate.git
synced 2025-01-09 04:20:01 +00:00
add request to remove tx in new blocks from the pool
This commit is contained in:
parent
5ab5b062fd
commit
74a07cb8ba
4 changed files with 79 additions and 5 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
Loading…
Reference in a new issue