diff --git a/src/common/command_line.cpp b/src/common/command_line.cpp index 0474f9cd..a7b9a5ff 100644 --- a/src/common/command_line.cpp +++ b/src/common/command_line.cpp @@ -37,6 +37,7 @@ namespace command_line const arg_descriptor arg_no_predownload ( "no-predownload", "Do not pre-download blockchain database"); const arg_descriptor arg_force_predownload ( "force-predownload", "Pre-download blockchain database regardless of it's status"); + const arg_descriptor arg_process_predownload_from_path("predownload-from-local-path", "Instead of downloading file use downloaded local file"); const arg_descriptor arg_validate_predownload ( "validate-predownload", "Paranoid mode, re-validate each block from pre-downloaded database and rebuild own database"); const arg_descriptor arg_predownload_link ( "predownload-link", "Override url for blockchain database pre-downloading"); diff --git a/src/common/command_line.h b/src/common/command_line.h index 2c147d20..905b1067 100644 --- a/src/common/command_line.h +++ b/src/common/command_line.h @@ -229,6 +229,7 @@ namespace command_line extern const arg_descriptor arg_db_engine; extern const arg_descriptor arg_no_predownload; extern const arg_descriptor arg_force_predownload; + extern const arg_descriptor arg_process_predownload_from_path; extern const arg_descriptor arg_validate_predownload; extern const arg_descriptor arg_predownload_link; extern const arg_descriptor arg_deeplink; diff --git a/src/common/pre_download.h b/src/common/pre_download.h index eb86bea8..57dd724d 100644 --- a/src/common/pre_download.h +++ b/src/common/pre_download.h @@ -59,53 +59,59 @@ namespace tools // okay, let's download - std::string downloading_file_path = db_main_file_path + ".download"; - - LOG_PRINT_MAGENTA("Trying to download blockchain database from " << url << " ...", LOG_LEVEL_0); - epee::net_utils::http::interruptible_http_client cl; - - crypto::stream_cn_hash hash_stream; - auto last_update = std::chrono::system_clock::now(); - - auto cb = [&hash_stream, &last_update, &cb_should_stop](const std::string& buff, uint64_t total_bytes, uint64_t received_bytes) + if (!command_line::has_arg(vm, command_line::arg_process_predownload_from_path)) { - if (cb_should_stop(total_bytes, received_bytes)) + + LOG_PRINT_MAGENTA("Trying to download blockchain database from " << url << " ...", LOG_LEVEL_0); + epee::net_utils::http::interruptible_http_client cl; + + crypto::stream_cn_hash hash_stream; + auto last_update = std::chrono::system_clock::now(); + + auto cb = [&hash_stream, &last_update, &cb_should_stop](const std::string& buff, uint64_t total_bytes, uint64_t received_bytes) { - LOG_PRINT_MAGENTA(ENDL << "Interrupting download", LOG_LEVEL_0); - return false; + if (cb_should_stop(total_bytes, received_bytes)) + { + LOG_PRINT_MAGENTA(ENDL << "Interrupting download", LOG_LEVEL_0); + return false; + } + + hash_stream.update(buff.data(), buff.size()); + + auto dif = std::chrono::system_clock::now() - last_update; + if (dif >= std::chrono::milliseconds(300)) + { + boost::io::ios_flags_saver ifs(std::cout); + std::cout << "Received " << received_bytes / 1048576 << " of " << total_bytes / 1048576 << " MiB ( " << std::fixed << std::setprecision(1) << 100.0 * received_bytes / total_bytes << " %)\r"; + last_update = std::chrono::system_clock::now(); + } + + return true; + }; + + tools::create_directories_if_necessary(working_folder); + r = cl.download_and_unzip(cb, downloading_file_path, url, 5000 /* timout */, "GET", std::string(), 30 /* fails count */); + if (!r) + { + LOG_PRINT_RED("Downloading failed", LOG_LEVEL_0); + return !flag_force_predownload; // fatal error only if force-predownload } - hash_stream.update(buff.data(), buff.size()); - - auto dif = std::chrono::system_clock::now() - last_update; - if (dif >= std::chrono::milliseconds(300)) + crypto::hash data_hash = hash_stream.calculate_hash(); + if (epee::string_tools::pod_to_hex(data_hash) != pre_download.hash) { - boost::io::ios_flags_saver ifs(std::cout); - std::cout << "Received " << received_bytes / 1048576 << " of " << total_bytes / 1048576 << " MiB ( " << std::fixed << std::setprecision(1) << 100.0 * received_bytes / total_bytes << " %)\r"; - last_update = std::chrono::system_clock::now(); + LOG_ERROR("hash missmatch in downloaded file, got: " << epee::string_tools::pod_to_hex(data_hash) << ", expected: " << pre_download.hash); + return !flag_force_predownload; // fatal error only if force-predownload } - return true; - }; - - tools::create_directories_if_necessary(working_folder); - r = cl.download_and_unzip(cb, downloading_file_path, url, 5000 /* timout */, "GET", std::string(), 30 /* fails count */); - if (!r) - { - LOG_PRINT_RED("Downloading failed", LOG_LEVEL_0); - return !flag_force_predownload; // fatal error only if force-predownload + LOG_PRINT_GREEN("Download succeeded, hash " << pre_download.hash << " is correct", LOG_LEVEL_0); } - - crypto::hash data_hash = hash_stream.calculate_hash(); - if (epee::string_tools::pod_to_hex(data_hash) != pre_download.hash) + else { - LOG_ERROR("hash missmatch in downloaded file, got: " << epee::string_tools::pod_to_hex(data_hash) << ", expected: " << pre_download.hash); - return !flag_force_predownload; // fatal error only if force-predownload + downloading_file_path = command_line::get_arg(vm, command_line::arg_process_predownload_from_path); } - LOG_PRINT_GREEN("Download succeeded, hash " << pre_download.hash << " is correct" , LOG_LEVEL_0); - if (!command_line::has_arg(vm, command_line::arg_validate_predownload)) { boost::filesystem::remove(db_main_file_path, ec); @@ -138,11 +144,14 @@ namespace tools std::string path_to_temp_blockchain_file = path_to_temp_blockchain + "/" + dbbs.get_db_main_file_name(); tools::create_directories_if_necessary(path_to_temp_blockchain); - boost::filesystem::rename(downloading_file_path, path_to_temp_blockchain_file, ec); - if (ec) + if (downloading_file_path != path_to_temp_blockchain_file) { - LOG_ERROR("Rename failed: " << downloading_file_path << " -> " << path_to_temp_blockchain_file); - return false; + boost::filesystem::rename(downloading_file_path, path_to_temp_blockchain_file, ec); + if (ec) + { + LOG_ERROR("Rename failed: " << downloading_file_path << " -> " << path_to_temp_blockchain_file); + return false; + } } // remove old blockchain database from disk @@ -180,6 +189,28 @@ namespace tools r = target_core.init(target_core_vm); CHECK_AND_ASSERT_MES(r, false, "Failed to init target core"); + if (true/*TODO: copnfigure with command line option*/) + { + //set checkpoints + { + currency::checkpoints checkpoints; + bool res = currency::create_checkpoints(checkpoints); + CHECK_AND_ASSERT_MES(res, 1, "Failed to initialize checkpoints"); + res = source_core.set_checkpoints(std::move(checkpoints)); + CHECK_AND_ASSERT_MES(res, 1, "Failed to initialize core"); + } + { + currency::checkpoints checkpoints; + bool res = currency::create_checkpoints(checkpoints); + CHECK_AND_ASSERT_MES(res, 1, "Failed to initialize checkpoints"); + res = target_core.set_checkpoints(std::move(checkpoints)); + CHECK_AND_ASSERT_MES(res, 1, "Failed to initialize core"); + } + } + + + + CHECK_AND_ASSERT_MES(target_core.get_top_block_height() == 0, false, "Target blockchain initialized not empty"); uint64_t total_blocks = source_core.get_current_blockchain_size(); diff --git a/src/currency_core/currency_config.h b/src/currency_core/currency_config.h index e3a91ec3..0dab6f1e 100644 --- a/src/currency_core/currency_config.h +++ b/src/currency_core/currency_config.h @@ -227,7 +227,7 @@ #define CURRENCY_POOLDATA_FOLDERNAME_PREFIX "poolstate_" #define CURRENCY_POOLDATA_FOLDERNAME_SUFFIX "_v1" #define CURRENCY_BLOCKCHAINDATA_FOLDERNAME_PREFIX "blockchain_" -#define CURRENCY_BLOCKCHAINDATA_FOLDERNAME_SUFFIX "_v1" +#define CURRENCY_BLOCKCHAINDATA_FOLDERNAME_SUFFIX "_v2" #define P2P_NET_DATA_FILENAME "p2pstate.bin" #define MINER_CONFIG_FILENAME "miner_conf.json" diff --git a/src/currency_core/currency_core.cpp b/src/currency_core/currency_core.cpp index 112ad3ad..876c2d17 100644 --- a/src/currency_core/currency_core.cpp +++ b/src/currency_core/currency_core.cpp @@ -76,7 +76,10 @@ namespace currency bool core::handle_command_line(const boost::program_options::variables_map& vm) { m_config_folder = command_line::get_arg(vm, command_line::arg_data_dir); - m_stop_after_height = static_cast(command_line::get_arg(vm, command_line::arg_stop_after_height)); + m_stop_after_height = 0; + if(command_line::has_arg(vm, command_line::arg_stop_after_height)) + m_stop_after_height = static_cast(command_line::get_arg(vm, command_line::arg_stop_after_height)); + if (m_stop_after_height != 0) { LOG_PRINT_YELLOW("Daemon will STOP after block " << m_stop_after_height, LOG_LEVEL_0); diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index d9ea6f6c..cb09bdb2 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -162,6 +162,7 @@ int main(int argc, char* argv[]) command_line::add_arg(desc_cmd_sett, command_line::arg_no_predownload); command_line::add_arg(desc_cmd_sett, command_line::arg_force_predownload); + command_line::add_arg(desc_cmd_sett, command_line::arg_process_predownload_from_path); command_line::add_arg(desc_cmd_sett, command_line::arg_validate_predownload); command_line::add_arg(desc_cmd_sett, command_line::arg_predownload_link); command_line::add_arg(desc_cmd_sett, command_line::arg_disable_ntp); diff --git a/src/wallet/wallets_manager.cpp b/src/wallet/wallets_manager.cpp index 9ef767bf..aeed9669 100644 --- a/src/wallet/wallets_manager.cpp +++ b/src/wallet/wallets_manager.cpp @@ -188,6 +188,7 @@ bool wallets_manager::init_command_line(int argc, char* argv[], std::string& fai command_line::add_arg(desc_cmd_sett, arg_qt_dev_tools); command_line::add_arg(desc_cmd_sett, command_line::arg_no_predownload); command_line::add_arg(desc_cmd_sett, command_line::arg_force_predownload); + command_line::add_arg(desc_cmd_sett, command_line::arg_process_predownload_from_path); command_line::add_arg(desc_cmd_sett, command_line::arg_validate_predownload); command_line::add_arg(desc_cmd_sett, command_line::arg_predownload_link); command_line::add_arg(desc_cmd_only, command_line::arg_deeplink);