TARAXA
Loading...
Searching...
No Matches
dag_manager.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "dag.hpp"
5#include "dag/dag_block.hpp"
6#include "pbft/pbft_chain.hpp"
8#include "storage/storage.hpp"
10
11namespace taraxa {
12
16class Network;
17class DagBuffer;
18class FullNode;
19class KeyManager;
20struct DagConfig;
21
31class DagManager : public std::enable_shared_from_this<DagManager> {
32 public:
49
50 explicit DagManager(const FullNodeConfig &config, addr_t node_addr, std::shared_ptr<TransactionManager> trx_mgr,
51 std::shared_ptr<PbftChain> pbft_chain, std::shared_ptr<final_chain::FinalChain> final_chain,
52 std::shared_ptr<DbStorage> db, std::shared_ptr<KeyManager> key_manager);
53
54 DagManager(const DagManager &) = delete;
55 DagManager(DagManager &&) = delete;
56 DagManager &operator=(const DagManager &) = delete;
58
59 std::shared_ptr<DagManager> getShared();
60
61 void setNetwork(std::weak_ptr<Network> network) { network_ = std::move(network); }
62
67 bool isDagBlockKnown(const blk_hash_t &hash) const;
68
74 std::shared_ptr<DagBlock> getDagBlock(const blk_hash_t &hash) const;
75
82 std::pair<VerifyBlockReturnType, SharedTransactions> verifyBlock(
83 const std::shared_ptr<DagBlock> &blk,
84 const std::unordered_map<trx_hash_t, std::shared_ptr<Transaction>> &trxs = {});
85
91 std::pair<bool, std::vector<blk_hash_t>> pivotAndTipsAvailable(const std::shared_ptr<DagBlock> &blk);
92
100 std::pair<bool, std::vector<blk_hash_t>> addDagBlock(const std::shared_ptr<DagBlock> &blk,
101 SharedTransactions &&trxs = {}, bool proposed = false,
102 bool save = true); // insert to buffer if fail
103
111 vec_blk_t getDagBlockOrder(blk_hash_t const &anchor, PbftPeriod period);
112
124 uint setDagBlockOrder(blk_hash_t const &anchor, PbftPeriod period, vec_blk_t const &dag_order);
125
126 std::optional<std::pair<blk_hash_t, std::vector<blk_hash_t>>> getLatestPivotAndTips() const;
127
133 std::vector<blk_hash_t> getGhostPath(const blk_hash_t &source) const;
134
139 std::vector<blk_hash_t> getGhostPath() const; // get ghost path from last anchor
140
141 // ----- Total graph
142 void drawTotalGraph(std::string const &str) const;
143
144 // ----- Pivot graph
145 // can return self as pivot chain
146 void drawPivotGraph(std::string const &str) const;
147 void drawGraph(std::string const &dotfile) const;
148
149 std::pair<uint64_t, uint64_t> getNumVerticesInDag() const;
150 std::pair<uint64_t, uint64_t> getNumEdgesInDag() const;
151 level_t getMaxLevel() const { return max_level_; }
152
153 // DAG anchors
155 std::shared_lock lock(mutex_);
156 return period_;
157 }
158 std::pair<blk_hash_t, blk_hash_t> getAnchors() const {
159 std::shared_lock lock(mutex_);
160 return std::make_pair(old_anchor_, anchor_);
161 }
162
168 uint32_t getDagExpiryLimit() const { return dag_expiry_limit_; }
169
170 const std::pair<PbftPeriod, std::map<uint64_t, std::unordered_set<blk_hash_t>>> getNonFinalizedBlocks() const;
171
179 const std::tuple<PbftPeriod, std::vector<std::shared_ptr<DagBlock>>, SharedTransactions>
180 getNonFinalizedBlocksWithTransactions(const std::unordered_set<blk_hash_t> &known_hashes) const;
181
183
187 std::pair<size_t, size_t> getNonFinalizedBlocksSize() const;
188
189 uint32_t getNonFinalizedBlocksMinDifficulty() const;
190
192
198 std::shared_mutex &getDagMutex() { return mutex_; }
199
206
212 const DagConfig &getDagConfig() const { return dag_config_; }
213
219 uint64_t getDagExpiryLevel() const { return dag_expiry_level_; }
220
227
233 static dev::bytes getVdfMessage(blk_hash_t const &hash, SharedTransactions const &trxs);
234
240 static dev::bytes getVdfMessage(blk_hash_t const &hash, std::vector<trx_hash_t> const &trx_hashes);
241
242 private:
243 void recoverDag();
244 void addToDag(blk_hash_t const &hash, blk_hash_t const &pivot, std::vector<blk_hash_t> const &tips, uint64_t level,
245 bool finalized = false);
246 bool validateBlockNotExpired(const std::shared_ptr<DagBlock> &dag_block,
247 std::unordered_map<blk_hash_t, std::shared_ptr<DagBlock>> &expired_dag_blocks_to_remove);
248 void handleExpiredDagBlocksTransactions(const std::vector<trx_hash_t> &transactions_from_expired_dag_blocks) const;
249
250 std::pair<blk_hash_t, std::vector<blk_hash_t>> getFrontier() const; // return pivot and tips
251 void updateFrontier();
252 std::atomic<level_t> max_level_ = 0;
253 mutable std::shared_mutex mutex_;
254 mutable std::shared_mutex order_dag_blocks_mutex_;
255 std::shared_ptr<PivotTree> pivot_tree_; // only contains pivot edges
256 std::shared_ptr<Dag> total_dag_; // contains both pivot and tips
257 std::shared_ptr<TransactionManager> trx_mgr_;
258 std::shared_ptr<PbftChain> pbft_chain_;
259 std::weak_ptr<Network> network_;
260 std::shared_ptr<DbStorage> db_;
261 std::shared_ptr<KeyManager> key_manager_;
262 blk_hash_t anchor_; // anchor of the last period
263 blk_hash_t old_anchor_; // anchor of the second to last period
264 PbftPeriod period_; // last period
265 std::map<uint64_t, std::unordered_set<blk_hash_t>> non_finalized_blks_;
270 const std::shared_ptr<DagBlock> genesis_block_;
272 const uint32_t dag_expiry_limit_; // Any non finalized dag block with a level smaller by
273 // dag_expiry_limit_ than the current period anchor level is considered
274 // expired and it should be ignored or removed from DAG
275
276 std::atomic_uint64_t dag_expiry_level_ =
277 0; // Level below which dag blocks are considered expired, it's value is
278 // always current anchor level minus dag_expiry_limit_ of non empty pbft periods
279
280 const uint32_t cache_max_size_ = 10000;
281 const uint32_t cache_delete_step_ = 100;
283 std::shared_ptr<final_chain::FinalChain> final_chain_;
285 const uint64_t kValidatorMaxVote;
286
288};
289
292} // namespace taraxa
Definition util.hpp:346
Definition FixedHash.h:35
Definition event.hpp:60
blk_hash_t old_anchor_
Definition dag_manager.hpp:263
uint setDagBlockOrder(blk_hash_t const &anchor, PbftPeriod period, vec_blk_t const &dag_order)
Sets the dag block order on finalizing PBFT block IMPORTANT: This method is invoked on finalizing a p...
Definition dag_manager.cpp:283
void handleExpiredDagBlocksTransactions(const std::vector< trx_hash_t > &transactions_from_expired_dag_blocks) const
Definition dag_manager.cpp:378
const uint32_t max_levels_per_period_
Definition dag_manager.hpp:271
const uint64_t kValidatorMaxVote
Definition dag_manager.hpp:285
DagManager(DagManager &&)=delete
std::shared_ptr< PivotTree > pivot_tree_
Definition dag_manager.hpp:255
std::shared_ptr< KeyManager > key_manager_
Definition dag_manager.hpp:261
std::shared_ptr< TransactionManager > trx_mgr_
Definition dag_manager.hpp:257
bool validateBlockNotExpired(const std::shared_ptr< DagBlock > &dag_block, std::unordered_map< blk_hash_t, std::shared_ptr< DagBlock > > &expired_dag_blocks_to_remove)
Definition dag_manager.cpp:402
void setNetwork(std::weak_ptr< Network > network)
Definition dag_manager.hpp:61
VerifyBlockReturnType
return type of verifyBlock
Definition dag_manager.hpp:36
std::weak_ptr< Network > network_
Definition dag_manager.hpp:259
std::shared_ptr< PbftChain > pbft_chain_
Definition dag_manager.hpp:258
void drawGraph(std::string const &dotfile) const
Definition dag_manager.cpp:187
std::pair< uint64_t, uint64_t > getNumEdgesInDag() const
Definition dag_manager.cpp:72
bool isDagBlockKnown(const blk_hash_t &hash) const
Definition dag_manager.cpp:718
void updateFrontier()
Definition dag_manager.cpp:229
void drawTotalGraph(std::string const &str) const
Definition dag_manager.cpp:77
std::shared_ptr< Dag > total_dag_
Definition dag_manager.hpp:256
std::pair< VerifyBlockReturnType, SharedTransactions > verifyBlock(const std::shared_ptr< DagBlock > &blk, const std::unordered_map< trx_hash_t, std::shared_ptr< Transaction > > &trxs={})
Verifies new DAG block.
Definition dag_manager.cpp:571
blk_hash_t anchor_
Definition dag_manager.hpp:262
uint64_t getDagExpiryLevel() const
Retrieves Dag expiry level.
Definition dag_manager.hpp:219
void drawPivotGraph(std::string const &str) const
Definition dag_manager.cpp:82
static dev::bytes getVdfMessage(blk_hash_t const &hash, SharedTransactions const &trxs)
Retrieves VDF message from block hash and transactions.
Definition dag_manager.cpp:738
std::shared_mutex order_dag_blocks_mutex_
Definition dag_manager.hpp:254
const uint32_t dag_expiry_limit_
Definition dag_manager.hpp:272
DagManager & operator=(const DagManager &)=delete
std::shared_mutex & getDagMutex()
Retrieves Dag Manager mutex, only to be used when finalizing pbft block.
Definition dag_manager.hpp:198
std::pair< blk_hash_t, blk_hash_t > getAnchors() const
Definition dag_manager.hpp:158
std::atomic_uint64_t dag_expiry_level_
Definition dag_manager.hpp:276
DagManager & operator=(DagManager &&)=delete
std::pair< size_t, size_t > getNonFinalizedBlocksSize() const
Definition dag_manager.cpp:560
const uint32_t cache_delete_step_
Definition dag_manager.hpp:281
uint64_t getMaxLevelsPerPeriod() const
Retrieves max levels per period.
Definition dag_manager.hpp:226
const DagConfig & getDagConfig() const
Retrieves Dag config.
Definition dag_manager.hpp:212
std::shared_ptr< DbStorage > db_
Definition dag_manager.hpp:260
util::event::Event< DagManager, std::shared_ptr< DagBlock > > const block_verified_
Definition dag_manager.hpp:191
SortitionParamsManager sortition_params_manager_
Definition dag_manager.hpp:268
std::shared_mutex mutex_
Definition dag_manager.hpp:253
std::map< uint64_t, std::unordered_set< blk_hash_t > > non_finalized_blks_
Definition dag_manager.hpp:265
std::pair< uint64_t, uint64_t > getNumVerticesInDag() const
Definition dag_manager.cpp:67
DagManager(const DagManager &)=delete
std::shared_ptr< DagManager > getShared()
Definition dag_manager.cpp:58
DagFrontier frontier_
Definition dag_manager.hpp:267
PbftPeriod period_
Definition dag_manager.hpp:264
std::atomic< level_t > max_level_
Definition dag_manager.hpp:252
level_t getMaxLevel() const
Definition dag_manager.hpp:151
SortitionParamsManager & sortitionParamsManager()
Retrieves sortition manager.
Definition dag_manager.hpp:205
std::shared_ptr< DagBlock > getDagBlock(const blk_hash_t &hash) const
Gets dag block from either local memory cache or db.
Definition dag_manager.cpp:726
const GenesisConfig kGenesis
Definition dag_manager.hpp:284
const std::shared_ptr< DagBlock > genesis_block_
Definition dag_manager.hpp:270
PbftPeriod getLatestPeriod() const
Definition dag_manager.hpp:154
uint32_t non_finalized_blks_min_difficulty_
Definition dag_manager.hpp:266
DagFrontier getDagFrontier()
Definition dag_manager.cpp:124
std::vector< blk_hash_t > getGhostPath() const
Retrieves ghost path which is ordered list of non finalized pivot blocks for last anchor.
Definition dag_manager.cpp:248
ExpirationCacheMap< blk_hash_t, std::shared_ptr< DagBlock > > seen_blocks_
Definition dag_manager.hpp:282
std::pair< bool, std::vector< blk_hash_t > > addDagBlock(const std::shared_ptr< DagBlock > &blk, SharedTransactions &&trxs={}, bool proposed=false, bool save=true)
adds verified DAG block in the DAG
Definition dag_manager.cpp:129
std::shared_ptr< final_chain::FinalChain > final_chain_
Definition dag_manager.hpp:283
uint32_t getDagExpiryLimit() const
Retrieves Dag expiry limit.
Definition dag_manager.hpp:168
const std::tuple< PbftPeriod, std::vector< std::shared_ptr< DagBlock > >, SharedTransactions > getNonFinalizedBlocksWithTransactions(const std::unordered_set< blk_hash_t > &known_hashes) const
Retrieves current period together with non finalized blocks with the unique list of non finalized tra...
Definition dag_manager.cpp:527
void recoverDag()
Definition dag_manager.cpp:427
const uint32_t cache_max_size_
Definition dag_manager.hpp:280
vec_blk_t getDagBlockOrder(blk_hash_t const &anchor, PbftPeriod period)
Retrieves DAG block order for specified anchor. Order should always be the same for the same anchor i...
Definition dag_manager.cpp:255
uint32_t getNonFinalizedBlocksMinDifficulty() const
Definition dag_manager.cpp:555
void addToDag(blk_hash_t const &hash, blk_hash_t const &pivot, std::vector< blk_hash_t > const &tips, uint64_t level, bool finalized=false)
Definition dag_manager.cpp:193
std::pair< bool, std::vector< blk_hash_t > > pivotAndTipsAvailable(const std::shared_ptr< DagBlock > &blk)
Checks if block pivot and tips are in DAG.
Definition dag_manager.cpp:87
const DagConfig & dag_config_
Definition dag_manager.hpp:269
std::pair< blk_hash_t, std::vector< blk_hash_t > > getFrontier() const
Definition dag_manager.cpp:213
const std::pair< PbftPeriod, std::map< uint64_t, std::unordered_set< blk_hash_t > > > getNonFinalizedBlocks() const
Definition dag_manager.cpp:520
std::optional< std::pair< blk_hash_t, std::vector< blk_hash_t > > > getLatestPivotAndTips() const
Definition dag_manager.cpp:208
DagManager class contains in memory representation of part of the DAG that is not yet finalized in a ...
Definition dag_manager.hpp:31
SortitionParamsManager class calculates DAG efficiency and makes VDF difficulty adjustments.
Definition sortition_params_manager.hpp:36
#define LOG_OBJECTS_DEFINE
Definition logger.hpp:60
std::vector<::byte > bytes
Definition Common.h:46
Definition app.hpp:16
std::vector< blk_hash_t > vec_blk_t
Definition types.hpp:50
uint256_hash_t blk_hash_t
Definition types.hpp:42
EthBlockNumber PbftPeriod
Definition types.hpp:24
std::vector< SharedTransaction > SharedTransactions
Definition transaction.hpp:86
uint64_t level_t
Definition types.hpp:46
Definition dag_config.hpp:17
Definition dag_block.hpp:122
Definition config.hpp:40
Definition genesis.hpp:23