Electroneum
blockchain.h
Go to the documentation of this file.
1 // Copyrights(c) 2017-2019, The Electroneum Project
2 // Copyrights(c) 2014-2017, The Monero Project
3 //
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without modification, are
7 // permitted provided that the following conditions are met:
8 //
9 // 1. Redistributions of source code must retain the above copyright notice, this list of
10 // conditions and the following disclaimer.
11 //
12 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
13 // of conditions and the following disclaimer in the documentation and/or other
14 // materials provided with the distribution.
15 //
16 // 3. Neither the name of the copyright holder nor the names of its contributors may be
17 // used to endorse or promote products derived from this software without specific
18 // prior written permission.
19 //
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31 
32 #pragma once
33 #include <boost/asio/io_service.hpp>
34 #include <boost/serialization/serialization.hpp>
35 #include <boost/serialization/version.hpp>
36 #include <boost/serialization/list.hpp>
37 #include <boost/multi_index_container.hpp>
38 #include <boost/multi_index/global_fun.hpp>
39 #include <boost/multi_index/hashed_index.hpp>
40 #include <boost/multi_index/member.hpp>
41 #include <boost/algorithm/hex.hpp>
42 #include <atomic>
43 #include <unordered_map>
44 #include <unordered_set>
45 
46 #include "syncobj.h"
47 #include "string_tools.h"
49 #include "common/util.h"
53 #include "cryptonote_tx_utils.h"
55 #include "crypto/hash.h"
60 
61 namespace cryptonote
62 {
63  class tx_memory_pool;
64  struct test_options;
65 
70  {
75  };
76 
77  /************************************************************************/
78  /* */
79  /************************************************************************/
80  class Blockchain
81  {
82  public:
87  {
90  size_t m_blob_size;
91  std::vector<uint64_t> m_global_output_indexes;
92  };
93 
98  {
100  uint64_t height;
104  };
105 
111  Blockchain(tx_memory_pool& tx_pool);
112 
122  bool init(BlockchainDB* db, const bool testnet = false, const cryptonote::test_options *test_options = NULL);
123 
133  bool init(BlockchainDB* db, HardFork*& hf, const bool testnet = false);
134 
142  bool deinit();
143 
149  void set_checkpoints(checkpoints&& chk_pts) { m_checkpoints = chk_pts; }
150 
161  bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks, std::list<cryptonote::blobdata>& txs) const;
162 
172  bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata,block>>& blocks) const;
173 
181  bool get_alternative_blocks(std::list<block>& blocks) const;
182 
188  size_t get_alternative_blocks_count() const;
189 
198 
208  bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan = NULL) const;
209 
217  void get_all_known_block_ids(std::list<crypto::hash> &main, std::list<crypto::hash> &alt, std::list<crypto::hash> &invalid) const;
218 
226  bool prepare_handle_incoming_blocks(const std::list<block_complete_entry> &blocks);
227 
235  bool cleanup_handle_incoming_blocks(bool force_sync = false);
236 
244  bool have_tx(const crypto::hash &id) const;
245 
253  bool have_tx_keyimges_as_spent(const transaction &tx) const;
254 
267  bool have_tx_keyimg_as_spent(const crypto::key_image &key_im) const;
268 
274  uint64_t get_current_blockchain_height() const;
275 
281  crypto::hash get_tail_id() const;
282 
290  crypto::hash get_tail_id(uint64_t& height) const;
291 
298 
303 
317  bool add_new_block(const block& bl_, block_verification_context& bvc);
318 
326  bool reset_and_set_genesis_block(const block& b);
327 
340  bool create_block_template(block& b, const account_public_address& miner_address, difficulty_type& di, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
341 
352  bool have_block(const crypto::hash& id) const;
353 
359  size_t get_total_transactions() const;
360 
375  bool get_short_chain_history(std::list<crypto::hash>& ids) const;
376 
389  bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const;
390 
403  bool find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, uint64_t& starter_offset) const;
404 
421  bool find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<cryptonote::blobdata, std::list<cryptonote::blobdata> > >& blocks, uint64_t& total_height, uint64_t& start_height, size_t max_count) const;
422 
436 
452 
467 
484 
496  bool get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const;
497 
506  bool store_blockchain();
507 
524  bool check_tx_inputs(transaction& tx, uint64_t& pmax_used_block_height, crypto::hash& max_used_block_id, tx_verification_context &tvc, bool kept_by_block = false);
525 
538  static uint64_t get_dynamic_per_kb_fee(uint64_t block_reward, size_t median_block_size, uint8_t version);
539 
552  uint64_t get_dynamic_per_kb_fee_estimate(uint64_t grace_blocks) const;
553 
566  bool check_fee(size_t blob_size, uint64_t fee) const;
567 
581 
588 
596  uint64_t block_difficulty(uint64_t i) const;
597 
610  template<class t_ids_container, class t_blocks_container, class t_missed_container>
611  bool get_blocks(const t_ids_container& block_ids, t_blocks_container& blocks, t_missed_container& missed_bs) const;
612 
625  template<class t_ids_container, class t_tx_container, class t_missed_container>
626  bool get_transactions_blobs(const t_ids_container& txs_ids, t_tx_container& txs, t_missed_container& missed_txs) const;
627  template<class t_ids_container, class t_tx_container, class t_missed_container>
628  bool get_transactions(const t_ids_container& txs_ids, t_tx_container& txs, t_missed_container& missed_txs) const;
629 
630  //debug functions
631 
640  void print_blockchain(uint64_t start_index, uint64_t end_index) const;
641 
649  void print_blockchain_index() const;
650 
656  void print_blockchain_outs(const std::string& file) const;
657 
669  void check_against_checkpoints(const checkpoints& points, bool enforce);
670 
676  void set_enforce_dns_checkpoints(bool enforce);
677 
686  bool update_checkpoints(const std::string& file_path, bool check_dns);
687 
694  // user options, must be called before calling init()
695 
704  void set_user_options(uint64_t maxthreads, uint64_t blocks_per_sync,
705  blockchain_db_sync_mode sync_mode, bool fast_sync, std::string validator_key);
706 
710  void safesyncmode(const bool onoff);
711 
717  void set_show_time_stats(bool stats) { m_show_time_stats = stats; }
718 
725 
732 
739 
746 
756 
764  uint8_t get_hard_fork_version(uint64_t height) const { return m_hardfork->get(height); }
765 
786  bool is_testnet() const{return m_testnet;}
787 
788  bool get_hard_fork_voting_info(uint8_t version, uint32_t &window, uint32_t &votes, uint32_t &threshold, uint64_t &earliest_height, uint8_t &voting) const;
789 
797  bool flush_txes_from_pool(const std::list<crypto::hash> &txids);
798 
808  std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const;
809 
817  bool for_all_key_images(std::function<bool(const crypto::key_image&)>) const;
818 
828  bool for_blocks_range(const uint64_t& h1, const uint64_t& h2, std::function<bool(uint64_t, const crypto::hash&, const block&)>) const;
829 
837  bool for_all_transactions(std::function<bool(const crypto::hash&, const cryptonote::transaction&)>) const;
838 
846  bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, size_t tx_idx)>) const;
847 
853  const BlockchainDB& get_db() const
854  {
855  return *m_db;
856  }
857 
864  {
865  return *m_db;
866  }
867 
876  void output_scan_worker(const uint64_t amount,const std::vector<uint64_t> &offsets,
877  std::vector<output_data_t> &outputs, std::unordered_map<crypto::hash,
878  cryptonote::transaction> &txs) const;
879 
887  void block_longhash_worker(uint64_t height, const std::vector<block> &blocks,
888  std::unordered_map<crypto::hash, crypto::hash> &map) const;
889 
895  std::list<std::pair<block_extended_info,uint64_t>> get_alternative_chains() const;
896 
897  void add_txpool_tx(transaction &tx, const txpool_tx_meta_t &meta);
898  void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t &meta);
899  void remove_txpool_tx(const crypto::hash &txid);
900  uint64_t get_txpool_tx_count() const;
901  bool get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta_t &meta) const;
902  bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const;
904  bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false) const;
905  uint32_t get_mempool_tx_livetime() const;
906  uint32_t get_difficulty_target() const;
907 
908  bool is_within_compiled_block_hash_area(uint64_t height) const;
910 
911  void lock();
912  void unlock();
913 
914  void cancel();
915 
922 
926  void set_validator_key(std::string key) { m_validator_key = boost::algorithm::unhex(key); }
927 
928  void set_validators_list_instance(std::unique_ptr<electroneum::basic::Validators> &v) { m_validators = v.get(); }
929 
930  private:
931 
932  // TODO: evaluate whether or not each of these typedefs are left over from blockchain_storage
933  typedef std::unordered_map<crypto::hash, size_t> blocks_by_id_index;
934 
935  typedef std::unordered_map<crypto::hash, transaction_chain_entry> transactions_container;
936 
937  typedef std::unordered_set<crypto::key_image> key_images_container;
938 
939  typedef std::vector<block_extended_info> blocks_container;
940 
941  typedef std::unordered_map<crypto::hash, block_extended_info> blocks_ext_by_hash;
942 
943  typedef std::unordered_map<crypto::hash, block> blocks_by_hash;
944 
945  typedef std::map<uint64_t, std::vector<std::pair<crypto::hash, size_t>>> outputs_container; //crypto::hash - tx hash, size_t - index of out in transaction
946 
947 
949 
951 
952  mutable epee::critical_section m_blockchain_lock; // TODO: add here reader/writer lock
953 
954  // main chain
957 
958  // metadata containers
959  std::unordered_map<crypto::hash, std::unordered_map<crypto::key_image, std::vector<output_data_t>>> m_scan_table;
960  std::unordered_map<crypto::hash, crypto::hash> m_blocks_longhash_table;
961  std::unordered_map<crypto::hash, std::unordered_map<crypto::key_image, bool>> m_check_txin_table;
962 
963  // SHA-3 hashes for each block and for fast pow checking
964  std::vector<crypto::hash> m_blocks_hash_check;
965  std::vector<crypto::hash> m_blocks_txs_check;
966 
975  uint64_t m_sync_counter;
976  std::vector<uint64_t> m_timestamps;
977  std::vector<difficulty_type> m_difficulties;
979 
980  epee::critical_section m_difficulty_lock;
983 
984 
985  std::string m_validator_key;
986  std::vector<std::string> m_validators_public_keys;
987 
988  boost::asio::io_service m_async_service;
989  boost::thread_group m_async_pool;
990  std::unique_ptr<boost::asio::io_service::work> m_async_work_idle;
991 
992  // all alternative chains
993  blocks_ext_by_hash m_alternative_chains; // crypto::hash -> block_extended_info
994 
995  // some invalid blocks
996  blocks_ext_by_hash m_invalid_blocks; // crypto::hash -> block_extended_info
997 
998 
1001 
1003 
1005 
1006  std::atomic<bool> m_cancel;
1007 
1008  // block template cache
1016 
1017 
1019 
1039  template<class visitor_t>
1040  inline bool scan_outputkeys_for_indexes(size_t tx_version, const txin_to_key& tx_in_to_key, visitor_t &vis, const crypto::hash &tx_prefix_hash, uint64_t* pmax_related_block_height = NULL) const;
1041 
1062  bool check_tx_input(size_t tx_version,const txin_to_key& txin, const crypto::hash& tx_prefix_hash, const std::vector<crypto::signature>& sig, const rct::rctSig &rct_signatures, std::vector<rct::ctkey> &output_keys, uint64_t* pmax_related_block_height);
1063 
1084  bool check_tx_inputs(transaction& tx, tx_verification_context &tvc, uint64_t* pmax_used_block_height = NULL);
1085 
1098  bool switch_to_alternative_blockchain(std::list<blocks_ext_by_hash::iterator>& alt_chain, bool discard_disconnected_chain);
1099 
1106 
1120 
1135 
1150 
1159  difficulty_type get_next_difficulty_for_alternative_chain(const std::list<blocks_ext_by_hash::iterator>& alt_chain, block_extended_info& bei) const;
1160 
1172  bool prevalidate_miner_transaction(const block& b, uint64_t height);
1173 
1190  bool validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins, bool &partial_block_reward, uint8_t version);
1191 
1204  bool rollback_blockchain_switching(std::list<block>& original_chain, uint64_t rollback_height);
1205 
1214  void get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count) const;
1215 
1223  void add_out_to_get_random_outs(COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs, uint64_t amount, size_t i) const;
1224 
1232  void add_out_to_get_rct_random_outs(std::list<COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry>& outs, uint64_t amount, size_t i) const;
1233 
1244  bool is_tx_spendtime_unlocked(uint64_t unlock_time) const;
1245 
1257  bool add_block_as_invalid(const block& bl, const crypto::hash& h);
1258 
1270  bool add_block_as_invalid(const block_extended_info& bei, const crypto::hash& h);
1271 
1288  bool check_block_timestamp(const block& b, uint64_t& median_ts) const;
1289  bool check_block_timestamp(const block& b) const { uint64_t median_ts; return check_block_timestamp(b, median_ts); }
1290 
1302  bool check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b, uint64_t& median_ts) const;
1303  bool check_block_timestamp(std::vector<uint64_t>& timestamps, const block& b) const { uint64_t median_ts; return check_block_timestamp(timestamps, b, median_ts); }
1304 
1313  uint64_t get_adjusted_time() const;
1314 
1326  bool complete_timestamps_vector(uint64_t start_height, std::vector<uint64_t>& timestamps);
1327 
1334  void return_tx_to_pool(std::vector<transaction> &txs);
1335 
1344  bool check_for_double_spend(const transaction& tx, key_images_container& keys_this_block) const;
1345 
1355  void check_ring_signature(const crypto::hash &tx_prefix_hash, const crypto::key_image &key_image,
1356  const std::vector<rct::ctkey> &pubkeys, const std::vector<crypto::signature> &sig, uint64_t &result);
1357 
1366 
1374  bool expand_transaction_2(transaction &tx, const crypto::hash &tx_prefix_hash, const std::vector<std::vector<rct::ctkey>> &pubkeys);
1375 
1380 
1386  void cache_block_template(const block &b, const cryptonote::account_public_address &address, const blobdata &nonce, const difficulty_type &diff, uint64_t expected_reward, uint64_t pool_cookie);
1393  void sign_block(block& b, std::string privateKey);
1394 
1400  bool verify_block_signature(const block& b);
1401 
1402  };
1403 } // namespace cryptonote
Definition: cryptonote_protocol_defs.h:165
bool verify_block_signature(const block &b)
Verify block&#39;s digital signature.
Definition: blockchain.cpp:1407
uint64_t m_max_prepare_blocks_threads
Definition: blockchain.h:972
bool check_block_timestamp(std::vector< uint64_t > &timestamps, const block &b) const
Definition: blockchain.h:1303
bool m_db_default_sync
Definition: blockchain.h:970
std::vector< crypto::hash > m_blocks_hash_check
Definition: blockchain.h:964
void print_blockchain_outs(const std::string &file) const
currently does nothing, candidate for removal
Definition: blockchain.cpp:2237
std::unordered_map< crypto::hash, std::unordered_map< crypto::key_image, std::vector< output_data_t > > > m_scan_table
Definition: blockchain.h:959
block pop_block_from_blockchain()
removes the most recent block from the blockchain
Definition: blockchain.cpp:509
std::vector< std::string > m_validators_public_keys
Definition: blockchain.h:986
Definition: core_rpc_server_commands_defs.h:339
crypto::hash m_difficulty_for_next_block_top_hash
Definition: blockchain.h:981
checkpoints m_checkpoints
Definition: blockchain.h:999
bool add_block_as_invalid(const block &bl, const crypto::hash &h)
stores an invalid block in a separate container
Definition: blockchain.cpp:2316
bool have_tx_keyimg_as_spent(const crypto::key_image &key_im) const
check if a key image is already spent on the blockchain
Definition: blockchain.cpp:131
uint64_t m_fake_pow_calc_time
Definition: blockchain.h:973
bool is_tx_spendtime_unlocked(uint64_t unlock_time) const
checks if a transaction is unlocked (its outputs spendable)
Definition: blockchain.cpp:2950
block bl
the block
Definition: blockchain.h:99
size_t m_current_block_cumul_sz_limit
Definition: blockchain.h:956
handle syncing calls instead of the backing db, asynchronously
Definition: blockchain.h:73
void block_longhash_worker(uint64_t height, const std::vector< block > &blocks, std::unordered_map< crypto::hash, crypto::hash > &map) const
computes the "short" and "long" hashes for a set of blocks
Definition: blockchain.cpp:3628
std::vector< uint64_t > m_timestamps
Definition: blockchain.h:976
bool check_for_double_spend(const transaction &tx, key_images_container &keys_this_block) const
make sure a transaction isn&#39;t attempting a double-spend
Definition: blockchain.cpp:2380
std::unique_ptr< boost::asio::io_service::work > m_async_work_idle
Definition: blockchain.h:990
bool get_transactions_blobs(const t_ids_container &txs_ids, t_tx_container &txs, t_missed_container &missed_txs) const
gets transactions based on a list of transaction hashes
Definition: blockchain.cpp:2146
BlockchainDB & get_db()
get a reference to the BlockchainDB in use by Blockchain
Definition: blockchain.h:863
size_t block_cumulative_size
the size (in bytes) of the block
Definition: blockchain.h:101
bool expand_transaction_2(transaction &tx, const crypto::hash &tx_prefix_hash, const std::vector< std::vector< rct::ctkey >> &pubkeys)
expands v2 transaction data from blockchain
Definition: blockchain.cpp:2566
std::unordered_set< crypto::key_image > key_images_container
Definition: blockchain.h:937
difficulty_type m_difficulty_for_next_block
Definition: blockchain.h:982
bool m_fast_sync
Definition: blockchain.h:968
uint64_t get_current_cumulative_blocksize_limit() const
gets the blocksize limit based on recent blocks
Definition: blockchain.cpp:1208
Definition: cryptonote_basic.h:382
bool create_block_template(block &b, const account_public_address &miner_address, difficulty_type &di, uint64_t &height, uint64_t &expected_reward, const blobdata &ex_nonce)
creates a new block to mine against
Definition: blockchain.cpp:1225
bool prevalidate_miner_transaction(const block &b, uint64_t height)
sanity checks a miner transaction before validating an entire block
Definition: blockchain.cpp:1108
blocks_ext_by_hash m_invalid_blocks
Definition: blockchain.h:996
uint64_t height
Definition: blockchain.cpp:87
bool handle_alternative_block(const block &b, const crypto::hash &id, block_verification_context &bvc)
validate and add a new block to an alternate blockchain
Definition: blockchain.cpp:1449
uint64_t m_fake_scan_time
Definition: blockchain.h:974
user didn&#39;t specify, use db_async
Definition: blockchain.h:71
std::unordered_map< crypto::hash, block > blocks_by_hash
Definition: blockchain.h:943
std::unordered_map< crypto::hash, std::unordered_map< crypto::key_image, bool > > m_check_txin_table
Definition: blockchain.h:961
bool for_all_transactions(std::function< bool(const crypto::hash &, const cryptonote::transaction &)>) const
perform a check on all transactions in the blockchain
Definition: blockchain.cpp:4320
bool switch_to_alternative_blockchain(std::list< blocks_ext_by_hash::iterator > &alt_chain, bool discard_disconnected_chain)
performs a blockchain reorganization according to the longest chain rule
Definition: blockchain.cpp:927
bool have_tx(const crypto::hash &id) const
search the blockchain for a transaction by hash
Definition: blockchain.cpp:124
difficulty_type get_next_difficulty_for_alternative_chain(const std::list< blocks_ext_by_hash::iterator > &alt_chain, block_extended_info &bei) const
gets the difficulty requirement for a new block on an alternate chain
Definition: blockchain.cpp:1022
bool check_tx_inputs(transaction &tx, uint64_t &pmax_used_block_height, crypto::hash &max_used_block_id, tx_verification_context &tvc, bool kept_by_block=false)
validates a transaction&#39;s inputs
Definition: blockchain.cpp:2489
Definition: core_rpc_server_commands_defs.h:389
bool get_outs(const COMMAND_RPC_GET_OUTPUTS_BIN::request &req, COMMAND_RPC_GET_OUTPUTS_BIN::response &res) const
gets specific outputs to mix with
Definition: blockchain.cpp:2014
void invalidate_block_template_cache()
invalidates any cached block template
Definition: blockchain.cpp:4330
handle syncing calls instead of the backing db, synchronously
Definition: blockchain.h:72
Definition: hardfork.h:39
uint8_t get_next_hard_fork_version() const
returns the next hardfork version
Definition: blockchain.h:745
uint64_t m_btc_expected_reward
Definition: blockchain.h:1014
int main(int argc, char *argv[])
Definition: blockchain_export.cpp:44
bool get_alternative_blocks(std::list< block > &blocks) const
compiles a list of all blocks stored as alternative chains
Definition: blockchain.cpp:1757
bool flush_txes_from_pool(const std::list< crypto::hash > &txids)
remove transactions from the transaction pool (if present)
Definition: blockchain.cpp:3110
bool add_new_block(const block &bl_, block_verification_context &bvc)
adds a block to the blockchain
Definition: blockchain.cpp:3517
Definition: verification_context.h:54
void sign_block(block &b, std::string privateKey)
Digitally sign the block.
Definition: blockchain.cpp:1395
container for passing a block and metadata about it on the blockchain
Definition: blockchain.h:97
bool m_show_time_stats
Definition: blockchain.h:969
bool get_short_chain_history(std::list< crypto::hash > &ids) const
gets the hashes for a subset of the blockchain
Definition: blockchain.cpp:615
uint64_t height
the height of the block in the blockchain
Definition: blockchain.h:100
static uint64_t get_dynamic_per_kb_fee(uint64_t block_reward, size_t median_block_size, uint8_t version)
get dynamic per kB fee for a given block size
Definition: blockchain.cpp:2850
bool prepare_handle_incoming_blocks(const std::list< block_complete_entry > &blocks)
performs some preprocessing on a group of incoming blocks to speed up verification ...
Definition: blockchain.cpp:3728
void check_against_checkpoints(const checkpoints &points, bool enforce)
check the blockchain against a set of checkpoints
Definition: blockchain.cpp:3550
void load_compiled_in_block_hashes()
loads block hashes from compiled-in data set
bool check_tx_input(size_t tx_version, const txin_to_key &txin, const crypto::hash &tx_prefix_hash, const std::vector< crypto::signature > &sig, const rct::rctSig &rct_signatures, std::vector< rct::ctkey > &output_keys, uint64_t *pmax_related_block_height)
collect output public keys of a transaction input set
Definition: blockchain.cpp:2977
bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan=NULL) const
gets the block with a given hash
Definition: blockchain.cpp:682
std::unordered_map< crypto::hash, crypto::hash > m_blocks_longhash_table
Definition: blockchain.h:960
std::unordered_map< crypto::hash, size_t > blocks_by_id_index
Definition: blockchain.h:933
void cache_block_template(const block &b, const cryptonote::account_public_address &address, const blobdata &nonce, const difficulty_type &diff, uint64_t expected_reward, uint64_t pool_cookie)
stores a new cached block template
Definition: blockchain.cpp:4336
bool check_fee(size_t blob_size, uint64_t fee) const
validate a transaction&#39;s fee
Definition: blockchain.cpp:2877
difficulty_type cumulative_difficulty
the accumulated difficulty after that block
Definition: blockchain.h:102
std::vector< difficulty_type > m_difficulties
Definition: blockchain.h:977
bool update_checkpoints(const std::string &file_path, bool check_dns)
loads new checkpoints from a file and optionally from DNS
Definition: blockchain.cpp:3587
std::unordered_map< crypto::hash, block_extended_info > blocks_ext_by_hash
Definition: blockchain.h:941
void remove_txpool_tx(const crypto::hash &txid)
Definition: blockchain.cpp:4088
void lock()
Definition: blockchain.cpp:4300
block m_btc
Definition: blockchain.h:1009
HardFork::State get_hard_fork_state() const
gets the hardfork voting state object
Definition: blockchain.cpp:4165
Holds cryptonote related classes and helpers.
Definition: db_bdb.cpp:225
void set_validator_key(std::string key)
set validator key
Definition: blockchain.h:926
uint64_t m_sync_counter
Definition: blockchain.h:975
internal::map< const std::string, node > map
Definition: mstch.hpp:119
Definition: verification_context.h:38
uint8_t get_next_version() const
returns the next version
Definition: hardfork.cpp:390
uint8_t get_hard_fork_version(uint64_t height) const
returns the actual hardfork version for a given block height
Definition: blockchain.h:764
void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t &meta)
Definition: blockchain.cpp:4083
Definition: core_rpc_server_commands_defs.h:310
std::vector< uint64_t > m_global_output_indexes
Definition: blockchain.h:91
size_t get_alternative_blocks_count() const
returns the number of alternative blocks stored
Definition: blockchain.cpp:1769
bool check_tx_outputs(const transaction &tx, tx_verification_context &tvc)
check that a transaction&#39;s outputs conform to current standards
Definition: blockchain.cpp:2521
bool get_txpool_tx_meta(const crypto::hash &txid, txpool_tx_meta_t &meta) const
Definition: blockchain.cpp:4098
std::atomic< bool > m_cancel
Definition: blockchain.h:1006
virtual uint64_t height() const =0
fetch the current blockchain height
Definition: validators.h:103
bool get_hard_fork_voting_info(uint8_t version, uint32_t &window, uint32_t &votes, uint32_t &threshold, uint64_t &earliest_height, uint8_t &voting) const
Definition: blockchain.cpp:4170
void print_blockchain(uint64_t start_index, uint64_t end_index) const
prints data about a snippet of the blockchain
Definition: blockchain.cpp:2200
void print_blockchain_index() const
prints every block&#39;s hash
Definition: blockchain.cpp:2219
uint64_t get_current_blockchain_height() const
get the current height of the blockchain
Definition: blockchain.cpp:262
void add_out_to_get_random_outs(COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount &result_outs, uint64_t amount, size_t i) const
adds the given output to the requested set of random outputs
Definition: blockchain.cpp:1778
std::vector< crypto::hash > m_blocks_txs_check
Definition: blockchain.h:965
transactions_container m_transactions
Definition: blockchain.h:955
HardFork * m_hardfork
Definition: blockchain.h:1002
bool m_btc_valid
Definition: blockchain.h:1015
void get_all_known_block_ids(std::list< crypto::hash > &main, std::list< crypto::hash > &alt, std::list< crypto::hash > &invalid) const
get all block hashes (main chain, alt chains, and invalid blocks)
Definition: blockchain.cpp:723
bool deinit()
Uninitializes the blockchain state.
Definition: blockchain.cpp:468
difficulty_type get_difficulty_for_next_block()
returns the difficulty target the next block to be added must meet
Definition: blockchain.cpp:744
bool get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request &req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response &res) const
gets random outputs to mix with
Definition: blockchain.cpp:1793
Definition: cryptonote_protocol_defs.h:181
uint64_t m_keeper_block_height
Definition: blockchain.h:89
uint8_t get_ideal_hard_fork_version() const
returns the newest hardfork version known to the blockchain
Definition: blockchain.h:738
blockchain_db_sync_mode
Definition: blockchain.h:69
void cancel()
Definition: blockchain.cpp:4212
int b
Definition: base.py:1
std::map< uint64_t, std::tuple< uint64_t, uint64_t, uint64_t > > get_output_histogram(const std::vector< uint64_t > &amounts, bool unlocked, uint64_t recent_cutoff) const
return a histogram of outputs on the blockchain
Definition: blockchain.cpp:4175
Definition: cryptonote_basic.h:130
std::list< std::pair< block_extended_info, uint64_t > > get_alternative_chains() const
returns a set of known alternate chains
Definition: blockchain.cpp:4180
Definition: rctTypes.h:323
Leave syncing up to the backing db (safest, but slowest because of disk I/O)
Definition: blockchain.h:74
bool have_block(const crypto::hash &id) const
checks if a block is known about with a given hash
Definition: blockchain.cpp:2334
std::unordered_map< crypto::hash, transaction_chain_entry > transactions_container
Definition: blockchain.h:935
bool handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request &arg, NOTIFY_RESPONSE_GET_OBJECTS::request &rsp)
retrieves a set of blocks and their transactions, and possibly other transactions ...
Definition: blockchain.cpp:1705
bool m_testnet
Definition: blockchain.h:1004
bool m_enforce_dns_checkpoints
Definition: blockchain.h:1000
bool rollback_blockchain_switching(std::list< block > &original_chain, uint64_t rollback_height)
reverts the blockchain to its previous state following a failed switch
Definition: blockchain.cpp:885
uint64_t get_adjusted_time() const
get the "adjusted time"
Definition: blockchain.cpp:3035
void set_enforce_dns_checkpoints(bool enforce)
configure whether or not to enforce DNS-based checkpoints
Definition: blockchain.cpp:3622
bool get_blocks(uint64_t start_offset, size_t count, std::list< std::pair< cryptonote::blobdata, block >> &blocks, std::list< cryptonote::blobdata > &txs) const
get blocks and transactions from blocks based on start height and count
Definition: blockchain.cpp:1657
electroneum::basic::Validators * m_validators
Definition: blockchain.h:1018
bool get_random_rct_outs(const COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::request &req, COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::response &res) const
gets random ringct outputs to mix with
Definition: blockchain.cpp:1900
std::map< uint64_t, std::vector< std::pair< crypto::hash, size_t > > > outputs_container
Definition: blockchain.h:945
uint8_t get_ideal_hard_fork_version(uint64_t height) const
returns the newest hardfork version voted to be enabled as of a certain height
Definition: blockchain.h:755
Definition: cryptonote_core.h:59
BlockchainDB * m_db
Definition: blockchain.h:948
bool check_block_timestamp(const block &b) const
Definition: blockchain.h:1289
uint8_t version
Definition: blockchain.cpp:86
bool for_all_txpool_txes(std::function< bool(const crypto::hash &, const txpool_tx_meta_t &, const cryptonote::blobdata *)>, bool include_blob=false) const
Definition: blockchain.cpp:4122
bool reset_and_set_genesis_block(const block &b)
clears the blockchain and starts a new one
Definition: blockchain.cpp:572
Transaction pool, handles transactions which are not part of a block.
Definition: tx_pool.h:93
void normalize_v7_difficulties()
Normalize the cumulative difficulty for V7 blocks, fixing the differing difficulty among nodes...
Definition: blockchain.cpp:831
std::string blobdata
Definition: blobdatatype.h:36
bool store_blockchain()
stores the blockchain
Definition: blockchain.cpp:438
#define blocks
Definition: sha512-hash.c:11
Blockchain(tx_memory_pool &tx_pool)
Blockchain constructor.
Definition: blockchain.cpp:114
tx_memory_pool & m_tx_pool
Definition: blockchain.h:950
void on_new_tx_from_block(const cryptonote::transaction &tx)
called when we see a tx originating from a block
Definition: blockchain.cpp:2463
Definition: core_rpc_server_commands_defs.h:363
crypto::hash get_block_id_by_height(uint64_t height) const
gets a block&#39;s hash given a height
Definition: blockchain.cpp:658
bool handle_block_to_main_chain(const block &bl, block_verification_context &bvc)
validate and add a new block to the end of the blockchain
Definition: blockchain.cpp:2360
Now-defunct (TODO: remove) struct from in-memory blockchain.
Definition: blockchain.h:86
blobdata m_btc_nonce
Definition: blockchain.h:1011
Definition: cryptonote_basic.h:421
bool complete_timestamps_vector(uint64_t start_height, std::vector< uint64_t > &timestamps)
finish an alternate chain&#39;s timestamp window from the main chain
Definition: blockchain.cpp:1424
void check_ring_signature(const crypto::hash &tx_prefix_hash, const crypto::key_image &key_image, const std::vector< rct::ctkey > &pubkeys, const std::vector< crypto::signature > &sig, uint64_t &result)
validates a transaction input&#39;s ring signature
Definition: blockchain.cpp:2824
boost::thread_group m_async_pool
Definition: blockchain.h:989
void set_show_time_stats(bool stats)
set whether or not to show/print time statistics
Definition: blockchain.h:717
std::string m_validator_key
Definition: blockchain.h:985
internal::NamedArgWithType< char, T > arg(StringRef name, const T &arg)
Definition: format.h:3450
blockchain_db_sync_mode m_db_sync_mode
Definition: blockchain.h:967
std::uint64_t difficulty_type
Definition: difficulty.h:41
uint64_t get_txpool_tx_count() const
Definition: blockchain.cpp:4093
epee::critical_section m_blockchain_lock
Definition: blockchain.h:952
bool check_block_timestamp(const block &b, uint64_t &median_ts) const
checks a block&#39;s timestamp
Definition: blockchain.cpp:3064
uint64_t already_generated_coins
the total coins minted after that block
Definition: blockchain.h:103
POD_CLASS key_image
Definition: crypto.h:93
const BlockchainDB & get_db() const
get a reference to the BlockchainDB in use by Blockchain
Definition: blockchain.h:853
a struct containing txpool per transaction metadata
Definition: blockchain_db.h:137
void output_scan_worker(const uint64_t amount, const std::vector< uint64_t > &offsets, std::vector< output_data_t > &outputs, std::unordered_map< crypto::hash, cryptonote::transaction > &txs) const
get a number of outputs of a specific amount
Definition: blockchain.cpp:3705
void safesyncmode(const bool onoff)
Put DB in safe sync mode.
Definition: blockchain.cpp:4153
Definition: core_rpc_server_commands_defs.h:461
bool is_within_compiled_block_hash_area() const
Definition: blockchain.h:909
uint8_t get_current_hard_fork_version() const
gets the current hardfork version in use/voted for
Definition: blockchain.h:731
bool get_tx_outputs_gindexs(const crypto::hash &tx_id, std::vector< uint64_t > &indexs) const
gets the global indices for outputs from a given transaction
Definition: blockchain.cpp:2440
Definition: cryptonote_protocol_defs.h:231
std::vector< block_extended_info > blocks_container
Definition: blockchain.h:939
size_t get_total_transactions() const
gets the total number of transactions on the main chain
Definition: blockchain.cpp:2367
void set_user_options(uint64_t maxthreads, uint64_t blocks_per_sync, blockchain_db_sync_mode sync_mode, bool fast_sync, std::string validator_key)
Update the validators public key by fetching data from electroneum&#39;s endpoint.
Definition: blockchain.cpp:4136
boost::asio::io_service m_async_service
Definition: blockchain.h:988
uint64_t m_db_blocks_per_sync
Definition: blockchain.h:971
bool for_all_outputs(std::function< bool(uint64_t amount, const crypto::hash &tx_hash, size_t tx_idx)>) const
perform a check on all outputs in the blockchain
Definition: blockchain.cpp:4325
void return_tx_to_pool(std::vector< transaction > &txs)
Definition: blockchain.cpp:3092
bool init(BlockchainDB *db, const bool testnet=false, const cryptonote::test_options *test_options=NULL)
Initialize the Blockchain state.
Definition: blockchain.cpp:271
The BlockchainDB backing store interface declaration/contract.
Definition: blockchain_db.h:342
uint64_t block_difficulty(uint64_t i) const
gets the difficulty of the block with a given height
Definition: blockchain.cpp:2094
bool for_blocks_range(const uint64_t &h1, const uint64_t &h2, std::function< bool(uint64_t, const crypto::hash &, const block &)>) const
perform a check on all blocks in the blockchain in the given range
Definition: blockchain.cpp:4315
size_t m_blob_size
Definition: blockchain.h:90
crypto::hash get_tail_id() const
get the hash of the most recent block on the blockchain
Definition: blockchain.cpp:596
uint32_t get_difficulty_target() const
Definition: blockchain.cpp:4113
POD_CLASS hash
Definition: hash.h:46
difficulty_type m_btc_difficulty
Definition: blockchain.h:1012
A container for blockchain checkpoints.
Definition: checkpoints.h:52
State
Definition: hardfork.h:42
void set_validators_list_instance(std::unique_ptr< electroneum::basic::Validators > &v)
Definition: blockchain.h:928
bool cleanup_handle_incoming_blocks(bool force_sync=false)
incoming blocks post-processing, cleanup, and disk sync
Definition: blockchain.cpp:3647
void add_txpool_tx(transaction &tx, const txpool_tx_meta_t &meta)
Definition: blockchain.cpp:4078
bool update_next_cumulative_size_limit()
calculate the block size limit for the next block to be added
Definition: blockchain.cpp:3501
bool validate_miner_transaction(const block &b, size_t cumulative_block_size, uint64_t fee, uint64_t &base_reward, uint64_t already_generated_coins, bool &partial_block_reward, uint8_t version)
validates a miner (coinbase) transaction
Definition: blockchain.cpp:1135
bool have_tx_keyimges_as_spent(const transaction &tx) const
check if any key image in a transaction has already been spent
Definition: blockchain.cpp:2555
bool get_txpool_tx_blob(const crypto::hash &txid, cryptonote::blobdata &bd) const
Definition: blockchain.cpp:4103
blocks_ext_by_hash m_alternative_chains
Definition: blockchain.h:993
bool get_transactions(const t_ids_container &txs_ids, t_tx_container &txs, t_missed_container &missed_txs) const
Definition: blockchain.cpp:2170
transaction tx
Definition: blockchain.h:88
bool scan_outputkeys_for_indexes(size_t tx_version, const txin_to_key &tx_in_to_key, visitor_t &vis, const crypto::hash &tx_prefix_hash, uint64_t *pmax_related_block_height=NULL) const
collects the keys for all outputs being "spent" as an input
Definition: blockchain.cpp:142
void unlock()
Definition: blockchain.cpp:4305
bool is_testnet() const
get information about hardfork voting for a version
Definition: blockchain.h:786
epee::critical_section m_difficulty_lock
Definition: blockchain.h:980
uint8_t get_current_version() const
returns the current version
Definition: hardfork.cpp:358
bool find_blockchain_supplement(const std::list< crypto::hash > &qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request &resp) const
get recent block hashes for a foreign chain
Definition: blockchain.cpp:2246
account_public_address m_btc_address
Definition: blockchain.h:1010
uint64_t get_dynamic_per_kb_fee_estimate(uint64_t grace_blocks) const
get dynamic per kB fee estimate for the next few blocks
Definition: blockchain.cpp:2910
Definition: cryptonote_basic.h:198
uint8_t get_ideal_version() const
returns the latest "ideal" version
Definition: hardfork.cpp:364
uint64_t m_timestamps_and_difficulties_height
Definition: blockchain.h:978
uint32_t get_mempool_tx_livetime() const
Definition: blockchain.cpp:4127
bool for_all_key_images(std::function< bool(const crypto::key_image &)>) const
perform a check on all key images in the blockchain
Definition: blockchain.cpp:4310
Definition: core_rpc_server_commands_defs.h:443
void set_checkpoints(checkpoints &&chk_pts)
assign a set of blockchain checkpoint hashes
Definition: blockchain.h:149
uint8_t get(uint64_t height) const
returns the hard fork version for the given block height
Definition: hardfork.cpp:345
void add_out_to_get_rct_random_outs(std::list< COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry > &outs, uint64_t amount, size_t i) const
adds the given output to the requested set of random ringct outputs
Definition: blockchain.cpp:1883
Definition: blockchain.h:80
uint64_t m_btc_pool_cookie
Definition: blockchain.h:1013
void get_last_n_blocks_sizes(std::vector< size_t > &sz, size_t count) const
gets recent block sizes for median calculation
Definition: blockchain.cpp:1188
uint8_t threshold
Definition: blockchain.cpp:88