mirror of
https://github.com/monero-project/monero.git
synced 2025-08-13 16:05:30 -04:00
blocks: use auto-generated .c files instead of 'LD -r -b binary'
This commit is contained in:
parent
215651cbb3
commit
02d3ef7bda
17 changed files with 113 additions and 185 deletions
|
@ -41,12 +41,6 @@ set(cryptonote_core_private_headers
|
|||
tx_pool.h
|
||||
cryptonote_tx_utils.h)
|
||||
|
||||
if(PER_BLOCK_CHECKPOINT)
|
||||
set(Blocks "blocks")
|
||||
else()
|
||||
set(Blocks "")
|
||||
endif()
|
||||
|
||||
monero_private_headers(cryptonote_core
|
||||
${cryptonote_core_private_headers})
|
||||
monero_add_library(cryptonote_core
|
||||
|
@ -69,5 +63,4 @@ target_link_libraries(cryptonote_core
|
|||
${Boost_SYSTEM_LIBRARY}
|
||||
${Boost_THREAD_LIBRARY}
|
||||
PRIVATE
|
||||
${Blocks}
|
||||
${EXTRA_LIBRARIES})
|
||||
|
|
|
@ -53,9 +53,6 @@
|
|||
#include "ringct/rctSigs.h"
|
||||
#include "common/perf_timer.h"
|
||||
#include "common/notify.h"
|
||||
#if defined(PER_BLOCK_CHECKPOINT)
|
||||
#include "blocks/blocks.h"
|
||||
#endif
|
||||
|
||||
#undef MONERO_DEFAULT_LOG_CATEGORY
|
||||
#define MONERO_DEFAULT_LOG_CATEGORY "blockchain"
|
||||
|
@ -341,7 +338,7 @@ uint64_t Blockchain::get_current_blockchain_height() const
|
|||
//------------------------------------------------------------------
|
||||
//FIXME: possibly move this into the constructor, to avoid accidentally
|
||||
// dereferencing a null BlockchainDB pointer
|
||||
bool Blockchain::init(BlockchainDB* db, const network_type nettype, bool offline, const cryptonote::test_options *test_options, difficulty_type fixed_difficulty)
|
||||
bool Blockchain::init(BlockchainDB* db, const network_type nettype, bool offline, const cryptonote::test_options *test_options, difficulty_type fixed_difficulty, const GetCheckpointsCallback get_checkpoints/* = nullptr*/)
|
||||
{
|
||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||
CRITICAL_REGION_LOCAL(m_tx_pool);
|
||||
|
@ -439,7 +436,7 @@ bool Blockchain::init(BlockchainDB* db, const network_type nettype, bool offline
|
|||
|
||||
#if defined(PER_BLOCK_CHECKPOINT)
|
||||
if (m_nettype != FAKECHAIN)
|
||||
load_compiled_in_block_hashes();
|
||||
load_compiled_in_block_hashes(get_checkpoints);
|
||||
#endif
|
||||
|
||||
MINFO("Blockchain initialized. last block: " << m_db->height() - 1 << ", " << epee::misc_utils::get_time_interval_string(timestamp_diff) << " time ago, current difficulty: " << get_difficulty_for_next_block());
|
||||
|
@ -4404,19 +4401,21 @@ void Blockchain::cancel()
|
|||
|
||||
#if defined(PER_BLOCK_CHECKPOINT)
|
||||
static const char expected_block_hashes_hash[] = "954cb2bbfa2fe6f74b2cdd22a1a4c767aea249ad47ad4f7c9445f0f03260f511";
|
||||
void Blockchain::load_compiled_in_block_hashes()
|
||||
void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback get_checkpoints)
|
||||
{
|
||||
const bool testnet = m_nettype == TESTNET;
|
||||
const bool stagenet = m_nettype == STAGENET;
|
||||
if (m_fast_sync && get_blocks_dat_start(testnet, stagenet) != nullptr && get_blocks_dat_size(testnet, stagenet) > 0)
|
||||
if (get_checkpoints == nullptr || !m_fast_sync)
|
||||
{
|
||||
MINFO("Loading precomputed blocks (" << get_blocks_dat_size(testnet, stagenet) << " bytes)");
|
||||
|
||||
return;
|
||||
}
|
||||
const epee::span<const unsigned char> checkpoints = get_checkpoints(m_nettype);
|
||||
if (!checkpoints.empty())
|
||||
{
|
||||
MINFO("Loading precomputed blocks (" << checkpoints.size() << " bytes)");
|
||||
if (m_nettype == MAINNET)
|
||||
{
|
||||
// first check hash
|
||||
crypto::hash hash;
|
||||
if (!tools::sha256sum(get_blocks_dat_start(testnet, stagenet), get_blocks_dat_size(testnet, stagenet), hash))
|
||||
if (!tools::sha256sum(checkpoints.data(), checkpoints.size(), hash))
|
||||
{
|
||||
MERROR("Failed to hash precomputed blocks data");
|
||||
return;
|
||||
|
@ -4436,9 +4435,9 @@ void Blockchain::load_compiled_in_block_hashes()
|
|||
}
|
||||
}
|
||||
|
||||
if (get_blocks_dat_size(testnet, stagenet) > 4)
|
||||
if (checkpoints.size() > 4)
|
||||
{
|
||||
const unsigned char *p = get_blocks_dat_start(testnet, stagenet);
|
||||
const unsigned char *p = checkpoints.data();
|
||||
const uint32_t nblocks = *p | ((*(p+1))<<8) | ((*(p+2))<<16) | ((*(p+3))<<24);
|
||||
if (nblocks > (std::numeric_limits<uint32_t>::max() - 4) / sizeof(hash))
|
||||
{
|
||||
|
@ -4446,7 +4445,7 @@ void Blockchain::load_compiled_in_block_hashes()
|
|||
return;
|
||||
}
|
||||
const size_t size_needed = 4 + nblocks * sizeof(crypto::hash);
|
||||
if(nblocks > 0 && nblocks > (m_db->height() + HASH_OF_HASHES_STEP - 1) / HASH_OF_HASHES_STEP && get_blocks_dat_size(testnet, stagenet) >= size_needed)
|
||||
if(nblocks > 0 && nblocks > (m_db->height() + HASH_OF_HASHES_STEP - 1) / HASH_OF_HASHES_STEP && checkpoints.size() >= size_needed)
|
||||
{
|
||||
p += sizeof(uint32_t);
|
||||
m_blocks_hash_of_hashes.reserve(nblocks);
|
||||
|
|
|
@ -38,9 +38,11 @@
|
|||
#include <boost/multi_index/hashed_index.hpp>
|
||||
#include <boost/multi_index/member.hpp>
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "span.h"
|
||||
#include "syncobj.h"
|
||||
#include "string_tools.h"
|
||||
#include "cryptonote_basic/cryptonote_basic.h"
|
||||
|
@ -73,6 +75,15 @@ namespace cryptonote
|
|||
db_nosync //!< Leave syncing up to the backing db (safest, but slowest because of disk I/O)
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Callback routine that returns checkpoints data for specific network type
|
||||
*
|
||||
* @param network network type
|
||||
*
|
||||
* @return checkpoints data, empty span if there ain't any checkpoints for specific network type
|
||||
*/
|
||||
typedef std::function<const epee::span<const unsigned char>(cryptonote::network_type network)> GetCheckpointsCallback;
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
@ -117,10 +128,11 @@ namespace cryptonote
|
|||
* @param offline true if running offline, else false
|
||||
* @param test_options test parameters
|
||||
* @param fixed_difficulty fixed difficulty for testing purposes; 0 means disabled
|
||||
* @param get_checkpoints if set, will be called to get checkpoints data
|
||||
*
|
||||
* @return true on success, false if any initialization steps fail
|
||||
*/
|
||||
bool init(BlockchainDB* db, const network_type nettype = MAINNET, bool offline = false, const cryptonote::test_options *test_options = NULL, difficulty_type fixed_difficulty = 0);
|
||||
bool init(BlockchainDB* db, const network_type nettype = MAINNET, bool offline = false, const cryptonote::test_options *test_options = NULL, difficulty_type fixed_difficulty = 0, const GetCheckpointsCallback get_checkpoints = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Initialize the Blockchain state
|
||||
|
@ -1369,8 +1381,10 @@ namespace cryptonote
|
|||
* A (possibly empty) set of block hashes can be compiled into the
|
||||
* monero daemon binary. This function loads those hashes into
|
||||
* a useful state.
|
||||
*
|
||||
* @param get_checkpoints if set, will be called to get checkpoints data
|
||||
*/
|
||||
void load_compiled_in_block_hashes();
|
||||
void load_compiled_in_block_hashes(const GetCheckpointsCallback get_checkpoints);
|
||||
|
||||
/**
|
||||
* @brief expands v2 transaction data from blockchain
|
||||
|
|
|
@ -389,7 +389,7 @@ namespace cryptonote
|
|||
return m_blockchain_storage.get_alternative_blocks_count();
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
bool core::init(const boost::program_options::variables_map& vm, const char *config_subdir, const cryptonote::test_options *test_options)
|
||||
bool core::init(const boost::program_options::variables_map& vm, const char *config_subdir, const cryptonote::test_options *test_options, const GetCheckpointsCallback get_checkpoints/* = nullptr */)
|
||||
{
|
||||
start_time = std::time(nullptr);
|
||||
|
||||
|
@ -567,7 +567,7 @@ namespace cryptonote
|
|||
regtest_hard_forks
|
||||
};
|
||||
const difficulty_type fixed_difficulty = command_line::get_arg(vm, arg_fixed_difficulty);
|
||||
r = m_blockchain_storage.init(db.release(), m_nettype, m_offline, regtest ? ®test_test_options : test_options, fixed_difficulty);
|
||||
r = m_blockchain_storage.init(db.release(), m_nettype, m_offline, regtest ? ®test_test_options : test_options, fixed_difficulty, get_checkpoints);
|
||||
|
||||
r = m_mempool.init(max_txpool_weight);
|
||||
CHECK_AND_ASSERT_MES(r, false, "Failed to initialize memory pool");
|
||||
|
|
|
@ -244,10 +244,11 @@ namespace cryptonote
|
|||
* @param vm command line parameters
|
||||
* @param config_subdir subdirectory for config storage
|
||||
* @param test_options configuration options for testing
|
||||
* @param get_checkpoints if set, will be called to get checkpoints data, must return checkpoints data pointer and size or nullptr if there ain't any checkpoints for specific network type
|
||||
*
|
||||
* @return false if one of the init steps fails, otherwise true
|
||||
*/
|
||||
bool init(const boost::program_options::variables_map& vm, const char *config_subdir = NULL, const test_options *test_options = NULL);
|
||||
bool init(const boost::program_options::variables_map& vm, const char *config_subdir = NULL, const test_options *test_options = NULL, const GetCheckpointsCallback get_checkpoints = nullptr);
|
||||
|
||||
/**
|
||||
* @copydoc Blockchain::reset_and_set_genesis_block
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue