Files
thehub/libs/p2p/SyncSPVAction.h
T
tomFlowee 6ade318b2e Introduce interleaving during download
The download from a peer is now limited to just 4000 blocks, at which
point the download proceeds from another peer.
Naturally it can go back to the first afterwards too.

The idea is that we download a month worth of blocks at a time and then
fetch the same blocks from a backup peer in order to be certain we
actually see the real state.
The problem we've seen is that after the first downloads we end up
starting the second and if the initial sync or a similar large download
happens, many people won't leave it running until the backup actually
completes since the UI looks like its finished.

This is also a good starting point for rating peers at download speed by
having predictable chunks and that means we could time and aim to use
the faster peers.
This is becoming relevant as we can see a huge difference where peers
give you 10x performance compared to some of the slower ones.
2024-02-23 22:08:28 +01:00

78 lines
2.4 KiB
C++

/*
* This file is part of the Flowee project
* Copyright (C) 2020-2023 Tom Zander <tom@flowee.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef FLOWEE_SYNCSPVACTION_H
#define FLOWEE_SYNCSPVACTION_H
#include "Action.h"
#include <bloom.h>
#include <map>
#include <random>
#include <set>
#include <boost/date_time/posix_time/posix_time.hpp>
class PrivacySegment;
/**
* The goal of this action is to make sure all SPV wallets are synched to the chain-tip.
*
* This action is started every time when the header is moved. We run every couple of seconds
* and have the responsibility to start connections to peers and make sure the SPV wallets have
* good enough data to ensure they have all the information they need using merkleblock downloads.
*/
class SyncSPVAction : public Action
{
public:
SyncSPVAction(DownloadManager *parent);
protected:
void execute(const boost::system::error_code &error) override;
private:
std::random_device m_randomDevice;
struct PeerDownloadInfo {
int peerId;
int fromBlock;
int toBlock; // to-and-including
};
struct Info {
boost::posix_time::ptime lastCheckedTime;
int lastHeight = 0;
int slowPunishment = 0; // punishment score for being slow
int connectionsTriedForWallet = 0;
/**
* Remember which blocks were downloaded by which peer in order to actually
* get our security that when we ask multiple peers for the same blocks, we
* don't mess up and ask the same one twice.
*/
std::vector<PeerDownloadInfo> previousDownloads;
};
std::map<PrivacySegment*, Info> m_segmentInfos;
// if nothing happened several calls, we consider us finished
int m_quietCount = 0;
const int MinPeersPerWallet;
};
#endif