Scorum
database.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cryptonomex, Inc., and contributors.
3  */
4 #pragma once
5 
7 #include <scorum/chain/hardfork.hpp>
12 
14 
18 
20 
22 #include <fc/signals.hpp>
23 #include <fc/shared_string.hpp>
24 #include <fc/log/logger.hpp>
25 
26 #include <map>
27 #include <memory>
28 
29 namespace scorum {
30 namespace chain {
31 
37 
38 class database_impl;
39 
40 struct genesis_state_type;
41 struct genesis_persistent_state_type;
42 
47 class database : public chainbase::database,
48  public dbservice_dbs_factory,
49  public data_service_factory,
52 {
53 
54 public:
56  {
57  opt_none = 0,
60 
61 #ifdef IS_LOW_MEM
63 #else
65 #endif
66  };
67 
68  database(uint32_t opt);
69  virtual ~database();
70 
71  bool is_producing() const
72  {
73  return _is_producing;
74  }
75 
77  {
82  skip_fork_db = 1 << 3,
84  skip_tapos_check = 1 << 5,
86  skip_merkle_check = 1 << 7,
89  skip_validate = 1 << 10,
91  skip_undo_block = 1 << 12,
92  skip_block_log = 1 << 13
93  };
94 
95  static fc::path block_log_path(const fc::path& data_dir);
96 
97  uint32_t get_reindex_skip_flags() const;
98 
107  void open(const fc::path& data_dir,
108  const fc::path& shared_mem_dir,
109  uint64_t shared_file_size,
110  uint32_t chainbase_flags,
111  const genesis_state_type& genesis_state);
112 
119  void reindex(const fc::path& data_dir,
120  const fc::path& shared_mem_dir,
121  uint64_t shared_file_size,
122  uint32_t skip_flags,
123  const genesis_state_type& genesis_state);
124 
131  void wipe(const fc::path& data_dir, const fc::path& shared_mem_dir, bool include_blocks);
132 
133  void close();
134 
135  time_point_sec get_genesis_time() const;
136 
138 
143  bool is_known_block(const block_id_type& id) const;
144  bool is_known_transaction(const transaction_id_type& id) const;
145  block_id_type find_block_id_for_num(uint32_t block_num) const;
146  block_id_type get_block_id_for_num(uint32_t block_num) const;
147  optional<signed_block> fetch_block_by_id(const block_id_type& id) const;
148  optional<signed_block> fetch_block_by_number(uint32_t num) const;
149  optional<signed_block> read_block_by_number(uint32_t num) const;
150 
152  std::vector<block_id_type> get_block_ids_on_fork(block_id_type head_of_fork) const;
153 
154  chain_id_type get_chain_id() const;
155 
157 
158  const time_point_sec calculate_discussion_payout_time(const comment_object& comment) const;
159 
164  uint32_t witness_participation_rate() const;
165 
166  void add_checkpoints(const flat_map<uint32_t, block_id_type>& checkpts);
167  const flat_map<uint32_t, block_id_type> get_checkpoints() const
168  {
169  return _checkpoints;
170  }
171  bool before_last_checkpoint() const;
172 
173  bool push_block(const signed_block& b, uint32_t skip = skip_nothing);
174  void push_transaction(const signed_transaction& trx, uint32_t skip = skip_nothing);
175 
176  void _push_transaction(const signed_transaction& trx);
177 
178  signed_block generate_block(const fc::time_point_sec when,
179  const account_name_type& witness_owner,
180  const fc::ecc::private_key& block_signing_private_key,
181  uint32_t skip);
182 
183  void pop_block();
184  void clear_pending();
185 
195 
196  // vops are not needed for low mem. Force will push them on low mem.
197  inline void push_virtual_operation(const operation& op);
198  inline void push_hf_operation(const operation& op);
199 
200  void notify_pre_applied_block(const signed_block& block);
201  void notify_applied_block(const signed_block& block);
205 
209  fc::signal<void(const operation_notification&)> pre_apply_operation;
211  fc::signal<void(const signed_block&)> pre_applied_block;
212 
221  fc::signal<void(const signed_block&)> applied_block;
222 
227  fc::signal<void(const signed_transaction&)> on_pending_transaction;
228 
234 
239  fc::signal<void(const signed_transaction&)> on_applied_transaction;
240 
242 
257  account_name_type get_scheduled_witness(uint32_t slot_num) const;
258 
267  fc::time_point_sec get_slot_time(uint32_t slot_num) const;
268 
277  uint32_t get_slot_at_time(fc::time_point_sec when) const;
278 
282 
283  time_point_sec head_block_time() const;
284  uint32_t head_block_num() const;
286 
288 
290 
291  uint32_t last_non_undoable_block_num() const;
293 
294  void initialize_evaluators();
295 
297  void initialize_indexes();
298 
299  void set_initial_timestamp(const genesis_state_type& genesis_state);
300 
301  void init_genesis(const genesis_state_type& genesis_state);
302 
307  void validate_transaction(const signed_transaction& trx);
308 
311  std::deque<signed_transaction> _popped_tx;
312 
313  bool has_hardfork(uint32_t hardfork) const;
314 
315  /* For testing and debugging only. Given a hardfork
316  with id N, applies all hardforks with id <= N */
317  void set_hardfork(uint32_t hardfork, bool process_now = true);
318 
319  void validate_invariants() const;
320 
321  void set_flush_interval(uint32_t flush_blocks);
322  void show_free_memory(bool force);
323 
324  // index
325 
326  template <typename MultiIndexType> void add_plugin_index()
327  {
328  _plugin_index_signal.connect([this]() { this->add_index<MultiIndexType>(); });
329  }
330 
332 
333 private:
334  // witness_schedule
335  void update_witness_schedule();
336  void _reset_witness_virtual_schedule_time();
337  void _update_witness_median_props();
338  void _update_witness_majority_version();
339  void _update_witness_hardfork_version_votes();
340 
341  void _maybe_warn_multiple_production(uint32_t height) const;
342  bool _push_block(const signed_block& b);
343 
344  signed_block _generate_block(const fc::time_point_sec when,
345  const account_name_type& witness_owner,
346  const fc::ecc::private_key& block_signing_private_key);
347 
348 protected:
349  void set_producing(bool p)
350  {
351  _is_producing = p;
352  }
353 
354  void apply_block(const signed_block& next_block, uint32_t skip = skip_nothing);
355  void apply_transaction(const signed_transaction& trx, uint32_t skip = skip_nothing);
356  void _apply_block(const signed_block& next_block);
357  void _apply_transaction(const signed_transaction& trx);
358  void apply_operation(const operation& op);
359 
362 
363  const witness_object& validate_block_header(uint32_t skip, const signed_block& next_block) const;
364  void create_block_summary(const signed_block& next_block);
365 
367  void update_signing_witness(const witness_object& signing_witness, const signed_block& new_block);
371  void process_header_extensions(const signed_block& next_block);
372 
373  void init_hardforks(fc::time_point_sec genesis_time);
374  void process_hardforks();
375  void apply_hardfork(uint32_t hardfork);
377 
378 private:
379  std::unique_ptr<database_impl> _my;
380 
381  bool _is_producing = false;
382  uint32_t _options;
383 
384  optional<chainbase::abstract_undo_session_ptr> _pending_tx_session;
385 
386  std::vector<signed_transaction> _pending_tx;
387  fork_database _fork_db;
388  fc::time_point_sec _hardfork_times[SCORUM_NUM_HARDFORKS + 1];
389  protocol::hardfork_version _hardfork_versions[SCORUM_NUM_HARDFORKS + 1];
390 
391  block_log _block_log;
392 
393  fc::signal<void()> _plugin_index_signal;
394 
395  transaction_id_type _current_trx_id;
396  uint32_t _current_block_num = 0;
397  uint16_t _current_trx_in_block = 0;
398  uint16_t _current_op_in_trx = 0;
399 
400  flat_map<uint32_t, block_id_type> _checkpoints;
401 
402  node_property_object _node_property_object;
403 
404  uint32_t _flush_blocks = 0;
405  uint32_t _next_flush_block = 0;
406 
407  uint32_t _last_free_gb_printed = 0;
408 
409  fc::time_point_sec _const_genesis_time; // should be const
410 };
411 } // namespace chain
412 } // namespace scorum
tracks the blockchain state in an extensible manner
Definition: database.hpp:52
operation_notification create_notification(const operation &op) const
Definition: database.cpp:1029
void set_producing(bool p)
Definition: database.hpp:349
block_id_type find_block_id_for_num(uint32_t block_num) const
Definition: database.cpp:400
void init_genesis(const genesis_state_type &genesis_state)
Definition: genesis.cpp:40
optional< signed_block > fetch_block_by_number(uint32_t num) const
Definition: database.cpp:470
void update_last_irreversible_block()
Definition: database.cpp:1947
uint32_t get_reindex_skip_flags() const
Definition: database.cpp:188
database(uint32_t opt)
Definition: database.cpp:168
void _apply_transaction(const signed_transaction &trx)
Definition: database.cpp:1710
signed_block generate_block(const fc::time_point_sec when, const account_name_type &witness_owner, const fc::ecc::private_key &block_signing_private_key, uint32_t skip)
Definition: database.cpp:800
uint32_t get_slot_at_time(fc::time_point_sec when) const
Definition: database.cpp:1122
void apply_hardfork(uint32_t hardfork)
Definition: database.cpp:2155
void set_flush_interval(uint32_t flush_blocks)
Definition: database.cpp:1407
fc::signal< void(const signed_transaction &)> on_pending_transaction
Definition: database.hpp:227
const witness_object & validate_block_header(uint32_t skip, const signed_block &next_block) const
Definition: database.cpp:1816
void notify_on_pending_transaction(const signed_transaction &tx)
Definition: database.cpp:1071
time_point_sec head_block_time() const
Definition: database.cpp:1222
void update_signing_witness(const witness_object &signing_witness, const signed_block &new_block)
Definition: database.cpp:1938
const node_property_object & get_node_properties() const
Definition: database.cpp:538
chain_id_type get_chain_id() const
Definition: database.cpp:533
void _apply_block(const signed_block &next_block)
Definition: database.cpp:1514
void notify_on_applied_transaction(const signed_transaction &tx)
Definition: database.cpp:1081
time_point_sec get_genesis_time() const
Definition: genesis.cpp:30
account_name_type get_scheduled_witness(uint32_t slot_num) const
Get the witness scheduled for block production in a slot.
Definition: database.cpp:1086
void apply_operation(const operation &op)
Definition: database.cpp:1807
void validate_invariants() const
Definition: database.cpp:2185
void notify_applied_block(const signed_block &block)
Definition: database.cpp:1066
optional< signed_block > fetch_block_by_id(const block_id_type &id) const
Definition: database.cpp:447
void set_initial_timestamp(const genesis_state_type &genesis_state)
Definition: genesis.cpp:35
bool has_hardfork(uint32_t hardfork) const
Definition: database.cpp:2132
void notify_pre_apply_operation(const operation_notification &note)
Definition: database.cpp:1019
uint32_t witness_participation_rate() const
Definition: database.cpp:548
const flat_map< uint32_t, block_id_type > get_checkpoints() const
Definition: database.hpp:167
fc::signal< void(const signed_transaction &)> on_pre_apply_transaction
Definition: database.hpp:233
void init_hardforks(fc::time_point_sec genesis_time)
Definition: database.cpp:2070
fc::signal< void(const signed_block &)> applied_block
Definition: database.hpp:221
fc::signal< void(const signed_block &)> pre_applied_block
Definition: database.hpp:211
void reindex(const fc::path &data_dir, const fc::path &shared_mem_dir, uint64_t shared_file_size, uint32_t skip_flags, const genesis_state_type &genesis_state)
Rebuild object graph from block history and open detabase.
Definition: database.cpp:284
static fc::path block_log_path(const fc::path &data_dir)
Definition: database.cpp:183
bool push_block(const signed_block &b, uint32_t skip=skip_nothing)
Definition: database.cpp:573
@ skip_undo_block
used to skip undo db on reindex
Definition: database.hpp:91
@ skip_authority_check
used while reindexing – disables any checking of authority on transactions
Definition: database.hpp:85
@ skip_validate
used prior to checkpoint, skips validate() call on transaction
Definition: database.hpp:89
@ skip_block_size_check
used when applying locally generated transactions
Definition: database.hpp:83
@ skip_merkle_check
used while reindexing
Definition: database.hpp:86
@ skip_transaction_dupe_check
used while reindexing
Definition: database.hpp:81
@ skip_witness_schedule_check
used while reindexing
Definition: database.hpp:88
@ skip_tapos_check
used while reindexing – note this skips expiration check as well
Definition: database.hpp:84
@ skip_witness_signature
used while reindexing
Definition: database.hpp:79
@ skip_block_log
used to skip block logging on reindex
Definition: database.hpp:92
@ skip_validate_invariants
used to skip database invariant check on block application
Definition: database.hpp:90
@ skip_transaction_signatures
used by non-witness nodes
Definition: database.hpp:80
@ skip_fork_db
used while reindexing
Definition: database.hpp:82
@ skip_undo_history_check
used while reindexing
Definition: database.hpp:87
void open(const fc::path &data_dir, const fc::path &shared_mem_dir, uint64_t shared_file_size, uint32_t chainbase_flags, const genesis_state_type &genesis_state)
Open a database, creating a new one if necessary.
Definition: database.cpp:203
void process_header_extensions(const signed_block &next_block)
Definition: database.cpp:1657
void _push_transaction(const signed_transaction &trx)
Definition: database.cpp:774
block_id_type head_block_id() const
Definition: database.cpp:1232
bool is_known_transaction(const transaction_id_type &id) const
Definition: database.cpp:390
fc::signal< void(const signed_transaction &)> on_applied_transaction
Definition: database.hpp:239
void create_block_summary(const signed_block &next_block)
Definition: database.cpp:1854
void process_decline_voting_rights()
Definition: database.cpp:1190
bool is_known_block(const block_id_type &id) const
Definition: database.cpp:376
bool is_producing() const
Definition: database.hpp:71
void push_virtual_operation(const operation &op)
Definition: database.cpp:1034
void push_hf_operation(const operation &op)
Definition: database.cpp:1052
void apply_transaction(const signed_transaction &trx, uint32_t skip=skip_nothing)
Definition: database.cpp:1704
void account_recovery_processing()
Definition: database.cpp:1132
node_property_object & node_properties()
Definition: database.cpp:1252
void show_free_memory(bool force)
Definition: database.cpp:1494
void notify_post_apply_operation(const operation_notification &note)
Definition: database.cpp:1024
const genesis_persistent_state_type & genesis_persistent_state() const
Definition: database.cpp:2065
block_info head_block_context() const
Definition: database.cpp:1237
block_id_type get_block_id_for_num(uint32_t block_num) const
Definition: database.cpp:440
uint32_t last_non_undoable_block_num() const
Definition: database.cpp:1257
std::deque< signed_transaction > _popped_tx
Definition: database.hpp:311
bool before_last_checkpoint() const
Definition: database.cpp:562
uint32_t head_block_num() const
Definition: database.cpp:1227
void set_hardfork(uint32_t hardfork, bool process_now=true)
Definition: database.cpp:2137
void validate_transaction(const signed_transaction &trx)
Definition: database.cpp:1399
void notify_pre_applied_block(const signed_block &block)
Definition: database.cpp:1061
void apply_block(const signed_block &next_block, uint32_t skip=skip_nothing)
Definition: database.cpp:1415
std::vector< block_id_type > get_block_ids_on_fork(block_id_type head_of_fork) const
Definition: database.cpp:511
fc::signal< void(const operation_notification &)> post_apply_operation
Definition: database.hpp:210
void initialize_indexes()
Reset the object graph in-memory.
Definition: database.cpp:1336
void update_global_dynamic_data(const signed_block &b)
Definition: database.cpp:1864
fc::signal< void(const operation_notification &)> pre_apply_operation
Definition: database.hpp:209
void notify_on_pre_apply_transaction(const signed_transaction &tx)
Definition: database.cpp:1076
void push_transaction(const signed_transaction &trx, uint32_t skip=skip_nothing)
Definition: database.cpp:751
const signed_transaction get_recent_transaction(const transaction_id_type &trx_id) const
Definition: database.cpp:496
const time_point_sec calculate_discussion_payout_time(const comment_object &comment) const
Definition: database.cpp:543
void add_checkpoints(const flat_map< uint32_t, block_id_type > &checkpts)
Definition: database.cpp:554
optional< signed_block > read_block_by_number(uint32_t num) const
Definition: database.cpp:491
void wipe(const fc::path &data_dir, const fc::path &shared_mem_dir, bool include_blocks)
wipe Delete database from disk, and potentially the raw chain as well.
Definition: database.cpp:338
fc::time_point_sec get_slot_time(uint32_t slot_num) const
Definition: database.cpp:1095
Contains per-node database configuration.
fc::ripemd160 transaction_id_type
Definition: types.hpp:65
fc::static_variant< vote_operation, comment_operation, transfer_operation, transfer_to_scorumpower_operation, withdraw_scorumpower_operation, account_create_by_committee_operation, account_create_operation, account_create_with_delegation_operation, account_update_operation, witness_update_operation, account_witness_vote_operation, account_witness_proxy_operation, delete_comment_operation, comment_options_operation, set_withdraw_scorumpower_route_to_account_operation, set_withdraw_scorumpower_route_to_dev_pool_operation, prove_authority_operation, request_account_recovery_operation, recover_account_operation, change_recovery_account_operation, escrow_approve_operation, escrow_dispute_operation, escrow_release_operation, escrow_transfer_operation, decline_voting_rights_operation, delegate_scorumpower_operation, create_budget_operation, close_budget_operation, proposal_vote_operation, proposal_create_operation, atomicswap_initiate_operation, atomicswap_redeem_operation, atomicswap_refund_operation, close_budget_by_advertising_moderator_operation, update_budget_operation, create_game_operation, cancel_game_operation, update_game_markets_operation, update_game_start_time_operation, post_game_results_operation, post_bet_operation, cancel_pending_bets_operation, delegate_sp_from_reg_pool_operation, create_nft_operation, update_nft_meta_operation, create_game_round_operation, update_game_round_result_operation, adjust_nft_experience_operation, update_nft_name_operation, author_reward_operation, comment_benefficiary_reward_operation, comment_payout_update_operation, comment_reward_operation, curation_reward_operation, hardfork_operation, producer_reward_operation, active_sp_holders_reward_operation, return_scorumpower_delegation_operation, shutdown_witness_operation, witness_miss_block_operation, expired_contract_refund_operation, acc_finished_vesting_withdraw_operation, devpool_finished_vesting_withdraw_operation, acc_to_acc_vesting_withdraw_operation, devpool_to_acc_vesting_withdraw_operation, acc_to_devpool_vesting_withdraw_operation, devpool_to_devpool_vesting_withdraw_operation, proposal_virtual_operation, budget_outgo_operation, budget_owner_income_operation, active_sp_holders_reward_legacy_operation, budget_closing_operation, bets_matched_operation, game_status_changed_operation, bet_resolved_operation, bet_cancelled_operation, bet_restored_operation, bet_updated_operation > operation
Definition: operations.hpp:112
fc::fixed_string_16 account_name_type
Definition: types.hpp:62
fc::sha256 chain_id_type
Definition: types.hpp:61
fc::ripemd160 block_id_type
Definition: types.hpp:63
uint64_t asset_symbol_type
Definition: asset.hpp:13
Definition: asset.cpp:15