Skip to content

Commit

Permalink
feat(mempool): impl mempool state
Browse files Browse the repository at this point in the history
  • Loading branch information
MohammadNassar1 committed Jul 23, 2024
1 parent fc5813a commit cf24cda
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
29 changes: 29 additions & 0 deletions crates/mempool/src/mempool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub struct Mempool {
tx_pool: TransactionPool,
// Transactions eligible for sequencing.
tx_queue: TransactionQueue,
// Represents the current state of the mempool during block creation.
mempool_state: HashMap<ContractAddress, AccountState>,
}

impl Mempool {
Expand Down Expand Up @@ -55,13 +57,19 @@ impl Mempool {
eligible_txs.push(tx);
}

// Update the mempool state with the new nonces.
for tx in &eligible_txs {
self.mempool_state.entry(tx.sender_address).or_default().nonce = tx.nonce;
}

Ok(eligible_txs)
}

/// Adds a new transaction to the mempool.
/// TODO: support fee escalation and transactions with future nonces.
/// TODO: check Account nonce and balance.
pub fn add_tx(&mut self, input: MempoolInput) -> MempoolResult<()> {
self.validate_input(&input.tx, input.account)?;
self.insert_tx(input)
}

Expand Down Expand Up @@ -111,6 +119,27 @@ impl Mempool {
Ok(())
}

fn validate_input(&self, tx: &ThinTransaction, account: Account) -> MempoolResult<()> {
if let Some(AccountState { nonce }) = self.mempool_state.get(&tx.sender_address) {
if nonce >= &tx.nonce {
return Err(MempoolError::DuplicateNonce {
address: tx.sender_address,
nonce: tx.nonce,
});
}
}

let Account { state: AccountState { nonce }, .. } = account;
if nonce >= tx.nonce {
return Err(MempoolError::DuplicateNonce {
address: tx.sender_address,
nonce: tx.nonce,
});
}

Ok(())
}

#[cfg(test)]
pub(crate) fn _tx_pool(&self) -> &TransactionPool {
&self.tx_pool
Expand Down
2 changes: 1 addition & 1 deletion crates/mempool/src/mempool_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ impl MempoolState {
impl From<MempoolState> for Mempool {
fn from(mempool_state: MempoolState) -> Mempool {
let MempoolState { tx_pool, tx_queue } = mempool_state;
Mempool { tx_pool, tx_queue }
Mempool { tx_pool, tx_queue, ..Default::default() }
}
}

Expand Down
3 changes: 3 additions & 0 deletions crates/mempool_types/src/errors.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use starknet_api::core::{ContractAddress, Nonce};
use starknet_api::transaction::TransactionHash;
use thiserror::Error;

#[derive(Clone, Debug, Error, PartialEq, Eq)]
pub enum MempoolError {
#[error("Duplicate transaction, sender address: {address}, nonce: {:?}", nonce)]
DuplicateNonce { address: ContractAddress, nonce: Nonce },
#[error("Duplicate transaction, with hash: {tx_hash}")]
DuplicateTransaction { tx_hash: TransactionHash },
#[error("Transaction with hash: {tx_hash} not found")]
Expand Down

0 comments on commit cf24cda

Please sign in to comment.