From ba1e2d7c33a2e54e967c248c39439b894881459b Mon Sep 17 00:00:00 2001 From: svost Date: Thu, 10 Feb 2022 22:27:43 +0300 Subject: [PATCH] Includes cleanup --- CMakeLists.txt | 1 + src/CMakeLists.txt | 1 + src/addrman.h | 1 + src/alert.cpp | 2 - src/alert.h | 7 ++- src/checkpoints.h | 1 + src/timedata.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/timedata.h | 76 +++++++++++++++++++++++++++++++++++++ src/util.cpp | 99 +----------------------------------------------- src/util.h | 63 ------------------------------ 10 files changed, 192 insertions(+), 166 deletions(-) create mode 100644 src/timedata.cpp create mode 100644 src/timedata.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fadffe..93e35d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,6 +123,7 @@ set(generic_sources ${CMAKE_CURRENT_SOURCE_DIR}/src/version.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/sync.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/util.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/timedata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/netbase.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ntp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/key.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 34f4283..c81ca14 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -115,6 +115,7 @@ set(generic_sources ${CMAKE_CURRENT_SOURCE_DIR}/script.cpp ${CMAKE_CURRENT_SOURCE_DIR}/stun.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sync.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/timedata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/uint256.cpp ${CMAKE_CURRENT_SOURCE_DIR}/util.cpp ${CMAKE_CURRENT_SOURCE_DIR}/version.cpp diff --git a/src/addrman.h b/src/addrman.h index 7e5f9f5..69a1271 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -6,6 +6,7 @@ #include "netbase.h" #include "protocol.h" +#include "timedata.h" #include "util.h" #include "sync.h" diff --git a/src/alert.cpp b/src/alert.cpp index 939881b..ef2ee46 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -2,8 +2,6 @@ // Alert system // -#include - #include "alert.h" #include "key.h" #include "net.h" diff --git a/src/alert.h b/src/alert.h index d4f9a78..548d398 100644 --- a/src/alert.h +++ b/src/alert.h @@ -6,12 +6,13 @@ #ifndef _BITCOINALERT_H_ #define _BITCOINALERT_H_ 1 -#include -#include - +#include "serialize.h" #include "uint256.h" #include "util.h" +#include +#include + class CNode; /** Alerts are for notifying old versions if they become too obsolete and diff --git a/src/checkpoints.h b/src/checkpoints.h index 701e253..d5c0b06 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -5,6 +5,7 @@ #define BITCOIN_CHECKPOINT_H #include "util.h" +#include "serialize.h" #include "sync.h" #include "uint256.h" diff --git a/src/timedata.cpp b/src/timedata.cpp new file mode 100644 index 0000000..8e5162f --- /dev/null +++ b/src/timedata.cpp @@ -0,0 +1,107 @@ +#include "timedata.h" +#include "netbase.h" +#include "sync.h" +#include "interface.h" + +#include + +static CCriticalSection cs_nTimeOffset; +static uint32_t NOVACOIN_TIMEDATA_MAX_SAMPLES = 200; + +// Trusted NTP offset or median of NTP samples. +extern int64_t nNtpOffset; + +// Median of time samples given by other nodes. +static int64_t nNodesOffset = std::numeric_limits::max(); + +// +// "Never go to sea with two chronometers; take one or three." +// Our three time sources are: +// - System clock +// - Median of other nodes clocks +// - The user (asking the user to fix the system clock if the first two disagree) +// + +// Select time offset: +int64_t GetTimeOffset() +{ + LOCK(cs_nTimeOffset); + // If NTP and system clock are in agreement within 40 minutes, then use NTP. + if (std::abs(nNtpOffset) < 40 * 60) + return nNtpOffset; + + // If not, then choose between median peer time and system clock. + if (std::abs(nNodesOffset) < 70 * 60) + return nNodesOffset; + + return 0; +} + +int64_t GetNodesOffset() +{ + return nNodesOffset; +} + +int64_t GetAdjustedTime() +{ + return GetTime() + GetTimeOffset(); +} + +void AddTimeData(const CNetAddr& ip, int64_t nTime) +{ + int64_t nOffsetSample = nTime - GetTime(); + + LOCK(cs_nTimeOffset); + // Ignore duplicates + static std::set setKnown; + if (setKnown.size() == NOVACOIN_TIMEDATA_MAX_SAMPLES) + return; + if (!setKnown.insert(ip).second) + return; + + // Add data + static CMedianFilter vTimeOffsets(NOVACOIN_TIMEDATA_MAX_SAMPLES,0); + vTimeOffsets.input(nOffsetSample); + printf("Added time data, samples %d, offset %+" PRId64 " (%+" PRId64 " minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60); + if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1) + { + int64_t nMedian = vTimeOffsets.median(); + std::vector vSorted = vTimeOffsets.sorted(); + // Only let other nodes change our time by so much + if (std::abs(nMedian) < 70 * 60) + { + nNodesOffset = nMedian; + } + else + { + nNodesOffset = std::numeric_limits::max(); + + static bool fDone; + if (!fDone) + { + bool fMatch = false; + + // If nobody has a time different than ours but within 5 minutes of ours, give a warning + for (int64_t nOffset : vSorted) + if (nOffset != 0 && std::abs(nOffset) < 5 * 60) + fMatch = true; + + if (!fMatch) + { + fDone = true; + std::string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong NovaCoin will not work properly."); + strMiscWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); + uiInterface.ThreadSafeMessageBox(strMessage+" ", std::string("NovaCoin"), CClientUIInterface::OK | CClientUIInterface::ICON_EXCLAMATION); + } + } + } + if (fDebug) { + for (int64_t n : vSorted) + printf("%+" PRId64 " ", n); + printf("| "); + } + if (nNodesOffset != std::numeric_limits::max()) + printf("nNodesOffset = %+" PRId64 " (%+" PRId64 " minutes)\n", nNodesOffset, nNodesOffset/60); + } +} diff --git a/src/timedata.h b/src/timedata.h new file mode 100644 index 0000000..a95214b --- /dev/null +++ b/src/timedata.h @@ -0,0 +1,76 @@ +// Copyright (c) 2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef NOVACOIN_TIMEDATA_H +#define NOVACOIN_TIMEDATA_H + +#include +#include +#include + +class CNetAddr; + +/** Median filter over a stream of values. + * Returns the median of the last N numbers + */ +template class CMedianFilter +{ +private: + std::vector vValues; + std::vector vSorted; + unsigned int nSize; +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 + { + size_t 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; + } + } + + int size() const + { + return static_cast(vValues.size()); + } + + std::vector sorted () const + { + return vSorted; + } +}; + +// Functions to keep track of adjusted P2P time +int64_t GetAdjustedTime(); +int64_t GetTimeOffset(); +int64_t GetNodesOffset(); +void AddTimeData(const CNetAddr& ip, int64_t nTime); + +#endif // NOVACOIN_TIMEDATA_H diff --git a/src/util.cpp b/src/util.cpp index 79de9db..2c5ec84 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,6 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "util.h" +#include "allocators.h" #include "interface.h" #include "sync.h" #include "version.h" @@ -47,7 +48,6 @@ string strMiscWarning; bool fTestNet = false; bool fNoListen = false; bool fLogTimestamps = false; -CMedianFilter vTimeOffsets(200,0); bool fReopenDebugLog = false; // Extended DecodeDumpTime implementation, see this page for details: @@ -1261,18 +1261,6 @@ void ShrinkDebugFile() - - - - -// -// "Never go to sea with two chronometers; take one or three." -// Our three time sources are: -// - System clock -// - Median of other nodes clocks -// - The user (asking the user to fix the system clock if the first two disagree) -// - // System clock int64_t GetTime() { @@ -1281,91 +1269,6 @@ int64_t GetTime() return now; } -// Trusted NTP offset or median of NTP samples. -extern int64_t nNtpOffset; - -// Median of time samples given by other nodes. -static int64_t nNodesOffset = INT64_MAX; - -// Select time offset: -int64_t GetTimeOffset() -{ - // If NTP and system clock are in agreement within 40 minutes, then use NTP. - if (abs64(nNtpOffset) < 40 * 60) - return nNtpOffset; - - // If not, then choose between median peer time and system clock. - if (abs64(nNodesOffset) < 70 * 60) - return nNodesOffset; - - return 0; -} - -int64_t GetNodesOffset() -{ - return nNodesOffset; -} - -int64_t GetAdjustedTime() -{ - return GetTime() + GetTimeOffset(); -} - -void AddTimeData(const CNetAddr& ip, int64_t nTime) -{ - int64_t nOffsetSample = nTime - GetTime(); - - // Ignore duplicates - static set setKnown; - if (!setKnown.insert(ip).second) - return; - - // Add data - vTimeOffsets.input(nOffsetSample); - printf("Added time data, samples %d, offset %+" PRId64 " (%+" PRId64 " minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60); - if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1) - { - int64_t nMedian = vTimeOffsets.median(); - std::vector vSorted = vTimeOffsets.sorted(); - // Only let other nodes change our time by so much - if (abs64(nMedian) < 70 * 60) - { - nNodesOffset = nMedian; - } - else - { - nNodesOffset = INT64_MAX; - - static bool fDone; - if (!fDone) - { - bool fMatch = false; - - // If nobody has a time different than ours but within 5 minutes of ours, give a warning - for (int64_t nOffset : vSorted) - if (nOffset != 0 && abs64(nOffset) < 5 * 60) - fMatch = true; - - if (!fMatch) - { - fDone = true; - string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong NovaCoin will not work properly."); - strMiscWarning = strMessage; - printf("*** %s\n", strMessage.c_str()); - uiInterface.ThreadSafeMessageBox(strMessage+" ", string("NovaCoin"), CClientUIInterface::OK | CClientUIInterface::ICON_EXCLAMATION); - } - } - } - if (fDebug) { - for (int64_t n : vSorted) - printf("%+" PRId64 " ", n); - printf("| "); - } - if (nNodesOffset != INT64_MAX) - printf("nNodesOffset = %+" PRId64 " (%+" PRId64 " minutes)\n", nNodesOffset, nNodesOffset/60); - } -} - string FormatVersion(int nVersion) { if (nVersion%100 == 0) diff --git a/src/util.h b/src/util.h index 868a840..bcb9559 100644 --- a/src/util.h +++ b/src/util.h @@ -31,7 +31,6 @@ #endif #include -#include "netbase.h" // for AddTimeData static const int32_t nOneHour = 60 * 60; static const int32_t nOneDay = 24 * 60 * 60; @@ -237,13 +236,8 @@ uint64_t GetRand(uint64_t nMax); int64_t GetTime(); int64_t GetTimeMillis(); int64_t GetTimeMicros(); - -int64_t GetAdjustedTime(); -int64_t GetTimeOffset(); -int64_t GetNodesOffset(); std::string FormatFullVersion(); std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); -void AddTimeData(const CNetAddr& ip, int64_t nTime); void runCommand(std::string strCommand); @@ -495,62 +489,6 @@ bool TimingResistantEqual(const T& a, const T& b) return accumulator == 0; } -/** Median filter over a stream of values. - * Returns the median of the last N numbers - */ -template class CMedianFilter -{ -private: - std::vector vValues; - std::vector vSorted; - unsigned int nSize; -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 - { - size_t 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; - } - } - - int size() const - { - return static_cast(vValues.size()); - } - - std::vector sorted () const - { - return vSorted; - } -}; - bool NewThread(void(*pfn)(void*), void* parg); #ifdef WIN32 @@ -591,4 +529,3 @@ inline uint32_t ByteReverse(uint32_t value) } #endif - -- 1.7.1