Duke Leto
4 years ago
2 changed files with 62 additions and 157 deletions
@ -1,77 +1,39 @@ |
|||
// Copyright (c) 2014 The Bitcoin Core developers
|
|||
// Copyright (c) 2019-2020 The Hush developers
|
|||
// Copyright (c) 2020 The Zcash developers
|
|||
// Distributed under the MIT software license, see the accompanying
|
|||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|||
// file COPYING or https://www.opensource.org/licenses/mit-license.php
|
|||
|
|||
#ifndef BITCOIN_TIMEDATA_H |
|||
#define BITCOIN_TIMEDATA_H |
|||
|
|||
#include <algorithm> |
|||
#include <assert.h> |
|||
#include <set> |
|||
#include <stdint.h> |
|||
#include <vector> |
|||
#include "netbase.h" |
|||
#include "sync.h" |
|||
|
|||
class CNetAddr; |
|||
|
|||
/**
|
|||
* Median filter over a stream of values. |
|||
* Returns the median of the last N numbers |
|||
*/ |
|||
template <typename T> |
|||
class CMedianFilter |
|||
class CTimeWarning |
|||
{ |
|||
private: |
|||
std::vector<T> vValues; |
|||
std::vector<T> vSorted; |
|||
unsigned int nSize; |
|||
CCriticalSection cs; |
|||
std::set<CNetAddr> setKnown; |
|||
size_t nPeersAhead; |
|||
size_t nPeersBehind; |
|||
|
|||
public: |
|||
CMedianFilter(unsigned int size, T initial_value) : nSize(size) |
|||
{ |
|||
vValues.reserve(size); |
|||
vValues.push_back(initial_value); |
|||
vSorted = vValues; |
|||
} |
|||
|
|||
void input(T value) |
|||
{ |
|||
if (vValues.size() == nSize) { |
|||
vValues.erase(vValues.begin()); |
|||
} |
|||
vValues.push_back(value); |
|||
|
|||
vSorted.resize(vValues.size()); |
|||
std::copy(vValues.begin(), vValues.end(), vSorted.begin()); |
|||
std::sort(vSorted.begin(), vSorted.end()); |
|||
} |
|||
|
|||
T median() const |
|||
{ |
|||
int size = vSorted.size(); |
|||
assert(size > 0); |
|||
if (size & 1) // Odd number of elements
|
|||
{ |
|||
return vSorted[size / 2]; |
|||
} else // Even number of elements
|
|||
{ |
|||
return (vSorted[size / 2 - 1] + vSorted[size / 2]) / 2; |
|||
} |
|||
} |
|||
static const size_t TIMEDATA_WARNING_SAMPLES = 8; |
|||
static const size_t TIMEDATA_WARNING_MAJORITY = 6; |
|||
static const size_t TIMEDATA_MAX_SAMPLES = 20; |
|||
static const int64_t TIMEDATA_WARNING_THRESHOLD = 10 * 60; |
|||
static const int64_t TIMEDATA_IGNORE_THRESHOLD = 10 * 24 * 60 * 60; |
|||
|
|||
int size() const |
|||
{ |
|||
return vValues.size(); |
|||
} |
|||
CTimeWarning() : nPeersBehind(0), nPeersAhead(0) {} |
|||
virtual ~CTimeWarning() {} |
|||
|
|||
std::vector<T> sorted() const |
|||
{ |
|||
return vSorted; |
|||
} |
|||
int64_t AddTimeData(const CNetAddr& ip, int64_t nTime, int64_t now); |
|||
virtual void Warn(size_t peersAhead, size_t peersBehind); |
|||
}; |
|||
|
|||
/** Functions to keep track of adjusted P2P time */ |
|||
int64_t GetTimeOffset(); |
|||
int64_t GetAdjustedTime(); |
|||
void AddTimeData(const CNetAddr& ip, int64_t nTime); |
|||
extern CTimeWarning timeWarning; |
|||
|
|||
#endif // BITCOIN_TIMEDATA_H
|
|||
|
Loading…
Reference in new issue