void BlockchainSynchronizer::startBlockchainSync() { GetBlocksResponse response; GetBlocksRequest req = getCommonHistory(); try { if (!req.knownBlocks.empty()) { auto queryBlocksCompleted = std::promise<std::error_code>(); auto queryBlocksWaitFuture = queryBlocksCompleted.get_future(); m_node.queryBlocks( std::move(req.knownBlocks), req.syncStart.timestamp, response.newBlocks, response.startHeight, [&queryBlocksCompleted](std::error_code ec) { auto detachedPromise = std::move(queryBlocksCompleted); detachedPromise.set_value(ec); }); std::error_code ec = queryBlocksWaitFuture.get(); if (ec) { setFutureStateIf(State::idle, [this] { return m_futureState != State::stopped; }); m_observerManager.notify(&IBlockchainSynchronizerObserver::synchronizationCompleted, ec); } else { processBlocks(response); } } } catch (std::exception&) { setFutureStateIf(State::idle, [this] { return m_futureState != State::stopped; }); m_observerManager.notify(&IBlockchainSynchronizerObserver::synchronizationCompleted, std::make_error_code(std::errc::invalid_argument)); } }
void BlockchainSynchronizer::startBlockchainSync() { GetBlocksResponse response; GetBlocksRequest req = getCommonHistory(); try { if (!req.knownBlocks.empty()) { asyncOperationCompleted = std::promise<std::error_code>(); asyncOperationWaitFuture = asyncOperationCompleted.get_future(); m_node.queryBlocks (std::move(req.knownBlocks), req.syncStart.timestamp, response.newBlocks, response.startHeight, std::bind(&BlockchainSynchronizer::onGetBlocksCompleted, this, std::placeholders::_1)); std::error_code ec = asyncOperationWaitFuture.get(); if (ec) { setFutureStateIf(State::idle, std::bind( [](State futureState) -> bool { return futureState != State::stopped; }, std::ref(m_futureState))); m_observerManager.notify(&IBlockchainSynchronizerObserver::synchronizationCompleted, ec); } else { processBlocks(response); } } } catch (std::exception& e) { std::cout << e.what() << std::endl; setFutureStateIf(State::idle, std::bind( [](State futureState) -> bool { return futureState != State::stopped; }, std::ref(m_futureState))); m_observerManager.notify( &IBlockchainSynchronizerObserver::synchronizationCompleted, std::make_error_code(std::errc::invalid_argument)); } }