TARAXA
transaction_manager.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "common/event.hpp"
5 #include "logger/logger.hpp"
6 #include "storage/storage.hpp"
8 #include "transaction_queue.hpp"
9 
10 namespace taraxa {
11 
20 
21 class DagBlock;
22 class DagManager;
23 class FullNode;
24 class FullNodeConfig;
25 
51 class TransactionManager : public std::enable_shared_from_this<TransactionManager> {
52  public:
53  TransactionManager(const FullNodeConfig &conf, std::shared_ptr<DbStorage> db,
54  std::shared_ptr<final_chain::FinalChain> final_chain, addr_t node_addr);
55 
62  uint64_t estimateTransactionGas(std::shared_ptr<Transaction> trx, std::optional<PbftPeriod> proposal_period) const;
63 
70  std::pair<SharedTransactions, std::vector<uint64_t>> packTrxs(PbftPeriod proposal_period, uint64_t weight_limit);
71 
76  std::vector<SharedTransactions> getAllPoolTrxs();
77 
82 
89  std::pair<bool, std::string> insertTransaction(const std::shared_ptr<Transaction> &trx);
90 
96  void blockFinalized(EthBlockNumber block_number);
97 
106  TransactionStatus insertValidatedTransaction(std::shared_ptr<Transaction> &&tx, bool insert_non_proposable = true);
107 
112  bool isTransactionKnown(const trx_hash_t &trx_hash);
113 
114  size_t getTransactionPoolSize() const;
115 
123  bool isTransactionPoolFull(size_t percentage = 100) const;
124 
132 
133  size_t getNonfinalizedTrxSize() const;
134 
141  std::vector<std::shared_ptr<Transaction>> getNonfinalizedTrx(const std::vector<trx_hash_t> &hashes);
142 
149  std::unordered_set<trx_hash_t> excludeFinalizedTransactions(const std::vector<trx_hash_t> &hashes);
150 
158  SharedTransactions getBlockTransactions(const DagBlock &blk, PbftPeriod proposal_period);
159 
167  SharedTransactions getTransactions(const vec_trx_t &trxs_hashes, PbftPeriod proposal_period);
168 
177  void updateFinalizedTransactionsStatus(const PeriodData &period_data);
178 
184  void initializeRecentlyFinalizedTransactions(const PeriodData &period_data);
185 
193  void removeNonFinalizedTransactions(std::unordered_set<trx_hash_t> &&transactions);
194 
200  std::shared_mutex &getTransactionsMutex() { return transactions_mutex_; }
201 
209  std::pair<std::vector<std::shared_ptr<Transaction>>, std::vector<trx_hash_t>> getPoolTransactions(
210  const std::vector<trx_hash_t> &trx_to_query) const;
211 
217  bool transactionsDropped() const;
218 
219  std::shared_ptr<Transaction> getTransaction(const trx_hash_t &hash) const;
220  std::shared_ptr<Transaction> getNonFinalizedTransaction(const trx_hash_t &hash) const;
221  unsigned long getTransactionCount() const;
223  std::pair<bool, std::string> verifyTransaction(const std::shared_ptr<Transaction> &trx) const;
224 
225  private:
227 
228  public:
230 
231  private:
233  // Guards updating transaction status
234  // Transactions can be in one of three states:
235  // 1. In transactions pool; 2. In non-finalized Dag block 3. Executed
236  mutable std::shared_mutex transactions_mutex_;
238  std::unordered_map<trx_hash_t, std::shared_ptr<Transaction>> nonfinalized_transactions_in_dag_;
239  std::unordered_map<trx_hash_t, std::shared_ptr<Transaction>> recently_finalized_transactions_;
240  std::unordered_map<PbftPeriod, std::vector<trx_hash_t>> recently_finalized_transactions_per_period_;
241  uint64_t trx_count_ = 0;
242 
243  const uint64_t kDagBlockGasLimit;
244  const uint64_t kEstimateGasLimit = 200000;
245  const uint64_t kRecentlyFinalizedTransactionsMax = 50000;
246 
247  std::shared_ptr<DbStorage> db_{nullptr};
248  std::shared_ptr<final_chain::FinalChain> final_chain_{nullptr};
249 
251 };
252 
255 } // namespace taraxa
Definition: FixedHash.h:35
DagBlock class is a DAG block class which main data is a list of transaction hashes included in the b...
Definition: dag_block.hpp:16
Definition: event.hpp:60
PeriodData class is for block execution, that includes PBFT block, certify votes, DAG blocks,...
Definition: period_data.hpp:25
std::shared_mutex transactions_mutex_
Definition: transaction_manager.hpp:236
uint64_t trx_count_
Definition: transaction_manager.hpp:241
std::unordered_map< trx_hash_t, std::shared_ptr< Transaction > > nonfinalized_transactions_in_dag_
Definition: transaction_manager.hpp:238
std::pair< bool, std::string > verifyTransaction(const std::shared_ptr< Transaction > &trx) const
Definition: transaction_manager.cpp:49
std::vector< SharedTransactions > getAllPoolTrxs()
Gets all transactions from pool grouped per account.
Definition: transaction_manager.cpp:326
util::Event< TransactionManager, h256 > const transaction_accepted_
Definition: transaction_manager.hpp:229
std::shared_ptr< Transaction > getTransaction(const trx_hash_t &hash) const
Definition: transaction_manager.cpp:176
size_t getNonfinalizedTrxSize() const
Definition: transaction_manager.cpp:268
void recoverNonfinalizedTransactions()
Definition: transaction_manager.cpp:227
std::unordered_set< trx_hash_t > excludeFinalizedTransactions(const std::vector< trx_hash_t > &hashes)
Exclude Finalized transactions.
Definition: transaction_manager.cpp:286
std::shared_ptr< Transaction > getNonFinalizedTransaction(const trx_hash_t &hash) const
std::shared_ptr< final_chain::FinalChain > final_chain_
Definition: transaction_manager.hpp:248
std::vector< std::shared_ptr< Transaction > > getNonfinalizedTrx(const std::vector< trx_hash_t > &hashes)
Get the Nonfinalized Trx objects from cache.
Definition: transaction_manager.cpp:273
const FullNodeConfig & kConf
Definition: transaction_manager.hpp:232
const uint64_t kRecentlyFinalizedTransactionsMax
Definition: transaction_manager.hpp:245
void blockFinalized(EthBlockNumber block_number)
Invoked when block finalized in final chain.
Definition: transaction_manager.cpp:439
std::pair< std::vector< std::shared_ptr< Transaction > >, std::vector< trx_hash_t > > getPoolTransactions(const std::vector< trx_hash_t > &trx_to_query) const
Gets transactions from transactions pool.
Definition: transaction_manager.cpp:161
bool isTransactionKnown(const trx_hash_t &trx_hash)
Definition: transaction_manager.cpp:79
TransactionStatus insertValidatedTransaction(std::shared_ptr< Transaction > &&tx, bool insert_non_proposable=true)
Inserts verified transaction to transaction pool.
Definition: transaction_manager.cpp:107
bool nonProposableTransactionsOverTheLimit() const
return true if non proposable transactions are over the limit
Definition: transaction_manager.cpp:258
size_t getTransactionPoolSize() const
Definition: transaction_manager.cpp:253
bool isTransactionPoolFull(size_t percentage=100) const
return true if transaction pool is full
Definition: transaction_manager.cpp:263
std::unordered_map< PbftPeriod, std::vector< trx_hash_t > > recently_finalized_transactions_per_period_
Definition: transaction_manager.hpp:240
const uint64_t kEstimateGasLimit
Definition: transaction_manager.hpp:244
SharedTransactions getTransactions(const vec_trx_t &trxs_hashes, PbftPeriod proposal_period)
Get the transactions.
Definition: transaction_manager.cpp:400
TransactionQueue transactions_pool_
Definition: transaction_manager.hpp:237
void updateFinalizedTransactionsStatus(const PeriodData &period_data)
Updates the status of transactions to finalized IMPORTANT: This method is invoked on finalizing a pbf...
Definition: transaction_manager.cpp:343
std::unordered_map< trx_hash_t, std::shared_ptr< Transaction > > recently_finalized_transactions_
Definition: transaction_manager.hpp:239
bool transactionsDropped() const
Have transactions been recently dropped due to queue reaching max size This call is thread-safe.
Definition: transaction_manager.cpp:444
SharedTransactions getBlockTransactions(const DagBlock &blk, PbftPeriod proposal_period)
Get the block transactions.
Definition: transaction_manager.cpp:396
void removeNonFinalizedTransactions(std::unordered_set< trx_hash_t > &&transactions)
Removes non-finalized transactions from discarded old dag blocks IMPORTANT: This method is invoked on...
Definition: transaction_manager.cpp:383
std::pair< SharedTransactions, std::vector< uint64_t > > packTrxs(PbftPeriod proposal_period, uint64_t weight_limit)
Gets transactions from pool to include in the block with specified weight limit.
Definition: transaction_manager.cpp:303
std::pair< bool, std::string > insertTransaction(const std::shared_ptr< Transaction > &trx)
Inserts and verify new transaction to transaction pool.
Definition: transaction_manager.cpp:83
uint64_t estimateTransactionGas(std::shared_ptr< Transaction > trx, std::optional< PbftPeriod > proposal_period) const
Estimates required gas value to execute transaction.
Definition: transaction_manager.cpp:26
std::shared_mutex & getTransactionsMutex()
Retrieves transactions mutex, only to be used when finalizing pbft block.
Definition: transaction_manager.hpp:200
void initializeRecentlyFinalizedTransactions(const PeriodData &period_data)
Initialize recently finalized transactions.
Definition: transaction_manager.cpp:331
addr_t getFullNodeAddress() const
const uint64_t kDagBlockGasLimit
Definition: transaction_manager.hpp:243
unsigned long getTransactionCount() const
Definition: transaction_manager.cpp:156
std::shared_ptr< DbStorage > db_
Definition: transaction_manager.hpp:247
void saveTransactionsFromDagBlock(const SharedTransactions &trxs)
Definition: transaction_manager.cpp:185
TransactionManager(const FullNodeConfig &conf, std::shared_ptr< DbStorage > db, std::shared_ptr< final_chain::FinalChain > final_chain, addr_t node_addr)
Definition: transaction_manager.cpp:12
TransactionManager class verifies and inserts incoming transactions in memory pool and handles saving...
Definition: transaction_manager.hpp:51
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
#define LOG_OBJECTS_DEFINE
Definition: logger.hpp:60
Definition: config.hpp:8
uint64_t EthBlockNumber
Definition: types.hpp:23
EthBlockNumber PbftPeriod
Definition: types.hpp:24
std::vector< SharedTransaction > SharedTransactions
Definition: transaction.hpp:81
std::vector< trx_hash_t > vec_trx_t
Definition: types.hpp:51
Definition: config.hpp:24