aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core/blockchain_storage.cpp
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2015-04-08 23:08:23 +0200
committerRiccardo Spagni <ric@spagni.net>2015-04-08 23:08:27 +0200
commitc41d14b2aa3fc883d45299add1cbb8ebbe6c9ed8 (patch)
treef18f76d7e78b50a52c5d796de35e54b72afa3a9a /src/cryptonote_core/blockchain_storage.cpp
parent1523762f59ad0c06f0b19d9de23e5ea40e8ed32f (diff)
parenta8bc7182eaa39d8be61f5e2ed9d98184e5820f17 (diff)
downloadmonzero-core-c41d14b2aa3fc883d45299add1cbb8ebbe6c9ed8.tar.gz
monzero-core-c41d14b2aa3fc883d45299add1cbb8ebbe6c9ed8.tar.xz
monzero-core-c41d14b2aa3fc883d45299add1cbb8ebbe6c9ed8.zip
Merge pull request #256
7d8acd1 explicitly disable AES on ARM (Riccardo Spagni) 4222b37 add arm6 target and flags (Riccardo Spagni) 5675325 new makefile targets for static builds (Riccardo Spagni) 9519526 Only compile BerkeleyDB as an option in non-static (Thomas Winget) 7b14d4a Steps toward multiple dbs available -- working (Thomas Winget) dbdcf11 blockchain_converter: Add support for resume from last block (warptangent) 4880803 blockchain_import: lengthen string for line clear (warptangent) 7476d2e blockchain_export: show progress during export (warptangent) 4bedd68 Update Blockchain::get_db() to return reference instead of pointer (warptangent) 0386e99 Add README for blockchain converter, importer, and exporter utilities (warptangent) ead7fad BerkeleyDB implementation of BlockchainDB seems to be working! (Thomas Winget) ffadb65 blockchain_export: Add compile-time support for BlockchainDB (warptangent) f6cbfb6 Add blockchain_export utility (warptangent) 275cbd4 Add support for database open with flags (warptangent) cb862cb Add mdb_flags variable to LMDB database open (warptangent) 260cc56 Add blockchain_import utility (warptangent) ca75b47 Blockchain: add get_db() accessor, needed for blockchain_import (warptangent) a3dd9d1 blockchain_converter: Add support for batch transactions (warptangent) acb5d29 Update and relocate comment that applies class wide (warptangent) bd9da6d Merges #33 (Thomas Winget) 6e9e8ab Move db_drivers/ to external/ (Thomas Winget) 56a1bf5 fixed BUILD_64 option (Riccardo Spagni) c97a685 fixed arch_width option (Riccardo Spagni) 3a3c07c fixed msys2 / mingw folders based on architecture, added license to unbound CMakeList as that is not part of standard Unbound (Riccardo Spagni) 3b3da86 moved 32-bit/64-bit detection into main CMakeLists (Riccardo Spagni) a0cbf73 removed findlmdb.cmake, no longer required (Riccardo Spagni) 0e8bbdb 32-bit LMDB, removed check for in-system LMDB as it is consensus-critical (Riccardo Spagni) 11e8157 Revert "Moved db_drivers/ into external/ for consistency" (Thomas Winget) daf2a8f Revert "Build fixed, goofed up some CMake" (Thomas Winget) e146027 BlockchainBDB passes unit tests (Thomas Winget) 43477b7 BerkeleyDB Blockchain building, not working yet (Thomas Winget) cade0da CMake wiring, minor cleanup, minor test addition (Thomas Winget) 1bc8939 BerkeleyDB BlockchainDB impl copy/paste/modify (Thomas Winget) 5112dc3 Try to not pollute cryptonote namespace (Thomas Winget) edef0bb Initial commit of BDB BlockchainDB implementation (Thomas Winget) eee3ee7 BlockchainDB implementations have names now (Thomas Winget) 5d2a2b7 Fixed includes in BlockchainDB unit tests (Thomas Winget) 8b82f3c Build fixed, goofed up some CMake (Thomas Winget) b213356 Moved db_drivers/ into external/ for consistency (Thomas Winget) 5eab480 Moved BlockchainDB into its own src/ subfolder (Thomas Winget) 0ad0784 Changed log level of debug message -- too spammy (Thomas Winget) 6485dac BlockchainLMDB: Add profiling to tx_exists() (warptangent) 83fb6d8 BlockchainLMDB: Add batch transaction support to tx_exists() (warptangent) 8529c0e BlockchainDB, BlockchainLMDB: Add profiling for DB commits (warptangent) 7a66b8b BlockchainDB: Add virtual function declarations for batch transactions (warptangent) b7a2d84 BlockchainLMDB: Add check for open database to two functions (warptangent) 58ecc58 BlockchainLMDB: Add support for batch transactions (warptangent) 8909d7d Improve block and tx processing efficiency by less repeat hashing (warptangent) 3676ac5 Add profiling to block and tx processing (warptangent) ce71abd Move LMDB storage to subfolder (warptangent) 42f8fe5 Fix formatting (warptangent) aa82f78 Fix log statement (warptangent) 26873db Remove unused variable (warptangent) 4b90fd3 Add log statement (warptangent) 2531aa3 Add and extend log statements (warptangent) 59305d3 Blockchain: match original function declaration from blockchain_storage (warptangent) cd972bd Update year and formatting in license (warptangent) b88ab64 Fix Blockchain::get_tail_id() to set parameter to last block number instead of height (warptangent) 963bc09 Revert "Bounds error, should fix #27" (warptangent) 6f1c4b4 Bounds error, should fix #27 (Thomas Winget) 84fe5fb Add compile-time support for both db implementations: in-memory and LMDB (warptangent) 8bd1983 Blockchain: reflect log updates from blockchain_storage (warptangent) 7f9b070 Blockchain: reflect log and assert updates from blockchain_storage (warptangent) 70342ec Blockchain: reflect log level of blockchain_storage (warptangent) c8d27fb Blockchain: reflect assert behavior of blockchain_storage for get_tx_outputs_gindexs() (warptangent) d00ee78 Update recently added log statement to fix possible null dereference (warptangent) acd4c36 Should fix std::min issues related to size_t (Thomas Winget) 3488359 Add in-source lmdb to build process (Thomas Winget) 4e45fae Initial import of lmdb source (Thomas Winget) 800d9b9 Remove code previously made unused and marked unused (warptangent) 0840c2f Fix height assertion in Blockchain::handle_alternative_block() (warptangent) 63051be Fix comparison between main and alternate chain's cumulative difficulty. (warptangent) 909ea81 Remove a have_block() check so alternate block can be processed (warptangent) 4d0a94b Complete implementation of transaction removal (warptangent) 1701c26 Use block index when obtaining block's difficulty for log statement (warptangent) 4eba21f Fix transfers to support mixins (warptangent) d045dfa Fix transfers (without mixins) (warptangent) 429a740 throw inline functions need to keep exception type (Thomas Winget) 14555ee Fixes segfault in Blockchain::handle_alternative_block (Thomas Winget) 5086ca1 add BlockchainDB tests to new cmake (Thomas Winget) c5c100c Obtain tx hash and tx output index from amount and output offset (warptangent) ad8200a db_lmdb: fix global index calculation off by 1 (moneromooo-monero) 57b80c5 db_lmdb: remove redundant checks (moneromooo-monero) 1362846 blockchain_converter: add --testnet for converting testnet blockchain (moneromooo-monero) c50cd95 Fixes a bug with getting output metadata from BlockchainDB (Thomas Winget) c3fa07b update comments to reflect changed code (Thomas Winget) 59d2b0e db_lmdb: do not give the group database write permissions (moneromooo-monero) 4c2a452 db_lmdb: catch attempt to remove block from an empty blockchain (moneromooo-monero) 3a3459d db_lmdb: factor all the log+throw code paths (moneromooo-monero) 3fcb8da db_lmdb: factor the MDB_val setup code (moneromooo-monero) 609cf7f blockchain_converter: a bit more user friendly output (moneromooo-monero) 2b9f737 blockchain_converter: only call data path function once (moneromooo-monero) 1860658 blockchain: do not append "testnet" to the data directory (moneromooo-monero) 1c578ad db_lmdb: remove block timestamp too when removing a block (moneromooo-monero) c93a186 db_lmdb: do not cast const away (moneromooo-monero) 198368b blockchain: fix wallet syncing from scratch (moneromooo-monero) 1d23db2 db_lmdb: do not keep a dangling pointer to stack objects (moneromooo-monero) 29b5876 db_lmdb: make cursor internal members private (moneromooo-monero) a3157d7 blockchain_storage: refactor genesis block creation (moneromooo-monero) 8e41b1e blockchain_storage: add consts where appropriate (moneromooo-monero) 98bdadc blockchain_converter: delete blockchain on succesful exit (moneromooo-monero) 256162f checkpoints: add consts where appropriate (moneromooo-monero) b7270ab blockchain: add consts where appropriate (moneromooo-monero) 23f3cb4 blockchain_db: add consts where appropriate (moneromooo-monero) 10fd6ca blockchain_db: factor some exception code (moneromooo-monero) 11129b9 blockchain_converter: use the actual blockchain location (moneromooo-monero) 0886183 build: add liblmdb to the cmake autodetection system (moneromooo-monero) 215e63b extraneous semicolon in Blockchain::complete_timestamps_vector (Thomas Winget) 8e1b7e2 raised maximum mapsize for lmdb to ~16GB (Thomas Winget) 6c8b8ac more blockchain height-related fixes, syncing other nodes code this time (Thomas Winget) 9455e0c ~ didn't work, need hard path. debug print. (Thomas Winget) 4af0918 very, VERY primitive blockchain converter (Thomas Winget) 26a7db3 add new checkpointing behavior to Blockchain class (Thomas Winget) 767aac2 Remove unused dependency (Thomas Winget) 006e106 Store output pubkeys separately, bug fixes (Thomas Winget) ab7951d Minor bugfixes, redundancy removal (Thomas Winget) 71b18d7 moar bug fixes, removed debug prints (Thomas Winget) 0915913 BlockchainLMDB seems to be working*! (Thomas Winget) 1a546e3 some bug fixes, but still needs work (Thomas Winget) 006afe2 Minor bug fixes and debug prints (Thomas Winget) 90f402e minor fixes to Blockchain.cpp (Thomas Winget) 74a1a89 Integrate BlockchainDB into cryptonote_core (Thomas Winget) d8c570b All LMDB BlockchainDB implemented, not tested (Thomas Winget) e47e343 LMDB blockchain: remove outputs and spent keys (Thomas Winget) a0af217 Adding block data to LMDB BlockchainDB coded (Thomas Winget) db00ce0 Parts of LMDB impl of BlockchainDB done and working (Thomas Winget) 1240cf8 BlockchainDB unit tests, lmdb linker flag (Thomas Winget) b98b964 Initial commit of lmdb BlockchainDB impl (Thomas Winget) bc44bc1 Initial commit of BlockchainDB tests, other misc (Thomas Winget) 90d6f8b Adding libglim as an external library (Thomas Winget) 07733f9 update new blockchain to build with new changes (Thomas Winget) 1ffbeb2 stupid past me, fixing typos and shit... (Thomas Winget) 67515b8 missing typedef (Thomas Winget) aba548c import of BlockchainDB files (Thomas Winget)
Diffstat (limited to 'src/cryptonote_core/blockchain_storage.cpp')
-rw-r--r--src/cryptonote_core/blockchain_storage.cpp150
1 files changed, 70 insertions, 80 deletions
diff --git a/src/cryptonote_core/blockchain_storage.cpp b/src/cryptonote_core/blockchain_storage.cpp
index d59fc7a58..ee4263687 100644
--- a/src/cryptonote_core/blockchain_storage.cpp
+++ b/src/cryptonote_core/blockchain_storage.cpp
@@ -58,19 +58,19 @@ using namespace cryptonote;
DISABLE_VS_WARNINGS(4267)
//------------------------------------------------------------------
-bool blockchain_storage::have_tx(const crypto::hash &id)
+bool blockchain_storage::have_tx(const crypto::hash &id) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
return m_transactions.find(id) != m_transactions.end();
}
//------------------------------------------------------------------
-bool blockchain_storage::have_tx_keyimg_as_spent(const crypto::key_image &key_im)
+bool blockchain_storage::have_tx_keyimg_as_spent(const crypto::key_image &key_im) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
return m_spent_keys.find(key_im) != m_spent_keys.end();
}
//------------------------------------------------------------------
-transaction *blockchain_storage::get_tx(const crypto::hash &id)
+const transaction *blockchain_storage::get_tx(const crypto::hash &id) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
auto it = m_transactions.find(id);
@@ -80,7 +80,7 @@ transaction *blockchain_storage::get_tx(const crypto::hash &id)
return &it->second.tx;
}
//------------------------------------------------------------------
-uint64_t blockchain_storage::get_current_blockchain_height()
+uint64_t blockchain_storage::get_current_blockchain_height() const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
return m_blocks.size();
@@ -117,24 +117,14 @@ bool blockchain_storage::init(const std::string& config_folder, bool testnet)
else
{
LOG_PRINT_L0("Can't load blockchain storage from file, generating genesis block.");
- block bl = boost::value_initialized<block>();
- block_verification_context bvc = boost::value_initialized<block_verification_context>();
- if (testnet)
- {
- generate_genesis_block(bl, config::testnet::GENESIS_TX, config::testnet::GENESIS_NONCE);
- }
- else
- {
- generate_genesis_block(bl, config::GENESIS_TX, config::GENESIS_NONCE);
- }
- add_new_block(bl, bvc);
- CHECK_AND_ASSERT_MES(!bvc.m_verifivation_failed && bvc.m_added_to_main_chain, false, "Failed to add genesis block to blockchain");
+ if (!store_genesis_block(testnet, true))
+ return false;
}
if(!m_blocks.size())
{
LOG_PRINT_L0("Blockchain not loaded, generating genesis block.");
- if (!store_genesis_block(testnet)) {
+ if (!store_genesis_block(testnet, false)) {
return false;
}
} else {
@@ -163,7 +153,7 @@ bool blockchain_storage::init(const std::string& config_folder, bool testnet)
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::store_genesis_block(bool testnet) {
+bool blockchain_storage::store_genesis_block(bool testnet, bool check_added) {
block bl = ::boost::value_initialized<block>();
block_verification_context bvc = boost::value_initialized<block_verification_context>();
@@ -177,7 +167,7 @@ bool blockchain_storage::store_genesis_block(bool testnet) {
}
add_new_block(bl, bvc);
- CHECK_AND_ASSERT_MES(!bvc.m_verifivation_failed, false, "Failed to add genesis block to blockchain");
+ CHECK_AND_ASSERT_MES(!bvc.m_verifivation_failed && (bvc.m_added_to_main_chain || !check_added), false, "Failed to add genesis block to blockchain");
return true;
}
//------------------------------------------------------------------
@@ -235,7 +225,7 @@ bool blockchain_storage::pop_block_from_blockchain()
m_blocks_index.erase(bl_ind);
//pop block from core
m_blocks.pop_back();
- m_tx_pool.on_blockchain_dec(m_blocks.size()-1, get_tail_id());
+ m_tx_pool->on_blockchain_dec(m_blocks.size()-1, get_tail_id());
return true;
}
//------------------------------------------------------------------
@@ -311,7 +301,7 @@ bool blockchain_storage::purge_transaction_from_blockchain(const crypto::hash& t
if(!is_coinbase(tx))
{
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- bool r = m_tx_pool.add_tx(tx, tvc, true);
+ bool r = m_tx_pool->add_tx(tx, tvc, true);
CHECK_AND_ASSERT_MES(r, false, "purge_block_data_from_blockchain: failed to add transaction to transaction pool");
}
@@ -337,14 +327,14 @@ bool blockchain_storage::purge_block_data_from_blockchain(const block& bl, size_
return res;
}
//------------------------------------------------------------------
-crypto::hash blockchain_storage::get_tail_id(uint64_t& height)
+crypto::hash blockchain_storage::get_tail_id(uint64_t& height) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
height = get_current_blockchain_height()-1;
return get_tail_id();
}
//------------------------------------------------------------------
-crypto::hash blockchain_storage::get_tail_id()
+crypto::hash blockchain_storage::get_tail_id() const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
crypto::hash id = null_hash;
@@ -355,7 +345,7 @@ crypto::hash blockchain_storage::get_tail_id()
return id;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_short_chain_history(std::list<crypto::hash>& ids)
+bool blockchain_storage::get_short_chain_history(std::list<crypto::hash>& ids) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
size_t i = 0;
@@ -385,7 +375,7 @@ bool blockchain_storage::get_short_chain_history(std::list<crypto::hash>& ids)
return true;
}
//------------------------------------------------------------------
-crypto::hash blockchain_storage::get_block_id_by_height(uint64_t height)
+crypto::hash blockchain_storage::get_block_id_by_height(uint64_t height) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(height >= m_blocks.size())
@@ -394,7 +384,7 @@ crypto::hash blockchain_storage::get_block_id_by_height(uint64_t height)
return get_block_hash(m_blocks[height].bl);
}
//------------------------------------------------------------------
-bool blockchain_storage::get_block_by_hash(const crypto::hash &h, block &blk) {
+bool blockchain_storage::get_block_by_hash(const crypto::hash &h, block &blk) const {
CRITICAL_REGION_LOCAL(m_blockchain_lock);
// try to find block in main chain
@@ -414,20 +404,20 @@ bool blockchain_storage::get_block_by_hash(const crypto::hash &h, block &blk) {
return false;
}
//------------------------------------------------------------------
-void blockchain_storage::get_all_known_block_ids(std::list<crypto::hash> &main, std::list<crypto::hash> &alt, std::list<crypto::hash> &invalid) {
+void blockchain_storage::get_all_known_block_ids(std::list<crypto::hash> &main, std::list<crypto::hash> &alt, std::list<crypto::hash> &invalid) const {
CRITICAL_REGION_LOCAL(m_blockchain_lock);
- BOOST_FOREACH(blocks_by_id_index::value_type &v, m_blocks_index)
+ BOOST_FOREACH(const blocks_by_id_index::value_type &v, m_blocks_index)
main.push_back(v.first);
- BOOST_FOREACH(blocks_ext_by_hash::value_type &v, m_alternative_chains)
+ BOOST_FOREACH(const blocks_ext_by_hash::value_type &v, m_alternative_chains)
alt.push_back(v.first);
- BOOST_FOREACH(blocks_ext_by_hash::value_type &v, m_invalid_blocks)
+ BOOST_FOREACH(const blocks_ext_by_hash::value_type &v, m_invalid_blocks)
invalid.push_back(v.first);
}
//------------------------------------------------------------------
-difficulty_type blockchain_storage::get_difficulty_for_next_block()
+difficulty_type blockchain_storage::get_difficulty_for_next_block() const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
std::vector<uint64_t> timestamps;
@@ -539,7 +529,7 @@ bool blockchain_storage::switch_to_alternative_blockchain(std::list<blocks_ext_b
return true;
}
//------------------------------------------------------------------
-difficulty_type blockchain_storage::get_next_difficulty_for_alternative_chain(const std::list<blocks_ext_by_hash::iterator>& alt_chain, block_extended_info& bei)
+difficulty_type blockchain_storage::get_next_difficulty_for_alternative_chain(const std::list<blocks_ext_by_hash::iterator>& alt_chain, block_extended_info& bei) const
{
std::vector<uint64_t> timestamps;
std::vector<difficulty_type> commulative_difficulties;
@@ -584,7 +574,7 @@ difficulty_type blockchain_storage::get_next_difficulty_for_alternative_chain(co
return next_difficulty(timestamps, commulative_difficulties);
}
//------------------------------------------------------------------
-bool blockchain_storage::prevalidate_miner_transaction(const block& b, uint64_t height)
+bool blockchain_storage::prevalidate_miner_transaction(const block& b, uint64_t height) const
{
CHECK_AND_ASSERT_MES(b.miner_tx.vin.size() == 1, false, "coinbase transaction in the block has no inputs");
CHECK_AND_ASSERT_MES(b.miner_tx.vin[0].type() == typeid(txin_gen), false, "coinbase transaction in the block has the wrong type");
@@ -607,7 +597,7 @@ bool blockchain_storage::prevalidate_miner_transaction(const block& b, uint64_t
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins)
+bool blockchain_storage::validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins) const
{
//validate reward
uint64_t money_in_use = 0;
@@ -634,7 +624,7 @@ bool blockchain_storage::validate_miner_transaction(const block& b, size_t cumul
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_backward_blocks_sizes(size_t from_height, std::vector<size_t>& sz, size_t count)
+bool blockchain_storage::get_backward_blocks_sizes(size_t from_height, std::vector<size_t>& sz, size_t count) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
CHECK_AND_ASSERT_MES(from_height < m_blocks.size(), false, "Internal error: get_backward_blocks_sizes called with from_height=" << from_height << ", blockchain height = " << m_blocks.size());
@@ -646,7 +636,7 @@ bool blockchain_storage::get_backward_blocks_sizes(size_t from_height, std::vect
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count)
+bool blockchain_storage::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t count) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(!m_blocks.size())
@@ -654,12 +644,12 @@ bool blockchain_storage::get_last_n_blocks_sizes(std::vector<size_t>& sz, size_t
return get_backward_blocks_sizes(m_blocks.size() -1, sz, count);
}
//------------------------------------------------------------------
-uint64_t blockchain_storage::get_current_comulative_blocksize_limit()
+uint64_t blockchain_storage::get_current_cumulative_blocksize_limit() const
{
return m_current_block_cumul_sz_limit;
}
//------------------------------------------------------------------
-bool blockchain_storage::create_block_template(block& b, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, const blobdata& ex_nonce)
+bool blockchain_storage::create_block_template(block& b, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, const blobdata& ex_nonce) const
{
size_t median_size;
uint64_t already_generated_coins;
@@ -680,16 +670,16 @@ bool blockchain_storage::create_block_template(block& b, const account_public_ad
size_t txs_size;
uint64_t fee;
- if (!m_tx_pool.fill_block_template(b, median_size, already_generated_coins, txs_size, fee)) {
+ if (!m_tx_pool->fill_block_template(b, median_size, already_generated_coins, txs_size, fee)) {
return false;
}
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
size_t real_txs_size = 0;
uint64_t real_fee = 0;
- CRITICAL_REGION_BEGIN(m_tx_pool.m_transactions_lock);
+ CRITICAL_REGION_BEGIN(m_tx_pool->m_transactions_lock);
BOOST_FOREACH(crypto::hash &cur_hash, b.tx_hashes) {
- auto cur_res = m_tx_pool.m_transactions.find(cur_hash);
- if (cur_res == m_tx_pool.m_transactions.end()) {
+ auto cur_res = m_tx_pool->m_transactions.find(cur_hash);
+ if (cur_res == m_tx_pool->m_transactions.end()) {
LOG_ERROR("Creating block template: error: transaction not found");
continue;
}
@@ -778,7 +768,7 @@ bool blockchain_storage::create_block_template(block& b, const account_public_ad
return false;
}
//------------------------------------------------------------------
-bool blockchain_storage::complete_timestamps_vector(uint64_t start_top_height, std::vector<uint64_t>& timestamps)
+bool blockchain_storage::complete_timestamps_vector(uint64_t start_top_height, std::vector<uint64_t>& timestamps) const
{
if(timestamps.size() >= BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW)
@@ -943,7 +933,7 @@ bool blockchain_storage::handle_alternative_block(const block& b, const crypto::
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks, std::list<transaction>& txs)
+bool blockchain_storage::get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks, std::list<transaction>& txs) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(start_offset >= m_blocks.size())
@@ -959,7 +949,7 @@ bool blockchain_storage::get_blocks(uint64_t start_offset, size_t count, std::li
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks)
+bool blockchain_storage::get_blocks(uint64_t start_offset, size_t count, std::list<block>& blocks) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(start_offset >= m_blocks.size())
@@ -1003,7 +993,7 @@ bool blockchain_storage::handle_get_objects(NOTIFY_REQUEST_GET_OBJECTS::request&
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_alternative_blocks(std::list<block>& blocks)
+bool blockchain_storage::get_alternative_blocks(std::list<block>& blocks) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
@@ -1014,21 +1004,21 @@ bool blockchain_storage::get_alternative_blocks(std::list<block>& blocks)
return true;
}
//------------------------------------------------------------------
-size_t blockchain_storage::get_alternative_blocks_count()
+size_t blockchain_storage::get_alternative_blocks_count() const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
return m_alternative_chains.size();
}
//------------------------------------------------------------------
-bool blockchain_storage::add_out_to_get_random_outs(std::vector<std::pair<crypto::hash, size_t> >& amount_outs, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs, uint64_t amount, size_t i)
+bool blockchain_storage::add_out_to_get_random_outs(const std::vector<std::pair<crypto::hash, size_t> >& amount_outs, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs, uint64_t amount, size_t i) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
- transactions_container::iterator tx_it = m_transactions.find(amount_outs[i].first);
+ transactions_container::const_iterator tx_it = m_transactions.find(amount_outs[i].first);
CHECK_AND_ASSERT_MES(tx_it != m_transactions.end(), false, "internal error: transaction with id " << amount_outs[i].first << ENDL <<
", used in mounts global index for amount=" << amount << ": i=" << i << "not found in transactions index");
CHECK_AND_ASSERT_MES(tx_it->second.tx.vout.size() > amount_outs[i].second, false, "internal error: in global outs index, transaction out index="
<< amount_outs[i].second << " more than transaction outputs = " << tx_it->second.tx.vout.size() << ", for tx id = " << amount_outs[i].first);
- transaction& tx = tx_it->second.tx;
+ const transaction& tx = tx_it->second.tx;
CHECK_AND_ASSERT_MES(tx.vout[amount_outs[i].second].target.type() == typeid(txout_to_key), false, "unknown tx out type");
//check if transaction is unlocked
@@ -1041,7 +1031,7 @@ bool blockchain_storage::add_out_to_get_random_outs(std::vector<std::pair<crypto
return true;
}
//------------------------------------------------------------------
-size_t blockchain_storage::find_end_of_allowed_index(const std::vector<std::pair<crypto::hash, size_t> >& amount_outs)
+size_t blockchain_storage::find_end_of_allowed_index(const std::vector<std::pair<crypto::hash, size_t> >& amount_outs) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(!amount_outs.size())
@@ -1050,7 +1040,7 @@ size_t blockchain_storage::find_end_of_allowed_index(const std::vector<std::pair
do
{
--i;
- transactions_container::iterator it = m_transactions.find(amount_outs[i].first);
+ transactions_container::const_iterator it = m_transactions.find(amount_outs[i].first);
CHECK_AND_ASSERT_MES(it != m_transactions.end(), 0, "internal error: failed to find transaction from outputs index with tx_id=" << amount_outs[i].first);
if(it->second.m_keeper_block_height + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW <= get_current_blockchain_height() )
return i+1;
@@ -1058,7 +1048,7 @@ size_t blockchain_storage::find_end_of_allowed_index(const std::vector<std::pair
return 0;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res)
+bool blockchain_storage::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
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
BOOST_FOREACH(uint64_t amount, req.amounts)
@@ -1071,7 +1061,7 @@ bool blockchain_storage::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDO
LOG_PRINT_L1("COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS: not outs for amount " << amount << ", wallet should use some real outs when it lookup for some mix, so, at least one out for this amount should exist");
continue;//actually this is strange situation, wallet should use some real outs when it lookup for some mix, so, at least one out for this amount should exist
}
- std::vector<std::pair<crypto::hash, size_t> >& amount_outs = it->second;
+ const std::vector<std::pair<crypto::hash, size_t> >& amount_outs = it->second;
//it is not good idea to use top fresh outs, because it increases possibility of transaction canceling on split
//lets find upper bound of not fresh outs
size_t up_index_limit = find_end_of_allowed_index(amount_outs);
@@ -1106,7 +1096,7 @@ bool blockchain_storage::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDO
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, uint64_t& starter_offset)
+bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, uint64_t& starter_offset) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
@@ -1153,7 +1143,7 @@ bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash
return true;
}
//------------------------------------------------------------------
-uint64_t blockchain_storage::block_difficulty(size_t i)
+uint64_t blockchain_storage::block_difficulty(size_t i) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
CHECK_AND_ASSERT_MES(i < m_blocks.size(), false, "wrong block index i = " << i << " at blockchain_storage::block_difficulty()");
@@ -1163,7 +1153,7 @@ uint64_t blockchain_storage::block_difficulty(size_t i)
return m_blocks[i].cumulative_difficulty - m_blocks[i-1].cumulative_difficulty;
}
//------------------------------------------------------------------
-double blockchain_storage::get_avg_block_size( size_t count)
+double blockchain_storage::get_avg_block_size( size_t count) const
{
if (count > get_current_blockchain_height()) return 500;
@@ -1241,7 +1231,7 @@ void blockchain_storage::print_blockchain_outs(const std::string& file)
}
}
//------------------------------------------------------------------
-bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp)
+bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(!find_blockchain_supplement(qblock_ids, resp.start_height))
@@ -1254,7 +1244,7 @@ bool blockchain_storage::find_blockchain_supplement(const std::list<crypto::hash
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<block, std::list<transaction> > >& blocks, uint64_t& total_height, uint64_t& start_height, size_t max_count)
+bool blockchain_storage::find_blockchain_supplement(const uint64_t req_start_block, const std::list<crypto::hash>& qblock_ids, std::list<std::pair<block, std::list<transaction> > >& blocks, uint64_t& total_height, uint64_t& start_height, size_t max_count) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(req_start_block > 0) {
@@ -1293,7 +1283,7 @@ bool blockchain_storage::add_block_as_invalid(const block_extended_info& bei, co
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::have_block(const crypto::hash& id)
+bool blockchain_storage::have_block(const crypto::hash& id) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(m_blocks_index.count(id))
@@ -1331,13 +1321,13 @@ bool blockchain_storage::push_transaction_to_global_outs_index(const transaction
return true;
}
//------------------------------------------------------------------
-size_t blockchain_storage::get_total_transactions()
+size_t blockchain_storage::get_total_transactions() const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
return m_transactions.size();
}
//------------------------------------------------------------------
-bool blockchain_storage::get_outs(uint64_t amount, std::list<crypto::public_key>& pkeys)
+bool blockchain_storage::get_outs(uint64_t amount, std::list<crypto::public_key>& pkeys) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
auto it = m_outputs.find(amount);
@@ -1428,7 +1418,7 @@ bool blockchain_storage::add_transaction_from_block(const transaction& tx, const
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs)
+bool blockchain_storage::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
auto it = m_transactions.find(tx_id);
@@ -1443,7 +1433,7 @@ bool blockchain_storage::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::check_tx_inputs(const transaction& tx, uint64_t& max_used_block_height, crypto::hash& max_used_block_id)
+bool blockchain_storage::check_tx_inputs(const transaction& tx, uint64_t& max_used_block_height, crypto::hash& max_used_block_id) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
bool res = check_tx_inputs(tx, &max_used_block_height);
@@ -1453,7 +1443,7 @@ bool blockchain_storage::check_tx_inputs(const transaction& tx, uint64_t& max_us
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::have_tx_keyimges_as_spent(const transaction &tx)
+bool blockchain_storage::have_tx_keyimges_as_spent(const transaction &tx) const
{
BOOST_FOREACH(const txin_v& in, tx.vin)
{
@@ -1464,13 +1454,13 @@ bool blockchain_storage::have_tx_keyimges_as_spent(const transaction &tx)
return false;
}
//------------------------------------------------------------------
-bool blockchain_storage::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_block_height)
+bool blockchain_storage::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_block_height) const
{
crypto::hash tx_prefix_hash = get_transaction_prefix_hash(tx);
return check_tx_inputs(tx, tx_prefix_hash, pmax_used_block_height);
}
//------------------------------------------------------------------
-bool blockchain_storage::check_tx_inputs(const transaction& tx, const crypto::hash& tx_prefix_hash, uint64_t* pmax_used_block_height)
+bool blockchain_storage::check_tx_inputs(const transaction& tx, const crypto::hash& tx_prefix_hash, uint64_t* pmax_used_block_height) const
{
size_t sig_index = 0;
if(pmax_used_block_height)
@@ -1502,7 +1492,7 @@ bool blockchain_storage::check_tx_inputs(const transaction& tx, const crypto::ha
return true;
}
//------------------------------------------------------------------
-bool blockchain_storage::is_tx_spendtime_unlocked(uint64_t unlock_time)
+bool blockchain_storage::is_tx_spendtime_unlocked(uint64_t unlock_time) const
{
if(unlock_time < CRYPTONOTE_MAX_BLOCK_NUMBER)
{
@@ -1523,15 +1513,15 @@ bool blockchain_storage::is_tx_spendtime_unlocked(uint64_t unlock_time)
return false;
}
//------------------------------------------------------------------
-bool blockchain_storage::check_tx_input(const txin_to_key& txin, const crypto::hash& tx_prefix_hash, const std::vector<crypto::signature>& sig, uint64_t* pmax_related_block_height)
+bool blockchain_storage::check_tx_input(const txin_to_key& txin, const crypto::hash& tx_prefix_hash, const std::vector<crypto::signature>& sig, uint64_t* pmax_related_block_height) const
{
CRITICAL_REGION_LOCAL(m_blockchain_lock);
struct outputs_visitor
{
std::vector<const crypto::public_key *>& m_results_collector;
- blockchain_storage& m_bch;
- outputs_visitor(std::vector<const crypto::public_key *>& results_collector, blockchain_storage& bch):m_results_collector(results_collector), m_bch(bch)
+ const blockchain_storage& m_bch;
+ outputs_visitor(std::vector<const crypto::public_key *>& results_collector, const blockchain_storage& bch):m_results_collector(results_collector), m_bch(bch)
{}
bool handle_output(const transaction& tx, const tx_out& out)
{
@@ -1573,13 +1563,13 @@ bool blockchain_storage::check_tx_input(const txin_to_key& txin, const crypto::h
return crypto::check_ring_signature(tx_prefix_hash, txin.k_image, output_keys, sig.data());
}
//------------------------------------------------------------------
-uint64_t blockchain_storage::get_adjusted_time()
+uint64_t blockchain_storage::get_adjusted_time() const
{
//TODO: add collecting median time
return time(NULL);
}
//------------------------------------------------------------------
-bool blockchain_storage::check_block_timestamp_main(const block& b)
+bool blockchain_storage::check_block_timestamp_main(const block& b) const
{
if(b.timestamp > get_adjusted_time() + CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT)
{
@@ -1595,7 +1585,7 @@ bool blockchain_storage::check_block_timestamp_main(const block& b)
return check_block_timestamp(std::move(timestamps), b);
}
//------------------------------------------------------------------
-bool blockchain_storage::check_block_timestamp(std::vector<uint64_t> timestamps, const block& b)
+bool blockchain_storage::check_block_timestamp(std::vector<uint64_t> timestamps, const block& b) const
{
if(timestamps.size() < BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW)
return true;
@@ -1696,7 +1686,7 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
transaction tx;
size_t blob_size = 0;
uint64_t fee = 0;
- if(!m_tx_pool.take_tx(tx_id, tx, blob_size, fee))
+ if(!m_tx_pool->take_tx(tx_id, tx, blob_size, fee))
{
LOG_PRINT_L1("Block with id: " << id << "has at least one unknown transaction with id: " << tx_id);
purge_block_data_from_blockchain(bl, tx_processed_count);
@@ -1708,7 +1698,7 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
{
LOG_PRINT_L1("Block with id: " << id << "has at least one transaction (id: " << tx_id << ") with wrong inputs.");
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- bool add_res = m_tx_pool.add_tx(tx, tvc, true);
+ bool add_res = m_tx_pool->add_tx(tx, tvc, true);
CHECK_AND_ASSERT_MES2(add_res, "handle_block_to_main_chain: failed to add transaction back to transaction pool");
purge_block_data_from_blockchain(bl, tx_processed_count);
add_block_as_invalid(bl, id);
@@ -1721,7 +1711,7 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
{
LOG_PRINT_L1("Block with id: " << id << " failed to add transaction to blockchain storage");
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- bool add_res = m_tx_pool.add_tx(tx, tvc, true);
+ bool add_res = m_tx_pool->add_tx(tx, tvc, true);
CHECK_AND_ASSERT_MES2(add_res, "handle_block_to_main_chain: failed to add transaction back to transaction pool");
purge_block_data_from_blockchain(bl, tx_processed_count);
bvc.m_verifivation_failed = true;
@@ -1785,7 +1775,7 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
/*if(!m_orphanes_reorganize_in_work)
review_orphaned_blocks_with_new_block_id(id, true);*/
- m_tx_pool.on_blockchain_inc(bei.height, id);
+ m_tx_pool->on_blockchain_inc(bei.height, id);
//LOG_PRINT_L0("BLOCK: " << ENDL << "" << dump_obj_as_json(bei.bl));
return true;
}
@@ -1808,7 +1798,7 @@ bool blockchain_storage::add_new_block(const block& bl_, block_verification_cont
//copy block here to let modify block.target
block bl = bl_;
crypto::hash id = get_block_hash(bl);
- CRITICAL_REGION_LOCAL(m_tx_pool);//to avoid deadlock lets lock tx_pool for whole add/reorganize process
+ CRITICAL_REGION_LOCAL(*m_tx_pool);//to avoid deadlock lets lock tx_pool for whole add/reorganize process
CRITICAL_REGION_LOCAL1(m_blockchain_lock);
if(have_block(id))
{
@@ -1829,7 +1819,7 @@ bool blockchain_storage::add_new_block(const block& bl_, block_verification_cont
return handle_block_to_main_chain(bl, id, bvc);
}
//------------------------------------------------------------------
-void blockchain_storage::check_against_checkpoints(checkpoints& points, bool enforce)
+void blockchain_storage::check_against_checkpoints(const checkpoints& points, bool enforce)
{
const auto& pts = points.get_points();