TARAXA
transaction_queue.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "common/constants.hpp"
4 #include "common/util.hpp"
6 
7 namespace taraxa {
8 
13 enum class TransactionStatus;
14 namespace final_chain {
15 class FinalChain;
16 }
31  public:
32  TransactionQueue(std::shared_ptr<final_chain::FinalChain> final_chain, size_t max_size = kMinTransactionPoolSize);
33 
41  TransactionStatus insert(std::shared_ptr<Transaction>&& transaction, bool proposable, uint64_t last_block_number = 0);
42 
50  bool erase(const trx_hash_t& hash);
51 
58  std::shared_ptr<Transaction> get(const trx_hash_t& hash) const;
59 
67  std::vector<std::shared_ptr<Transaction>> getOrderedTransactions(uint64_t count) const;
68 
74  std::vector<SharedTransactions> getAllTransactions() const;
75 
83  bool contains(const trx_hash_t& hash) const;
84 
90  size_t size() const;
91 
97  void blockFinalized(uint64_t block_number);
98 
104  void purge();
105 
111  void markTransactionKnown(const trx_hash_t& trx_hash);
112 
118  bool isTransactionKnown(const trx_hash_t& trx_hash) const;
119 
125  bool transactionsDropped() const {
126  return std::chrono::system_clock::now() - transaction_overflow_time_ < kTransactionOverflowTimeLimit;
127  }
128 
136 
137  private:
138  // Transactions in the queue per account ordered by nonce
139  std::unordered_map<addr_t, std::map<val_t, std::shared_ptr<Transaction>>> account_nonce_transactions_;
140 
141  // Transactions in the queue per trx hash
142  std::unordered_map<trx_hash_t, std::shared_ptr<Transaction>> queue_transactions_;
143 
144  // Low nonce and insufficient balance transactions which should not be included in proposed dag blocks but it is
145  // possible because of dag reordering that some dag block might arrive requiring these transactions.
146  std::unordered_map<trx_hash_t, std::pair<uint64_t, std::shared_ptr<Transaction>>> non_proposable_transactions_;
147 
149 
150  // Last time transactions were dropped due to queue reaching max size
152 
153  // If transactions are dropped within last kTransactionOverflowTimeLimit seconds, dag blocks with missing transactions
154  // will not be treated as malicious
155  const std::chrono::seconds kTransactionOverflowTimeLimit{600};
156 
157  // Limit when non proposable transactions expire
159 
160  // Maximum number of non proposable transactions in percentage of kMaxSize
162 
163  // Maximum number of single account transactions in percentage of kMaxSize
165 
166  // Maximum number of non proposable transactions
168 
169  // Maximum size of transactions pool
170  const size_t kMaxSize;
171 
172  // Maximum size of single account transactions
174 
175  std::shared_ptr<final_chain::FinalChain> final_chain_;
176 };
177 
180 } // namespace taraxa
Definition: util.hpp:202
std::chrono::system_clock::time_point transaction_overflow_time_
Definition: transaction_queue.hpp:151
void purge()
Removes any transactions that are no longer proposable.
Definition: transaction_queue.cpp:191
TransactionStatus insert(std::shared_ptr< Transaction > &&transaction, bool proposable, uint64_t last_block_number=0)
insert a transaction into the queue, sorted by priority
Definition: transaction_queue.cpp:110
std::unordered_map< trx_hash_t, std::pair< uint64_t, std::shared_ptr< Transaction > > > non_proposable_transactions_
Definition: transaction_queue.hpp:146
ExpirationCache< trx_hash_t > known_txs_
Definition: transaction_queue.hpp:148
bool nonProposableTransactionsOverTheLimit() const
return true if non proposable transactions are over the limit
Definition: transaction_queue.cpp:215
bool contains(const trx_hash_t &hash) const
returns true/false if the transaction is in the queue
Definition: transaction_queue.cpp:18
const size_t kNonProposableTransactionsPeriodExpiryLimit
Definition: transaction_queue.hpp:158
const size_t kMaxSize
Definition: transaction_queue.hpp:170
std::vector< std::shared_ptr< Transaction > > getOrderedTransactions(uint64_t count) const
returns up to the number of requested transaction sorted by priority. This call actually sorts the tr...
Definition: transaction_queue.cpp:35
std::shared_ptr< final_chain::FinalChain > final_chain_
Definition: transaction_queue.hpp:175
bool isTransactionKnown(const trx_hash_t &trx_hash) const
Definition: transaction_queue.cpp:221
const size_t kSingleAccountTransactionsLimitPercentage
Definition: transaction_queue.hpp:164
std::vector< SharedTransactions > getAllTransactions() const
returns all transactions grouped by transactions author
Definition: transaction_queue.cpp:74
void blockFinalized(uint64_t block_number)
Invoked when block finalized in final chain.
Definition: transaction_queue.cpp:180
const std::chrono::seconds kTransactionOverflowTimeLimit
Definition: transaction_queue.hpp:155
bool transactionsDropped() const
Have transactions been recently dropped due to queue reaching max size This call is thread-safe.
Definition: transaction_queue.hpp:125
size_t size() const
returns size of priority queue
Definition: transaction_queue.cpp:16
const size_t kMaxSingleAccountTransactionsSize
Definition: transaction_queue.hpp:173
TransactionQueue(std::shared_ptr< final_chain::FinalChain > final_chain, size_t max_size=kMinTransactionPoolSize)
Definition: transaction_queue.cpp:7
std::unordered_map< addr_t, std::map< val_t, std::shared_ptr< Transaction > > > account_nonce_transactions_
Definition: transaction_queue.hpp:139
const size_t kNonProposableTransactionsLimitPercentage
Definition: transaction_queue.hpp:161
std::shared_ptr< Transaction > get(const trx_hash_t &hash) const
returns the transaction or null
Definition: transaction_queue.cpp:22
bool erase(const trx_hash_t &hash)
remove transaction from queue
Definition: transaction_queue.cpp:88
void markTransactionKnown(const trx_hash_t &trx_hash)
Marks transaction as known (was successfully pushed into the tx pool) This call is thread-safe.
Definition: transaction_queue.cpp:219
const size_t kNonProposableTransactionsMaxSize
Definition: transaction_queue.hpp:167
std::unordered_map< trx_hash_t, std::shared_ptr< Transaction > > queue_transactions_
Definition: transaction_queue.hpp:142
TransactionQueue keeps transactions in memory sorted by priority to be included in a proposed DAG blo...
Definition: transaction_queue.hpp:30
TransactionStatus
TransactionStatus enum class defines current transaction status.
Definition: transaction_manager.hpp:19
std::chrono::system_clock::time_point time_point
Definition: watches.hpp:12
Definition: config.hpp:8
constexpr uint32_t kMinTransactionPoolSize
Definition: constants.hpp:29