1
0
Fork 0
forked from lthn/blockchain
blockchain/src/currency_core/core_tools.h
2018-12-27 18:50:45 +03:00

58 lines
No EOL
2.4 KiB
C++

// Copyright (c) 2014-2018 Zano Project
// Copyright (c) 2014-2018 The Louisdor Project
// Copyright (c) 2014-2018 Zano Project
// Copyright (c) 2014-2018 The Louisdor Project
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#pragma once
#include <algorithm>
#include "blockchain_storage.h"
#include "bc_offers_service.h"
namespace currency
{
inline
bool resync_market(blockchain_storage& bcs, bc_services::bc_offers_service& offers_service)
{
offers_service.clear();
uint64_t top_block_height = bcs.get_top_block_height();
currency::block b = AUTO_VAL_INIT(b);
bcs.get_top_block(b);
uint64_t start_height = bcs.get_block_h_older_then(b.timestamp - OFFER_MAXIMUM_LIFE_TIME);
uint64_t print_height_interval = std::max((top_block_height - start_height) / 10ull + 1, 10ull), next_print_height = start_height + print_height_interval;
LOG_PRINT_MAGENTA("Resynchronizing market from height " << start_height << " to height " << top_block_height, LOG_LEVEL_0);
for (uint64_t i = start_height; i <= top_block_height; i++)
{
if (i == next_print_height)
{
LOG_PRINT_MAGENTA("Resynchronizing market: height " << i << " of " << top_block_height << " (" << ((i - start_height) * 100 / (top_block_height - start_height)) << "%)", LOG_LEVEL_0);
next_print_height += print_height_interval;
}
bcs.get_block_by_height(i, b);
crypto::hash block_id = get_block_hash(b);
for (auto tx_id : b.tx_hashes)
{
auto tx_ptr = bcs.get_tx(tx_id);
CHECK_AND_ASSERT_MES(tx_ptr, false, "Internal error: Failed to get transaction " << tx_id << "from block[" << i << "]");
uint64_t count = 0;
for (const auto& at : tx_ptr->attachment)
{
if (at.type() == typeid(currency::tx_service_attachment))
{
const currency::tx_service_attachment& tsa = boost::get<currency::tx_service_attachment>(at);
if (tsa.service_id == BC_OFFERS_SERVICE_ID)
{
static_cast<currency::i_bc_service*>(&offers_service)->handle_entry_push(tsa, count, *tx_ptr, i, block_id, b.timestamp); //handle service
}
++count;
}
}
}
}
LOG_PRINT_MAGENTA("Resynchronizing market finished.", LOG_LEVEL_0);
return true;
}
}