TARAXA
storage.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <rocksdb/db.h>
4 #include <rocksdb/options.h>
5 #include <rocksdb/slice.h>
6 #include <rocksdb/write_batch.h>
7 
8 #include <filesystem>
9 #include <functional>
10 #include <regex>
11 
12 #include "common/types.hpp"
13 #include "dag/dag_block.hpp"
14 #include "logger/logger.hpp"
15 #include "pbft/pbft_block.hpp"
16 #include "pbft/period_data.hpp"
20 #include "vote/pillar_vote.hpp"
22 
23 namespace taraxa {
24 namespace fs = std::filesystem;
25 struct SortitionParamsChange;
26 
27 namespace pillar_chain {
28 struct PillarBlockData;
29 class PillarBlock;
30 } // namespace pillar_chain
31 
32 namespace final_chain {
33 struct TransactionLocation;
34 } // namespace final_chain
35 
36 enum StatusDbField : uint8_t {
44 };
45 
46 enum class PbftMgrField : uint8_t { Round = 0, Step };
47 
48 enum PbftMgrStatus : uint8_t {
53 };
54 
55 enum class DBMetaKeys { LAST_NUMBER = 1 };
56 
57 class DbException : public std::exception {
58  public:
59  explicit DbException(const std::string& desc) : desc_(desc) {}
60  virtual ~DbException() = default;
61 
62  DbException(const DbException&) = default;
63  DbException(DbException&&) = default;
64  DbException& operator=(const DbException&) = delete;
66 
67  virtual const char* what() const noexcept { return desc_.c_str(); }
68 
69  private:
70  const std::string desc_;
71 };
72 
73 using Batch = rocksdb::WriteBatch;
75 using OnEntry = std::function<void(Slice const&, Slice const&)>;
76 
77 class DbStorage : public std::enable_shared_from_this<DbStorage> {
78  public:
79  class Column {
80  string const name_;
81 
82  public:
83  size_t const ordinal_;
84  const rocksdb::Comparator* comparator_;
85 
86  Column(string name, size_t ordinal, const rocksdb::Comparator* comparator)
87  : name_(std::move(name)), ordinal_(ordinal), comparator_(comparator) {}
88 
89  Column(string name, size_t ordinal) : name_(std::move(name)), ordinal_(ordinal), comparator_(nullptr) {}
90 
91  auto const& name() const { return ordinal_ ? name_ : rocksdb::kDefaultColumnFamilyName; }
92  };
93 
94  class Columns {
95  static inline std::vector<Column> all_;
96 
97  public:
98  static inline auto const& all = all_;
99 
100 #define COLUMN(__name__) static inline auto const __name__ = all_.emplace_back(#__name__, all_.size())
101 #define COLUMN_W_COMP(__name__, ...) \
102  static inline auto const __name__ = all_.emplace_back(#__name__, all_.size(), __VA_ARGS__)
103 
104  // do not change/move
105  COLUMN(default_column);
106  // migrations
107  COLUMN(migrations);
108  // Contains full data for an executed PBFT block including PBFT block, cert votes, dag blocks and transactions
109  COLUMN_W_COMP(period_data, getIntComparator<PbftPeriod>());
110  COLUMN(genesis);
111  COLUMN(dag_blocks);
112  COLUMN_W_COMP(dag_blocks_level, getIntComparator<uint64_t>());
113  COLUMN(transactions);
114  COLUMN(trx_period);
115  COLUMN(status);
116  COLUMN(pbft_mgr_round_step);
117  COLUMN(pbft_mgr_status);
118  COLUMN(cert_voted_block_in_round); // Cert voted block + round -> node voted for this block
119  COLUMN(proposed_pbft_blocks); // Proposed pbft blocks
120  COLUMN(pbft_head);
121  COLUMN(latest_round_own_votes); // own votes of any type for the latest round
122  COLUMN(latest_round_two_t_plus_one_votes); // 2t+1 votes bundles of any type for the latest round
123  COLUMN(extra_reward_votes); // extra reward votes on top of 2t+1 cert votes bundle from
124  // latest_round_two_t_plus_one_votes
125  COLUMN(pbft_block_period);
126  COLUMN(dag_block_period);
127  COLUMN_W_COMP(proposal_period_levels_map, getIntComparator<uint64_t>());
128  COLUMN(final_chain_meta);
129  COLUMN(final_chain_blk_by_number);
130  COLUMN(final_chain_blk_hash_by_number);
131  COLUMN(final_chain_blk_number_by_hash);
132  COLUMN(final_chain_receipt_by_trx_hash);
133  COLUMN(final_chain_log_blooms_index);
134  COLUMN_W_COMP(sortition_params_change, getIntComparator<PbftPeriod>());
135 
136  COLUMN_W_COMP(block_rewards_stats, getIntComparator<uint64_t>());
137 
138  // Finalized pillar blocks
139  COLUMN_W_COMP(pillar_block, getIntComparator<PbftPeriod>());
140  // Current pillar block data - current pillar block + current vote counts
141  COLUMN(current_pillar_block_data);
142  // Current pillar block own pillar vote
143  COLUMN(current_pillar_block_own_vote);
144  // system transactions that is not a part of the block
145  COLUMN(system_transaction);
146  // system transactions hashes by period
147  COLUMN(period_system_transactions);
148 
149 #undef COLUMN
150 #undef COLUMN_W_COMP
151  };
152 
153  auto handle(Column const& col) const { return handles_[col.ordinal_]; }
154 
155  private:
156  fs::path path_;
157  fs::path db_path_;
158  fs::path state_db_path_;
159  const std::string kDbDir = "db";
160  const std::string kStateDbDir = "state_db";
161  std::unique_ptr<rocksdb::DB> db_;
162  std::vector<rocksdb::ColumnFamilyHandle*> handles_;
163  rocksdb::ReadOptions read_options_;
164  rocksdb::WriteOptions write_options_;
165  std::mutex dag_blocks_mutex_;
166  std::atomic<uint64_t> dag_blocks_count_;
167  std::atomic<uint64_t> dag_edge_count_;
168  const uint32_t kDbSnapshotsEachNblock = 0;
169  std::atomic<bool> snapshots_enabled_ = true;
170  const uint32_t kDbSnapshotsMaxCount = 0;
171  std::set<PbftPeriod> snapshots_;
172 
173  uint32_t kMajorVersion_;
176 
178 
179  public:
180  explicit DbStorage(fs::path const& base_path, uint32_t db_snapshot_each_n_pbft_block = 0, uint32_t max_open_files = 0,
181  uint32_t db_max_snapshots = 0, PbftPeriod db_revert_to_period = 0, addr_t node_addr = addr_t(),
182  bool rebuild = false);
183  ~DbStorage();
184 
185  DbStorage(const DbStorage&) = delete;
186  DbStorage(DbStorage&&) = delete;
187  DbStorage& operator=(const DbStorage&) = delete;
189 
190  auto const& path() const { return path_; }
191  auto dbStoragePath() const { return db_path_; }
192  auto stateDbStoragePath() const { return state_db_path_; }
193  static Batch createWriteBatch();
194  void commitWriteBatch(Batch& write_batch, rocksdb::WriteOptions const& opts);
195  void commitWriteBatch(Batch& write_batch) { commitWriteBatch(write_batch, write_options_); }
196 
197  void rebuildColumns(const rocksdb::Options& options);
198  bool createSnapshot(PbftPeriod period);
199  void deleteSnapshot(PbftPeriod period);
200  void recoverToPeriod(PbftPeriod period);
201  void loadSnapshots();
202  void disableSnapshots();
203  void enableSnapshots();
204  void updateDbVersions();
205  void deleteColumnData(const Column& c);
206 
207  void replaceColumn(const Column& to_be_replaced_col, std::unique_ptr<rocksdb::ColumnFamilyHandle>&& replacing_col);
208  std::unique_ptr<rocksdb::ColumnFamilyHandle> copyColumn(rocksdb::ColumnFamilyHandle* orig_column,
209  const std::string& new_col_name, bool move_data = false);
210 
211  // For removal of LOG.old.* files in the database
212  void removeTempFiles() const;
213  void removeFilesWithPattern(const std::string& directory, const std::regex& pattern) const;
214  void deleteTmpDirectories(const std::string& path) const;
215 
216  uint32_t getMajorVersion() const;
217  std::unique_ptr<rocksdb::Iterator> getColumnIterator(const Column& c);
218  std::unique_ptr<rocksdb::Iterator> getColumnIterator(rocksdb::ColumnFamilyHandle* c);
219 
220  // Genesis
221  void setGenesisHash(const h256& genesis_hash);
222  std::optional<h256> getGenesisHash();
223 
224  // Period data
225  void savePeriodData(const PeriodData& period_data, Batch& write_batch);
226  void clearPeriodDataHistory(PbftPeriod period, uint64_t dag_level_to_keep);
227  dev::bytes getPeriodDataRaw(PbftPeriod period) const;
228  std::optional<PbftBlock> getPbftBlock(PbftPeriod period) const;
229  std::vector<std::shared_ptr<PbftVote>> getPeriodCertVotes(PbftPeriod period) const;
231  std::optional<SharedTransactions> getPeriodTransactions(PbftPeriod period) const;
232  std::vector<std::shared_ptr<PillarVote>> getPeriodPillarVotes(PbftPeriod period) const;
233 
234  // Pillar chain
235  void savePillarBlock(const std::shared_ptr<pillar_chain::PillarBlock>& pillar_block);
236  std::shared_ptr<pillar_chain::PillarBlock> getPillarBlock(PbftPeriod period) const;
237  std::shared_ptr<pillar_chain::PillarBlock> getLatestPillarBlock() const;
238  void saveOwnPillarBlockVote(const std::shared_ptr<PillarVote>& vote);
239  std::shared_ptr<PillarVote> getOwnPillarBlockVote() const;
240  void saveCurrentPillarBlockData(const pillar_chain::CurrentPillarBlockDataDb& current_pillar_block_data);
241  std::optional<pillar_chain::CurrentPillarBlockDataDb> getCurrentPillarBlockData() const;
242 
243  // DAG
244  void saveDagBlock(DagBlock const& blk, Batch* write_batch_p = nullptr);
245  std::shared_ptr<DagBlock> getDagBlock(blk_hash_t const& hash);
246  bool dagBlockInDb(blk_hash_t const& hash);
247  std::set<blk_hash_t> getBlocksByLevel(level_t level);
248  level_t getLastBlocksLevel() const;
249  std::vector<std::shared_ptr<DagBlock>> getDagBlocksAtLevel(level_t level, int number_of_levels);
250  void updateDagBlockCounters(std::vector<DagBlock> blks);
251  std::map<level_t, std::vector<DagBlock>> getNonfinalizedDagBlocks();
252  void removeDagBlockBatch(Batch& write_batch, blk_hash_t const& hash);
253  void removeDagBlock(blk_hash_t const& hash);
254  // Sortition params
255  void saveSortitionParamsChange(PbftPeriod period, const SortitionParamsChange& params, Batch& batch);
256  std::deque<SortitionParamsChange> getLastSortitionParams(size_t count);
257  std::optional<SortitionParamsChange> getParamsChangeForPeriod(PbftPeriod period);
258 
259  // Transaction
260  std::shared_ptr<Transaction> getTransaction(trx_hash_t const& hash);
262  bool transactionInDb(trx_hash_t const& hash);
263  bool transactionFinalized(trx_hash_t const& hash);
264  std::vector<bool> transactionsInDb(std::vector<trx_hash_t> const& trx_hashes);
265  std::vector<bool> transactionsFinalized(std::vector<trx_hash_t> const& trx_hashes);
266  void addTransactionToBatch(Transaction const& trx, Batch& write_batch);
267  void removeTransactionToBatch(trx_hash_t const& trx, Batch& write_batch);
268 
269  void addTransactionLocationToBatch(Batch& write_batch, trx_hash_t const& trx, PbftPeriod period, uint32_t position,
270  bool is_system = false);
271  std::optional<final_chain::TransactionLocation> getTransactionLocation(trx_hash_t const& hash) const;
272  std::unordered_map<trx_hash_t, PbftPeriod> getAllTransactionPeriod();
273  uint64_t getTransactionCount(PbftPeriod period) const;
281  SharedTransactions getFinalizedTransactions(std::vector<trx_hash_t> const& trx_hashes) const;
282 
283  // System transaction
284  void addSystemTransactionToBatch(Batch& write_batch, SharedTransaction trx);
285  std::shared_ptr<Transaction> getSystemTransaction(const trx_hash_t& hash) const;
286  void addPeriodSystemTransactions(Batch& write_batch, SharedTransactions trxs, PbftPeriod period);
287  std::vector<trx_hash_t> getPeriodSystemTransactionsHashes(PbftPeriod period) const;
289 
290  // PBFT manager
291  uint32_t getPbftMgrField(PbftMgrField field);
292  void savePbftMgrField(PbftMgrField field, uint32_t value);
293  void addPbftMgrFieldToBatch(PbftMgrField field, uint32_t value, Batch& write_batch);
294 
295  bool getPbftMgrStatus(PbftMgrStatus field);
296  void savePbftMgrStatus(PbftMgrStatus field, bool const& value);
297  void addPbftMgrStatusToBatch(PbftMgrStatus field, bool const& value, Batch& write_batch);
298 
299  void saveCertVotedBlockInRound(PbftRound round, const std::shared_ptr<PbftBlock>& block);
300  std::optional<std::pair<PbftRound, std::shared_ptr<PbftBlock>>> getCertVotedBlockInRound() const;
301  void removeCertVotedBlockInRound(Batch& write_batch);
302 
303  // pbft_blocks
304  std::optional<PbftBlock> getPbftBlock(blk_hash_t const& hash);
305  bool pbftBlockInDb(blk_hash_t const& hash);
306 
307  // Proposed pbft blocks
308  void saveProposedPbftBlock(const std::shared_ptr<PbftBlock>& block);
309  void removeProposedPbftBlock(const blk_hash_t& block_hash, Batch& write_batch);
310  std::vector<std::shared_ptr<PbftBlock>> getProposedPbftBlocks();
311 
312  // pbft_blocks (head)
313  string getPbftHead(blk_hash_t const& hash);
314  void savePbftHead(blk_hash_t const& hash, string const& pbft_chain_head_str);
315  void addPbftHeadToBatch(taraxa::blk_hash_t const& head_hash, std::string const& head_str, Batch& write_batch);
316 
317  // status
318  uint64_t getStatusField(StatusDbField const& field);
319  void saveStatusField(StatusDbField const& field, uint64_t value);
320  void addStatusFieldToBatch(StatusDbField const& field, uint64_t value, Batch& write_batch);
321 
322  // Own votes for the latest round
323  void saveOwnVerifiedVote(const std::shared_ptr<PbftVote>& vote);
324  std::vector<std::shared_ptr<PbftVote>> getOwnVerifiedVotes();
325  void clearOwnVerifiedVotes(Batch& write_batch, const std::vector<std::shared_ptr<PbftVote>>& own_verified_votes);
326 
327  // 2t+1 votes bundles for the latest round
328  void replaceTwoTPlusOneVotes(TwoTPlusOneVotedBlockType type, const std::vector<std::shared_ptr<PbftVote>>& votes);
330  const std::vector<std::shared_ptr<PbftVote>>& votes, Batch& write_batch);
331  std::vector<std::shared_ptr<PbftVote>> getAllTwoTPlusOneVotes();
332 
333  // Reward votes - cert votes for the latest finalized block
334  void removeExtraRewardVotes(const std::vector<vote_hash_t>& votes, Batch& write_batch);
335  void saveExtraRewardVote(const std::shared_ptr<PbftVote>& vote);
336  std::vector<std::shared_ptr<PbftVote>> getRewardVotes();
337 
338  // period_pbft_block
339  void addPbftBlockPeriodToBatch(PbftPeriod period, taraxa::blk_hash_t const& pbft_block_hash, Batch& write_batch);
340  std::pair<bool, PbftPeriod> getPeriodFromPbftHash(taraxa::blk_hash_t const& pbft_block_hash);
341  // dag_block_period
342  std::shared_ptr<std::pair<PbftPeriod, uint32_t>> getDagBlockPeriod(blk_hash_t const& hash);
343  void addDagBlockPeriodToBatch(blk_hash_t const& hash, PbftPeriod period, uint32_t position, Batch& write_batch);
344 
345  uint64_t getDagBlocksCount() const { return dag_blocks_count_.load(); }
346  uint64_t getDagEdgeCount() const { return dag_edge_count_.load(); }
347 
351 
352  std::vector<blk_hash_t> getFinalizedDagBlockHashesByPeriod(PbftPeriod period);
353  std::vector<std::shared_ptr<DagBlock>> getFinalizedDagBlockByPeriod(PbftPeriod period);
354  std::pair<blk_hash_t, std::vector<std::shared_ptr<DagBlock>>> getLastPbftBlockHashAndFinalizedDagBlockByPeriod(
355  PbftPeriod period);
356 
357  // DPOS level to proposal period map
358  std::optional<uint64_t> getProposalPeriodForDagLevel(uint64_t level);
359  void saveProposalPeriodDagLevelsMap(uint64_t level, PbftPeriod period);
360  void addProposalPeriodDagLevelsMapToBatch(uint64_t level, PbftPeriod period, Batch& write_batch);
361 
364 
365  void compactColumn(Column const& column) { db_->CompactRange({}, handle(column), nullptr, nullptr); }
366 
367  inline static bytes asBytes(string const& b) {
368  return bytes((byte const*)b.data(), (byte const*)(b.data() + b.size()));
369  }
370 
371  template <typename T>
372  inline static Slice make_slice(T const* begin, size_t size) {
373  if (!size) {
374  return {};
375  }
376  return {reinterpret_cast<char const*>(begin), size};
377  }
378 
379  inline static Slice toSlice(dev::bytesConstRef const& b) { return make_slice(b.data(), b.size()); }
380 
381  template <unsigned N>
382  inline static Slice toSlice(dev::FixedHash<N> const& h) {
383  return make_slice(h.data(), N);
384  }
385 
386  inline static Slice toSlice(dev::bytes const& b) { return make_slice(b.data(), b.size()); }
387 
388  template <class N>
389  inline static auto toSlice(N const& n) -> std::enable_if_t<std::is_integral_v<N> || std::is_enum_v<N>, Slice> {
390  return make_slice(&n, sizeof(N));
391  }
392 
393  inline static Slice toSlice(string const& str) { return make_slice(str.data(), str.size()); }
394 
395  inline static auto const& toSlice(Slice const& s) { return s; }
396 
397  template <typename T>
398  inline static auto toSlices(std::vector<T> const& keys) {
399  std::vector<Slice> ret;
400  ret.reserve(keys.size());
401  for (auto const& k : keys) {
402  ret.emplace_back(toSlice(k));
403  }
404  return ret;
405  }
406 
407  inline static auto const& toSlices(std::vector<Slice> const& ss) { return ss; }
408 
409  template <typename K>
410  std::string lookup(K const& key, Column const& column) const {
411  std::string value;
412  auto status = db_->Get(read_options_, handle(column), toSlice(key), &value);
413  if (status.IsNotFound()) {
414  return value;
415  }
416  checkStatus(status);
417  return value;
418  }
419 
420  template <typename Int, typename K>
421  auto lookup_int(K const& key, Column const& column) -> std::enable_if_t<std::is_integral_v<Int>, std::optional<Int>> {
422  auto str = lookup(key, column);
423  if (str.empty()) {
424  return std::nullopt;
425  }
426  return *reinterpret_cast<Int*>(str.data());
427  }
428 
429  template <typename K>
430  bool exist(K const& key, Column const& column) {
431  std::string value;
432  // KeyMayExist can lead to a few false positives, but not false negatives.
433  if (db_->KeyMayExist(read_options_, handle(column), toSlice(key), &value)) {
434  auto status = db_->Get(read_options_, handle(column), toSlice(key), &value);
435  if (status.IsNotFound()) {
436  return false;
437  }
438  checkStatus(status);
439  return !value.empty();
440  }
441  return false;
442  }
443 
444  static void checkStatus(rocksdb::Status const& status);
445 
446  template <typename K, typename V>
447  void insert(rocksdb::ColumnFamilyHandle* col, const K& k, const V& v) {
448  checkStatus(db_->Put(write_options_, col, toSlice(k), toSlice(v)));
449  }
450 
451  template <typename K, typename V>
452  void insert(Column const& col, K const& k, V const& v) {
453  checkStatus(db_->Put(write_options_, handle(col), toSlice(k), toSlice(v)));
454  }
455 
456  template <typename K, typename V>
457  void insert(Batch& batch, Column const& col, K const& k, V const& v) {
458  checkStatus(batch.Put(handle(col), toSlice(k), toSlice(v)));
459  }
460 
461  template <typename K, typename V>
462  void insert(Batch& batch, rocksdb::ColumnFamilyHandle* col, K const& k, V const& v) {
463  checkStatus(batch.Put(col, toSlice(k), toSlice(v)));
464  }
465 
466  template <typename K>
467  void remove(Column const& col, K const& k) {
468  checkStatus(db_->Delete(write_options_, handle(col), toSlice(k)));
469  }
470 
471  template <typename K>
472  void remove(Batch& batch, Column const& col, K const& k) {
473  checkStatus(batch.Delete(handle(col), toSlice(k)));
474  }
475 
476  void forEach(Column const& col, OnEntry const& f);
477 };
478 
479 } // namespace taraxa
Definition: FixedHash.h:35
::byte * data()
Definition: FixedHash.h:189
size_t size() const
Definition: vector_ref.h:82
_T * data() const
Definition: vector_ref.h:76
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: storage.hpp:57
DbException & operator=(DbException &&)=delete
virtual ~DbException()=default
const std::string desc_
Definition: storage.hpp:70
DbException(const std::string &desc)
Definition: storage.hpp:59
DbException(const DbException &)=default
DbException(DbException &&)=default
DbException & operator=(const DbException &)=delete
virtual const char * what() const noexcept
Definition: storage.hpp:67
Definition: storage.hpp:79
const rocksdb::Comparator * comparator_
Definition: storage.hpp:84
Column(string name, size_t ordinal, const rocksdb::Comparator *comparator)
Definition: storage.hpp:86
size_t const ordinal_
Definition: storage.hpp:83
auto const & name() const
Definition: storage.hpp:91
Column(string name, size_t ordinal)
Definition: storage.hpp:89
string const name_
Definition: storage.hpp:80
Definition: storage.hpp:94
static auto const & all
Definition: storage.hpp:98
COLUMN(period_system_transactions)
COLUMN(cert_voted_block_in_round)
COLUMN_W_COMP(dag_blocks_level, getIntComparator< uint64_t >())
COLUMN(current_pillar_block_own_vote)
COLUMN(final_chain_meta)
COLUMN(dag_block_period)
COLUMN_W_COMP(pillar_block, getIntComparator< PbftPeriod >())
COLUMN(final_chain_receipt_by_trx_hash)
COLUMN_W_COMP(block_rewards_stats, getIntComparator< uint64_t >())
COLUMN(final_chain_blk_by_number)
COLUMN(extra_reward_votes)
COLUMN(final_chain_blk_hash_by_number)
COLUMN(pbft_block_period)
COLUMN(latest_round_two_t_plus_one_votes)
COLUMN(system_transaction)
COLUMN(final_chain_log_blooms_index)
COLUMN(latest_round_own_votes)
COLUMN_W_COMP(proposal_period_levels_map, getIntComparator< uint64_t >())
COLUMN(pbft_mgr_round_step)
static std::vector< Column > all_
Definition: storage.hpp:95
COLUMN_W_COMP(period_data, getIntComparator< PbftPeriod >())
COLUMN(pbft_mgr_status)
COLUMN(proposed_pbft_blocks)
COLUMN_W_COMP(sortition_params_change, getIntComparator< PbftPeriod >())
COLUMN(current_pillar_block_data)
COLUMN(final_chain_blk_number_by_hash)
Definition: storage.hpp:77
void addStatusFieldToBatch(StatusDbField const &field, uint64_t value, Batch &write_batch)
Definition: storage.cpp:1027
void addDagBlockPeriodToBatch(blk_hash_t const &hash, PbftPeriod period, uint32_t position, Batch &write_batch)
Definition: storage.cpp:1238
static auto const & toSlices(std::vector< Slice > const &ss)
Definition: storage.hpp:407
uint64_t getTransactionCount(PbftPeriod period) const
Definition: storage.cpp:862
std::atomic< uint64_t > dag_blocks_count_
Definition: storage.hpp:166
SharedTransactions getPeriodSystemTransactions(PbftPeriod period) const
Definition: storage.cpp:927
static auto toSlices(std::vector< T > const &keys)
Definition: storage.hpp:398
bool dagBlockInDb(blk_hash_t const &hash)
Definition: storage.cpp:449
void remove(Batch &batch, Column const &col, K const &k)
Definition: storage.hpp:472
std::shared_ptr< DagBlock > getDagBlock(blk_hash_t const &hash)
Definition: storage.cpp:432
fs::path db_path_
Definition: storage.hpp:157
void disableSnapshots()
Definition: storage.cpp:383
std::vector< std::shared_ptr< PbftVote > > getAllTwoTPlusOneVotes()
Definition: storage.cpp:1167
std::optional< uint64_t > getProposalPeriodForDagLevel(uint64_t level)
Definition: storage.cpp:1291
std::mutex dag_blocks_mutex_
Definition: storage.hpp:165
uint32_t getPbftMgrField(PbftMgrField field)
Definition: storage.cpp:1033
void saveProposedPbftBlock(const std::shared_ptr< PbftBlock > &block)
Definition: storage.cpp:807
void removeProposedPbftBlock(const blk_hash_t &block_hash, Batch &write_batch)
Definition: storage.cpp:811
void commitWriteBatch(Batch &write_batch, rocksdb::WriteOptions const &opts)
Definition: storage.cpp:426
void addProposalPeriodDagLevelsMapToBatch(uint64_t level, PbftPeriod period, Batch &write_batch)
Definition: storage.cpp:1310
void saveCertVotedBlockInRound(PbftRound round, const std::shared_ptr< PbftBlock > &block)
Definition: storage.cpp:1070
std::unordered_map< trx_hash_t, PbftPeriod > getAllTransactionPeriod()
Definition: storage.cpp:794
void saveOwnPillarBlockVote(const std::shared_ptr< PillarVote > &vote)
Definition: storage.cpp:730
rocksdb::WriteOptions write_options_
Definition: storage.hpp:164
std::shared_ptr< pillar_chain::PillarBlock > getPillarBlock(PbftPeriod period) const
Definition: storage.cpp:711
void addPbftMgrStatusToBatch(PbftMgrStatus field, bool const &value, Batch &write_batch)
Definition: storage.cpp:1066
void removeExtraRewardVotes(const std::vector< vote_hash_t > &votes, Batch &write_batch)
Definition: storage.cpp:1187
void rebuildColumns(const rocksdb::Options &options)
Definition: storage.cpp:219
void addTransactionLocationToBatch(Batch &write_batch, trx_hash_t const &trx, PbftPeriod period, uint32_t position, bool is_system=false)
Definition: storage.cpp:756
blk_hash_t getPeriodBlockHash(PbftPeriod period) const
Definition: storage.cpp:834
std::vector< std::shared_ptr< PbftBlock > > getProposedPbftBlocks()
Definition: storage.cpp:815
std::vector< std::shared_ptr< DagBlock > > getDagBlocksAtLevel(level_t level, int number_of_levels)
Definition: storage.cpp:473
std::shared_ptr< Transaction > getTransaction(trx_hash_t const &hash)
Definition: storage.cpp:842
std::shared_ptr< PillarVote > getOwnPillarBlockVote() const
Definition: storage.cpp:734
std::atomic< bool > snapshots_enabled_
Definition: storage.hpp:169
uint32_t kMajorVersion_
Definition: storage.hpp:173
const uint32_t kDbSnapshotsMaxCount
Definition: storage.hpp:170
void addPeriodSystemTransactions(Batch &write_batch, SharedTransactions trxs, PbftPeriod period)
Definition: storage.cpp:910
std::optional< h256 > getGenesisHash()
Definition: storage.cpp:393
void compactColumn(Column const &column)
Definition: storage.hpp:365
SharedTransactions getAllNonfinalizedTransactions()
Definition: storage.cpp:498
void insert(Batch &batch, Column const &col, K const &k, V const &v)
Definition: storage.hpp:457
auto stateDbStoragePath() const
Definition: storage.hpp:192
uint64_t getDagBlocksCount() const
Definition: storage.hpp:345
std::vector< blk_hash_t > getFinalizedDagBlockHashesByPeriod(PbftPeriod period)
Definition: storage.cpp:1247
bool transactionInDb(trx_hash_t const &hash)
Definition: storage.cpp:993
void saveOwnVerifiedVote(const std::shared_ptr< PbftVote > &vote)
Definition: storage.cpp:1122
bool minor_version_changed_
Definition: storage.hpp:175
bool createSnapshot(PbftPeriod period)
Definition: storage.cpp:302
SharedTransactions getFinalizedTransactions(std::vector< trx_hash_t > const &trx_hashes) const
Gets finalized transactions from provided hashes.
Definition: storage.cpp:871
void saveStatusField(StatusDbField const &field, uint64_t value)
Definition: storage.cpp:1023
void saveCurrentPillarBlockData(const pillar_chain::CurrentPillarBlockDataDb &current_pillar_block_data)
Definition: storage.cpp:743
rocksdb::ReadOptions read_options_
Definition: storage.hpp:163
std::unique_ptr< rocksdb::DB > db_
Definition: storage.hpp:161
bool exist(K const &key, Column const &column)
Definition: storage.hpp:430
void saveExtraRewardVote(const std::shared_ptr< PbftVote > &vote)
Definition: storage.cpp:1193
void removeDagBlock(blk_hash_t const &hash)
Definition: storage.cpp:511
fs::path path_
Definition: storage.hpp:156
void insert(Column const &col, K const &k, V const &v)
Definition: storage.hpp:452
std::vector< bool > transactionsInDb(std::vector< trx_hash_t > const &trx_hashes)
Definition: storage.cpp:1001
std::pair< blk_hash_t, std::vector< std::shared_ptr< DagBlock > > > getLastPbftBlockHashAndFinalizedDagBlockByPeriod(PbftPeriod period)
Definition: storage.cpp:1274
void savePeriodData(const PeriodData &period_data, Batch &write_batch)
Definition: storage.cpp:680
void deleteColumnData(const Column &c)
Definition: storage.cpp:208
auto const & path() const
Definition: storage.hpp:190
void recoverToPeriod(PbftPeriod period)
Definition: storage.cpp:335
fs::path state_db_path_
Definition: storage.hpp:158
static bytes asBytes(string const &b)
Definition: storage.hpp:367
std::shared_ptr< pillar_chain::PillarBlock > getLatestPillarBlock() const
Definition: storage.cpp:720
bool getPbftMgrStatus(PbftMgrStatus field)
Definition: storage.cpp:1052
bool major_version_changed_
Definition: storage.hpp:174
void savePillarBlock(const std::shared_ptr< pillar_chain::PillarBlock > &pillar_block)
Definition: storage.cpp:707
void clearPeriodDataHistory(PbftPeriod period, uint64_t dag_level_to_keep)
Definition: storage.cpp:591
void savePbftMgrField(PbftMgrField field, uint32_t value)
Definition: storage.cpp:1044
std::optional< std::pair< PbftRound, std::shared_ptr< PbftBlock > > > getCertVotedBlockInRound() const
Definition: storage.cpp:1079
static Slice make_slice(T const *begin, size_t size)
Definition: storage.hpp:372
std::vector< bool > transactionsFinalized(std::vector< trx_hash_t > const &trx_hashes)
Definition: storage.cpp:784
bool transactionFinalized(trx_hash_t const &hash)
Definition: storage.cpp:997
std::deque< SortitionParamsChange > getLastSortitionParams(size_t count)
Definition: storage.cpp:566
static Slice toSlice(string const &str)
Definition: storage.hpp:393
static auto toSlice(N const &n) -> std::enable_if_t< std::is_integral_v< N >||std::is_enum_v< N >, Slice >
Definition: storage.hpp:389
void deleteSnapshot(PbftPeriod period)
Definition: storage.cpp:367
std::shared_ptr< std::pair< PbftPeriod, uint32_t > > getDagBlockPeriod(blk_hash_t const &hash)
Definition: storage.cpp:1225
void saveDagBlock(DagBlock const &blk, Batch *write_batch_p=nullptr)
Definition: storage.cpp:534
void forEach(Column const &col, OnEntry const &f)
Definition: storage.cpp:1314
void remove(Column const &col, K const &k)
Definition: storage.hpp:467
DbStorage(DbStorage &&)=delete
std::set< PbftPeriod > snapshots_
Definition: storage.hpp:171
void updateDagBlockCounters(std::vector< DagBlock > blks)
Definition: storage.cpp:513
void removeCertVotedBlockInRound(Batch &write_batch)
Definition: storage.cpp:1095
DbStorage & operator=(DbStorage &&)=delete
string getPbftHead(blk_hash_t const &hash)
Definition: storage.cpp:1111
void savePbftMgrStatus(PbftMgrStatus field, bool const &value)
Definition: storage.cpp:1062
void replaceColumn(const Column &to_be_replaced_col, std::unique_ptr< rocksdb::ColumnFamilyHandle > &&replacing_col)
Definition: storage.cpp:190
std::optional< PbftBlock > getPbftBlock(PbftPeriod period) const
Definition: storage.cpp:824
void addPbftBlockPeriodToBatch(PbftPeriod period, taraxa::blk_hash_t const &pbft_block_hash, Batch &write_batch)
Definition: storage.cpp:1208
void addSystemTransactionToBatch(Batch &write_batch, SharedTransaction trx)
Definition: storage.cpp:897
auto lookup_int(K const &key, Column const &column) -> std::enable_if_t< std::is_integral_v< Int >, std::optional< Int >>
Definition: storage.hpp:421
auto getNumTransactionExecuted()
Definition: storage.hpp:348
void commitWriteBatch(Batch &write_batch)
Definition: storage.hpp:195
static void checkStatus(rocksdb::Status const &status)
Definition: storage.cpp:418
std::optional< SharedTransactions > getPeriodTransactions(PbftPeriod period) const
Definition: storage.cpp:953
static Batch createWriteBatch()
Definition: storage.cpp:424
void clearOwnVerifiedVotes(Batch &write_batch, const std::vector< std::shared_ptr< PbftVote >> &own_verified_votes)
Definition: storage.cpp:1137
level_t getLastBlocksLevel() const
Definition: storage.cpp:463
DbStorage & operator=(const DbStorage &)=delete
void addTransactionToBatch(Transaction const &trx, Batch &write_batch)
Definition: storage.cpp:985
std::set< blk_hash_t > getBlocksByLevel(level_t level)
Definition: storage.cpp:457
void setGenesisHash(const h256 &genesis_hash)
Definition: storage.cpp:387
auto dbStoragePath() const
Definition: storage.hpp:191
std::string lookup(K const &key, Column const &column) const
Definition: storage.hpp:410
uint32_t getMajorVersion() const
Definition: storage.cpp:408
std::vector< std::shared_ptr< DagBlock > > getFinalizedDagBlockByPeriod(PbftPeriod period)
Definition: storage.cpp:1260
const std::string kStateDbDir
Definition: storage.hpp:160
~DbStorage()
Definition: storage.cpp:401
DbStorage(fs::path const &base_path, uint32_t db_snapshot_each_n_pbft_block=0, uint32_t max_open_files=0, uint32_t db_max_snapshots=0, PbftPeriod db_revert_to_period=0, addr_t node_addr=addr_t(), bool rebuild=false)
Definition: storage.cpp:30
void replaceTwoTPlusOneVotes(TwoTPlusOneVotedBlockType type, const std::vector< std::shared_ptr< PbftVote >> &votes)
Definition: storage.cpp:1144
std::vector< std::shared_ptr< PbftVote > > getOwnVerifiedVotes()
Definition: storage.cpp:1126
const std::string kDbDir
Definition: storage.hpp:159
void deleteTmpDirectories(const std::string &path) const
Definition: storage.cpp:124
std::optional< final_chain::TransactionLocation > getTransactionLocation(trx_hash_t const &hash) const
Definition: storage.cpp:768
std::map< level_t, std::vector< DagBlock > > getNonfinalizedDagBlocks()
Definition: storage.cpp:488
std::vector< std::shared_ptr< PillarVote > > getPeriodPillarVotes(PbftPeriod period) const
Definition: storage.cpp:970
dev::bytes getPeriodDataRaw(PbftPeriod period) const
Definition: storage.cpp:703
std::unique_ptr< rocksdb::ColumnFamilyHandle > copyColumn(rocksdb::ColumnFamilyHandle *orig_column, const std::string &new_col_name, bool move_data=false)
Definition: storage.cpp:146
std::pair< bool, PbftPeriod > getPeriodFromPbftHash(taraxa::blk_hash_t const &pbft_block_hash)
Definition: storage.cpp:1213
void insert(rocksdb::ColumnFamilyHandle *col, const K &k, const V &v)
Definition: storage.hpp:447
auto getNumTransactionInDag()
Definition: storage.hpp:349
void enableSnapshots()
Definition: storage.cpp:385
void saveProposalPeriodDagLevelsMap(uint64_t level, PbftPeriod period)
Definition: storage.cpp:1306
void replaceTwoTPlusOneVotesToBatch(TwoTPlusOneVotedBlockType type, const std::vector< std::shared_ptr< PbftVote >> &votes, Batch &write_batch)
Definition: storage.cpp:1155
void removeTempFiles() const
Definition: storage.cpp:99
bool hasMinorVersionChanged()
Definition: storage.hpp:362
uint64_t getStatusField(StatusDbField const &field)
Definition: storage.cpp:1012
static auto const & toSlice(Slice const &s)
Definition: storage.hpp:395
auto handle(Column const &col) const
Definition: storage.hpp:153
std::optional< pillar_chain::CurrentPillarBlockDataDb > getCurrentPillarBlockData() const
Definition: storage.cpp:747
std::atomic< uint64_t > dag_edge_count_
Definition: storage.hpp:167
std::vector< rocksdb::ColumnFamilyHandle * > handles_
Definition: storage.hpp:162
static Slice toSlice(dev::bytesConstRef const &b)
Definition: storage.hpp:379
std::vector< std::shared_ptr< PbftVote > > getRewardVotes()
Definition: storage.cpp:1197
uint64_t getDagEdgeCount() const
Definition: storage.hpp:346
void updateDbVersions()
Definition: storage.cpp:140
void addPbftHeadToBatch(taraxa::blk_hash_t const &head_hash, std::string const &head_str, Batch &write_batch)
Definition: storage.cpp:1117
void saveSortitionParamsChange(PbftPeriod period, const SortitionParamsChange &params, Batch &batch)
Definition: storage.cpp:562
void addPbftMgrFieldToBatch(PbftMgrField field, uint32_t value, Batch &write_batch)
Definition: storage.cpp:1048
std::vector< std::shared_ptr< PbftVote > > getPeriodCertVotes(PbftPeriod period) const
Definition: storage.cpp:939
auto getNumBlockExecuted()
Definition: storage.hpp:350
bool hasMajorVersionChanged()
Definition: storage.hpp:363
std::vector< trx_hash_t > getPeriodSystemTransactionsHashes(PbftPeriod period) const
Definition: storage.cpp:919
bool pbftBlockInDb(blk_hash_t const &hash)
Definition: storage.cpp:1107
void removeDagBlockBatch(Batch &write_batch, blk_hash_t const &hash)
Definition: storage.cpp:507
std::shared_ptr< Transaction > getSystemTransaction(const trx_hash_t &hash) const
Definition: storage.cpp:901
void removeTransactionToBatch(trx_hash_t const &trx, Batch &write_batch)
Definition: storage.cpp:989
static Slice toSlice(dev::bytes const &b)
Definition: storage.hpp:386
std::optional< SortitionParamsChange > getParamsChangeForPeriod(PbftPeriod period)
Definition: storage.cpp:578
DbStorage(const DbStorage &)=delete
void savePbftHead(blk_hash_t const &hash, string const &pbft_chain_head_str)
Definition: storage.cpp:1113
const uint32_t kDbSnapshotsEachNblock
Definition: storage.hpp:168
void loadSnapshots()
Definition: storage.cpp:276
static Slice toSlice(dev::FixedHash< N > const &h)
Definition: storage.hpp:382
void removeFilesWithPattern(const std::string &directory, const std::regex &pattern) const
Definition: storage.cpp:106
std::unique_ptr< rocksdb::Iterator > getColumnIterator(const Column &c)
Definition: storage.cpp:410
void insert(Batch &batch, rocksdb::ColumnFamilyHandle *col, K const &k, V const &v)
Definition: storage.hpp:462
Changing vrf params for DAG blocks generation.
Definition: sortition_params_manager.hpp:18
PeriodData class is for block execution, that includes PBFT block, certify votes, DAG blocks,...
Definition: period_data.hpp:25
Definition: pillar_block.hpp:155
#define LOG_OBJECTS_DEFINE
Definition: logger.hpp:60
std::vector<::byte > bytes
Definition: Common.h:46
std::hash for asio::adress
Definition: FixedHash.h:483
Definition: config.hpp:8
rocksdb::WriteBatch Batch
Definition: storage.hpp:73
std::shared_ptr< Transaction > SharedTransaction
Definition: transaction.hpp:79
DBMetaKeys
Definition: storage.hpp:55
std::vector< byte > bytes
Definition: types.hpp:53
uint32_t PbftRound
Definition: types.hpp:25
EthBlockNumber PbftPeriod
Definition: types.hpp:24
std::vector< SharedTransaction > SharedTransactions
Definition: transaction.hpp:81
rocksdb::Slice Slice
Definition: storage.hpp:74
std::function< void(Slice const &, Slice const &)> OnEntry
Definition: storage.hpp:75
PbftMgrStatus
Definition: storage.hpp:48
@ NextVotedNullBlockHash
Definition: storage.hpp:52
@ ExecutedInRound
Definition: storage.hpp:50
@ NextVotedSoftValue
Definition: storage.hpp:51
@ ExecutedBlock
Definition: storage.hpp:49
uint64_t level_t
Definition: types.hpp:46
StatusDbField
Definition: storage.hpp:36
@ DbMinorVersion
Definition: storage.hpp:43
@ DbMajorVersion
Definition: storage.hpp:42
@ DagEdgeCount
Definition: storage.hpp:41
@ ExecutedTrxCount
Definition: storage.hpp:38
@ TrxCount
Definition: storage.hpp:39
@ ExecutedBlkCount
Definition: storage.hpp:37
@ DagBlkCount
Definition: storage.hpp:40
uint160_hash_t addr_t
Definition: types.hpp:39
PbftMgrField
Definition: storage.hpp:46
TwoTPlusOneVotedBlockType
Definition: verified_votes.hpp:11
Definition: transaction.hpp:11