1 // Copyright (c) 2014-2018 The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #ifndef BITCOIN_TIMEDATA_H 6 #define BITCOIN_TIMEDATA_H 7 8 #include <algorithm> 9 #include <assert.h> 10 #include <stdint.h> 11 #include <vector> 12 13 static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60; 14 15 class CNetAddr; 16 17 /** 18 * Median filter over a stream of values. 19 * Returns the median of the last N numbers 20 */ 21 template <typename T> 22 class CMedianFilter 23 { 24 private: 25 std::vector<T> vValues; 26 std::vector<T> vSorted; 27 unsigned int nSize; 28 29 public: CMedianFilter(unsigned int _size,T initial_value)30 CMedianFilter(unsigned int _size, T initial_value) : nSize(_size) 31 { 32 vValues.reserve(_size); 33 vValues.push_back(initial_value); 34 vSorted = vValues; 35 } 36 input(T value)37 void input(T value) 38 { 39 if (vValues.size() == nSize) { 40 vValues.erase(vValues.begin()); 41 } 42 vValues.push_back(value); 43 44 vSorted.resize(vValues.size()); 45 std::copy(vValues.begin(), vValues.end(), vSorted.begin()); 46 std::sort(vSorted.begin(), vSorted.end()); 47 } 48 median()49 T median() const 50 { 51 int vSortedSize = vSorted.size(); 52 assert(vSortedSize > 0); 53 if (vSortedSize & 1) // Odd number of elements 54 { 55 return vSorted[vSortedSize / 2]; 56 } else // Even number of elements 57 { 58 return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / 2; 59 } 60 } 61 size()62 int size() const 63 { 64 return vValues.size(); 65 } 66 sorted()67 std::vector<T> sorted() const 68 { 69 return vSorted; 70 } 71 }; 72 73 /** Functions to keep track of adjusted P2P time */ 74 int64_t GetTimeOffset(); 75 int64_t GetAdjustedTime(); 76 void AddTimeData(const CNetAddr& ip, int64_t nTime); 77 78 #endif // BITCOIN_TIMEDATA_H 79