5#ifndef BITCOIN_SEEDER_DB_H
6#define BITCOIN_SEEDER_DB_H
8#include <chainparams.h>
37 while (str.size() < 22) {
52 void Update(
bool good, int64_t age,
double tau) {
53 double f = exp(-age / tau);
60 READWRITE(obj.weight, obj.count, obj.reliability);
217 uint8_t tried = obj.ourLastTry != 0;
223 READWRITE(obj.ourLastTry, obj.ignoreTill, obj.stat2H, obj.stat8H,
224 obj.stat1D, obj.stat1W);
230 READWRITE(obj.total, obj.success, obj.clientVersion);
247 SER_READ(obj, obj.checkpointVerified =
true);
306 void Good_(
const CService &ip,
int clientV, std::string clientSV,
307 int blocks, uint64_t services,
bool checkpointVerified);
314 void GetIPs_(std::set<CNetAddr> &ips, uint64_t requestedFlags, uint32_t max,
328 if (
ourId.size() > 0) {
336 for (std::map<int, SeederAddrInfo>::iterator it =
idToInfo.begin();
338 (*it).second.ignoreTill = 0;
343 std::vector<CAddrReport> ret;
345 for (std::deque<int>::const_iterator it =
ourId.begin();
346 it !=
ourId.end(); it++) {
364 template <
typename Stream>
void Serialize(Stream &s)
const {
373 for (std::deque<int>::const_iterator it =
ourId.begin();
374 it !=
ourId.end(); it++) {
375 std::map<int, SeederAddrInfo>::iterator ci =
db->
idToInfo.find(*it);
378 for (std::set<int>::const_iterator it =
unkId.begin();
379 it !=
unkId.end(); it++) {
380 std::map<int, SeederAddrInfo>::iterator ci =
db->
idToInfo.find(*it);
396 for (
int i = 0; i < n; i++) {
422 void Add(
const std::vector<CAddress> &vAddr,
bool fForce =
false) {
424 for (
size_t i = 0; i < vAddr.size(); i++) {
425 Add_(vAddr[i], fForce);
429 void GetMany(std::vector<CServiceResult> &ips,
int max) {
443 for (
size_t i = 0; i < ips.size(); i++) {
445 Good_(ips[i].service, ips[i].nClientV, ips[i].strClientV,
446 ips[i].
nHeight, ips[i].services,
447 ips[i].checkpointVerified);
449 Bad_(ips[i].service, ips[i].nBanTime);
454 void GetIPs(std::set<CNetAddr> &ips, uint64_t requestedFlags, uint32_t max,
457 GetIPs_(ips, requestedFlags, max, nets);
const CChainParams & Params()
Return the currently selected parameters.
void Add(const CAddress &addr, bool fForce=false)
void GetMany(std::vector< CServiceResult > &ips, int max)
void Bad_(const CService &ip, int ban)
void ResultMany(const std::vector< CServiceResult > &ips)
void GetStats(CAddrDbStats &stats) const
void GetIPs_(std::set< CNetAddr > &ips, uint64_t requestedFlags, uint32_t max, const bool *nets)
void Good_(const CService &ip, int clientV, std::string clientSV, int blocks, uint64_t services, bool checkpointVerified)
std::vector< CAddrReport > GetAll()
void GetIPs(std::set< CNetAddr > &ips, uint64_t requestedFlags, uint32_t max, const bool *nets)
void Unserialize(Stream &s)
std::map< CService, int > ipToId
std::map< CService, int64_t > banned
std::map< int, SeederAddrInfo > idToInfo
bool Get_(CServiceResult &ip)
void Add(const std::vector< CAddress > &vAddr, bool fForce=false)
void Serialize(Stream &s) const
void Add_(const CAddress &addr, bool force)
int Lookup_(const CService &ip)
std::string clientSubVersion
ReliabilityStatus reliabilityStatus
SERIALIZE_METHODS(CAddrStat, obj)
void Update(bool good, int64_t age, double tau)
A CService with information about it as peer.
static constexpr SerParams V1_DISK
const CCheckpointData & Checkpoints() const
A combination of a network address (CNetAddr) and a (TCP) port.
std::string ToStringAddrPort() const
SERIALIZE_METHODS(SeederAddrInfo, obj)
int64_t GetIgnoreTime() const
CAddrReport GetReport() const
int64_t GetBanTime() const
std::string clientSubVersion
ReliabilityStatus GetReliabilityStatus() const
static const int MIN_PEER_PROTO_VERSION
disconnect from peers older than this proto version
static int GetRequireHeight()
static bool HasCheckpoint()
static std::string ToString(const CService &ip)
#define SER_WRITE(obj, code)
static auto WithParams(const Params ¶ms, T &&t)
Return a wrapper around t that (de)serializes it with specified parameter params.
#define SER_READ(obj, code)
@ OK
The message verification was successful.
MapCheckpoints mapCheckpoints
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.