TARAXA
Loading...
Searching...
No Matches
transaction_queue.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "common/util.hpp"
6
7namespace taraxa {
8
13enum class TransactionStatus;
14namespace final_chain {
15class 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 SharedTransaction& transaction);
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
142 val_t getMinGasPriceForBlockInclusion(uint64_t limit) const;
143
144 private:
151 void addTransaction(const SharedTransaction& transaction, bool proposable, uint64_t last_block_number = 0);
152
159 bool removeTransaction(const SharedTransaction& transaction, bool proposable);
160
167 std::unordered_map<taraxa::trx_hash_t, std::pair<uint64_t, taraxa::SharedTransaction>>::iterator removeTransaction(
168 std::unordered_map<taraxa::trx_hash_t, std::pair<uint64_t, taraxa::SharedTransaction>>::iterator transaction);
169
170 // Transactions in the queue per account ordered by nonce
171 std::unordered_map<addr_t, std::map<val_t, std::shared_ptr<Transaction>>> account_nonce_transactions_;
172
173 // Transactions in the queue per trx hash
174 std::unordered_map<trx_hash_t, std::shared_ptr<Transaction>> queue_transactions_;
175
176 // Amount of gas per gas prices in queue
177 std::map<val_t, uint64_t, std::greater<val_t>> queue_transactions_gas_prices_;
178
179 // Low nonce and insufficient balance transactions which should not be included in proposed dag blocks but it is
180 // possible because of dag reordering that some dag block might arrive requiring these transactions.
181 std::unordered_map<trx_hash_t, std::pair<uint64_t, std::shared_ptr<Transaction>>> non_proposable_transactions_;
182
184
185 // Last time transactions were dropped due to queue reaching max size
186 std::chrono::system_clock::time_point transaction_overflow_time_;
187
188 // Size of data for transactions in pool
189 size_t data_size_ = 0;
190
191 // If transactions are dropped within last kTransactionOverflowTimeLimit seconds, dag blocks with missing transactions
192 // will not be treated as malicious
193 const std::chrono::seconds kTransactionOverflowTimeLimit{600};
194
195 // Limit when non proposable transactions expire
197
198 // Maximum number of non proposable transactions in percentage of kMaxSize
200
201 // Maximum number of single account transactions in percentage of kMaxSize
203
204 // Maximum number of non proposable transactions
206
207 // Maximum size of transactions pool
208 const size_t kMaxSize;
209
210 // Maximum data size of transactions pool
211 const size_t kMaxDataSize;
212
213 // Maximum size of single account transactions
215
216 std::shared_ptr<final_chain::FinalChain> final_chain_;
217};
218
221} // namespace taraxa
Definition util.hpp:204
std::chrono::system_clock::time_point transaction_overflow_time_
Definition transaction_queue.hpp:186
void purge()
Removes any transactions that are no longer proposable.
Definition transaction_queue.cpp:239
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:152
val_t getMinGasPriceForBlockInclusion(uint64_t limit) const
Returns minimum gas price needed for transaction to be included in the next proposed dag block.
Definition transaction_queue.cpp:271
void addTransaction(const SharedTransaction &transaction, bool proposable, uint64_t last_block_number=0)
add transaction to queue
Definition transaction_queue.cpp:19
std::unordered_map< trx_hash_t, std::pair< uint64_t, std::shared_ptr< Transaction > > > non_proposable_transactions_
Definition transaction_queue.hpp:181
ExpirationCache< trx_hash_t > known_txs_
Definition transaction_queue.hpp:183
bool nonProposableTransactionsOverTheLimit() const
return true if non proposable transactions are over the limit
Definition transaction_queue.cpp:263
bool contains(const trx_hash_t &hash) const
returns true/false if the transaction is in the queue
Definition transaction_queue.cpp:62
bool erase(const SharedTransaction &transaction)
remove transaction from queue
Definition transaction_queue.cpp:132
const size_t kNonProposableTransactionsPeriodExpiryLimit
Definition transaction_queue.hpp:196
const size_t kMaxSize
Definition transaction_queue.hpp:208
std::map< val_t, uint64_t, std::greater< val_t > > queue_transactions_gas_prices_
Definition transaction_queue.hpp:177
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:79
std::shared_ptr< final_chain::FinalChain > final_chain_
Definition transaction_queue.hpp:216
bool isTransactionKnown(const trx_hash_t &trx_hash) const
Definition transaction_queue.cpp:269
const size_t kSingleAccountTransactionsLimitPercentage
Definition transaction_queue.hpp:202
std::vector< SharedTransactions > getAllTransactions() const
returns all transactions grouped by transactions author
Definition transaction_queue.cpp:118
void blockFinalized(uint64_t block_number)
Invoked when block finalized in final chain.
Definition transaction_queue.cpp:228
const std::chrono::seconds kTransactionOverflowTimeLimit
Definition transaction_queue.hpp:193
bool transactionsDropped() const
Have transactions been recently dropped due to queue reaching max size This call is thread-safe.
Definition transaction_queue.hpp:125
bool removeTransaction(const SharedTransaction &transaction, bool proposable)
remove transaction from queue
Definition transaction_queue.cpp:35
size_t size() const
returns size of priority queue
Definition transaction_queue.cpp:17
size_t data_size_
Definition transaction_queue.hpp:189
const size_t kMaxDataSize
Definition transaction_queue.hpp:211
const size_t kMaxSingleAccountTransactionsSize
Definition transaction_queue.hpp:214
std::unordered_map< addr_t, std::map< val_t, std::shared_ptr< Transaction > > > account_nonce_transactions_
Definition transaction_queue.hpp:171
const size_t kNonProposableTransactionsLimitPercentage
Definition transaction_queue.hpp:199
std::shared_ptr< Transaction > get(const trx_hash_t &hash) const
returns the transaction or null
Definition transaction_queue.cpp:66
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:267
const size_t kNonProposableTransactionsMaxSize
Definition transaction_queue.hpp:205
std::unordered_map< trx_hash_t, std::shared_ptr< Transaction > > queue_transactions_
Definition transaction_queue.hpp:174
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:23
Definition app.hpp:16
std::shared_ptr< Transaction > SharedTransaction
Definition transaction.hpp:84
constexpr uint32_t kMinTransactionPoolSize
Definition constants.hpp:30
dev::u256 val_t
Definition types.hpp:48