From: svost Date: Thu, 9 Feb 2017 14:29:27 +0000 (+0300) Subject: Remove netbase.h from util header: create timedata files. X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=37364b292536fd2390415ce9c3f1bcc9f2305f52 Remove netbase.h from util header: create timedata files. --- diff --git a/MSVC/libcommon/libcommon.vcxproj b/MSVC/libcommon/libcommon.vcxproj index 67c1e80..97cdda1 100644 --- a/MSVC/libcommon/libcommon.vcxproj +++ b/MSVC/libcommon/libcommon.vcxproj @@ -23,6 +23,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/novacoin-qt.pro b/novacoin-qt.pro index 7cc450b..d68cca5 100644 --- a/novacoin-qt.pro +++ b/novacoin-qt.pro @@ -270,7 +270,8 @@ HEADERS += src/qt/bitcoingui.h \ src/qt/multisigdialog.h \ src/qt/secondauthdialog.h \ src/ies.h \ - src/ipcollector.h + src/ipcollector.h \ + src/timedata.h SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/intro.cpp \ @@ -354,7 +355,8 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/uint256.cpp \ src/ecies.cpp \ src/ipcollector.cpp \ - src/serialize.cpp + src/serialize.cpp \ + src/timedata.cpp RESOURCES += \ diff --git a/src/addrman.h b/src/addrman.h index 054c1db..43466d6 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 619cc52..6c2205a 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -8,6 +8,7 @@ #include "key.h" #include "net.h" #include "sync.h" +#include "timedata.h" #include "ui_interface.h" using namespace std; diff --git a/src/alert.h b/src/alert.h index ad7d381..547b314 100644 --- a/src/alert.h +++ b/src/alert.h @@ -9,6 +9,7 @@ #include #include +#include "serialize.h" #include "uint256.h" #include "util.h" diff --git a/src/bignum.h b/src/bignum.h index 60c4b4c..c313289 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -10,6 +10,7 @@ #include +#include "serialize.h" #include "util.h" #include "uint256.h" diff --git a/src/makefile.bsd b/src/makefile.bsd index 02c1128..629fc70 100644 --- a/src/makefile.bsd +++ b/src/makefile.bsd @@ -125,6 +125,7 @@ OBJS= \ obj/rpcrawtransaction.o \ obj/script.o \ obj/sync.o \ + obj/timedata.o \ obj/util.o \ obj/wallet.o \ obj/walletdb.o \ diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index 7518bb5..383b5a9 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -89,6 +89,7 @@ OBJS= \ obj/rpcrawtransaction.o \ obj/script.o \ obj/sync.o \ + obj/timedata.o \ obj/util.o \ obj/wallet.o \ obj/walletdb.o \ diff --git a/src/makefile.mingw b/src/makefile.mingw index b0416e9..63decd2 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -78,6 +78,7 @@ OBJS= \ obj/rpcrawtransaction.o \ obj/script.o \ obj/sync.o \ + obj/timedata.o \ obj/util.o \ obj/wallet.o \ obj/walletdb.o \ diff --git a/src/makefile.osx b/src/makefile.osx index a567bc4..0c4c1d3 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -91,6 +91,7 @@ OBJS= \ obj/rpcrawtransaction.o \ obj/script.o \ obj/sync.o \ + obj/timedata.o \ obj/util.o \ obj/wallet.o \ obj/walletdb.o \ diff --git a/src/makefile.unix b/src/makefile.unix index 9e011fc..4aad7a3 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -126,6 +126,7 @@ OBJS= \ obj/rpcrawtransaction.o \ obj/script.o \ obj/sync.o \ + obj/timedata.o \ obj/util.o \ obj/wallet.o \ obj/walletdb.o \ diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 35a89c4..3dd86cf 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -5,6 +5,7 @@ #include "main.h" #include "wallet.h" +#include "timedata.h" #include "txdb.h" #include "ui_interface.h" #include "base58.h" diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 43f8f45..b1b2638 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -1,5 +1,6 @@ #include "transactionrecord.h" +#include "timedata.h" #include "wallet.h" #include "base58.h" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index f3fafb0..3f9b46d 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -9,6 +9,7 @@ #include "walletdb.h" #include "net.h" #include "ntp.h" +#include "timedata.h" using namespace json_spirit; using namespace std; diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index 8f82c97..a7d8336 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -7,6 +7,7 @@ #include "walletdb.h" #include "bitcoinrpc.h" #include "init.h" +#include "timedata.h" #include "util.h" #include "ntp.h" #include "base58.h" diff --git a/src/timedata.cpp b/src/timedata.cpp new file mode 100644 index 0000000..ae258e9 --- /dev/null +++ b/src/timedata.cpp @@ -0,0 +1,107 @@ +#include "timedata.h" +#include "netbase.h" +#include "sync.h" +#include "ui_interface.h" + +using namespace std; + +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 = 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 (abs(nNtpOffset) < 40 * 60) + return nNtpOffset; + + // If not, then choose between median peer time and system clock. + if (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 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) + { + auto nMedian = vTimeOffsets.median(); + auto vSorted = vTimeOffsets.sorted(); + // Only let other nodes change our time by so much + if (abs(nMedian) < 70 * 60) + { + nNodesOffset = nMedian; + } + else + { + nNodesOffset = 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(auto nOffset : vSorted) + if (nOffset != 0 && abs(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 != 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 942668e..860de00 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 "sync.h" #include "version.h" #include "ui_interface.h" @@ -60,7 +61,6 @@ bool fCommandLine = false; string strMiscWarning; bool fTestNet = false; bool fLogTimestamps = false; -CMedianFilter vTimeOffsets(200,0); bool fReopenDebugLog = false; // Extended DecodeDumpTime implementation, see this page for details: @@ -1248,14 +1248,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() { @@ -1264,91 +1256,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 = numeric_limits::max(); - -// Select time offset: -int64_t GetTimeOffset() -{ - // If NTP and system clock are in agreement within 40 minutes, then use NTP. - if (abs(nNtpOffset) < 40 * 60) - return nNtpOffset; - - // If not, then choose between median peer time and system clock. - if (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(); - - // 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) - { - auto nMedian = vTimeOffsets.median(); - auto vSorted = vTimeOffsets.sorted(); - // Only let other nodes change our time by so much - if (abs(nMedian) < 70 * 60) - { - nNodesOffset = nMedian; - } - else - { - nNodesOffset = 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(auto nOffset : vSorted) - if (nOffset != 0 && abs(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 != numeric_limits::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 84a7090..8a2d708 100644 --- a/src/util.h +++ b/src/util.h @@ -30,8 +30,6 @@ #endif #include -#include "netbase.h" // for AddTimeData - static const int32_t nOneHour = 60 * 60; static const int32_t nOneDay = 24 * 60 * 60; static const int64_t nOneWeek = 7 * 24 * 60 * 60; @@ -227,12 +225,8 @@ 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); @@ -460,62 +454,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 diff --git a/src/wallet.cpp b/src/wallet.cpp index b82e994..dc5d1d0 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -13,6 +13,8 @@ #include "base58.h" #include "kernel.h" #include "coincontrol.h" +#include "timedata.h" + #include #include "main.h"