Remove netbase.h from util header: create timedata files.
authorsvost <ya.nowa@yandex.ru>
Thu, 9 Feb 2017 14:29:27 +0000 (17:29 +0300)
committersvost <ya.nowa@yandex.ru>
Thu, 9 Feb 2017 14:29:27 +0000 (17:29 +0300)
20 files changed:
MSVC/libcommon/libcommon.vcxproj
novacoin-qt.pro
src/addrman.h
src/alert.cpp
src/alert.h
src/bignum.h
src/makefile.bsd
src/makefile.linux-mingw
src/makefile.mingw
src/makefile.osx
src/makefile.unix
src/qt/transactiondesc.cpp
src/qt/transactionrecord.cpp
src/rpcnet.cpp
src/rpcwallet.cpp
src/timedata.cpp [new file with mode: 0644]
src/timedata.h [new file with mode: 0644]
src/util.cpp
src/util.h
src/wallet.cpp

index 67c1e80..97cdda1 100644 (file)
@@ -23,6 +23,7 @@
     <ClCompile Include="..\..\src\cryptogram.cpp" />
     <ClCompile Include="..\..\src\ecies.cpp" />
     <ClCompile Include="..\..\src\ipcollector.cpp" />
+    <ClCompile Include="..\..\src\timedata.cpp" />
     <ClCompile Include="..\..\src\kernel.cpp" />
     <ClCompile Include="..\..\src\kernel_worker.cpp" />
     <ClCompile Include="..\..\src\rpccrypt.cpp" />
@@ -83,6 +84,7 @@
     <ClInclude Include="..\..\src\init.h" />
     <ClInclude Include="..\..\src\inttypes.h" />
     <ClInclude Include="..\..\src\ipcollector.h" />
+    <ClCompile Include="..\..\src\timedata.h" />
     <ClInclude Include="..\..\src\irc.h" />
     <ClInclude Include="..\..\src\kernel_worker.h" />
     <ClInclude Include="..\..\src\key.h" />
index 7cc450b..d68cca5 100644 (file)
@@ -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 += \
index 054c1db..43466d6 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "netbase.h"
 #include "protocol.h"
+#include "timedata.h"
 #include "util.h"
 #include "sync.h"
 
index 619cc52..6c2205a 100644 (file)
@@ -8,6 +8,7 @@
 #include "key.h"
 #include "net.h"
 #include "sync.h"
+#include "timedata.h"
 #include "ui_interface.h"
 
 using namespace std;
index ad7d381..547b314 100644 (file)
@@ -9,6 +9,7 @@
 #include <set>
 #include <string>
 
+#include "serialize.h"
 #include "uint256.h"
 #include "util.h"
 
index 60c4b4c..c313289 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <openssl/bn.h>
 
+#include "serialize.h"
 #include "util.h"
 #include "uint256.h"
 
index 02c1128..629fc70 100644 (file)
@@ -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 \
index 7518bb5..383b5a9 100644 (file)
@@ -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 \
index b0416e9..63decd2 100644 (file)
@@ -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 \
index a567bc4..0c4c1d3 100644 (file)
@@ -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 \
index 9e011fc..4aad7a3 100644 (file)
@@ -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 \
index 35a89c4..3dd86cf 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "main.h"
 #include "wallet.h"
+#include "timedata.h"
 #include "txdb.h"
 #include "ui_interface.h"
 #include "base58.h"
index 43f8f45..b1b2638 100644 (file)
@@ -1,5 +1,6 @@
 #include "transactionrecord.h"
 
+#include "timedata.h"
 #include "wallet.h"
 #include "base58.h"
 
index f3fafb0..3f9b46d 100644 (file)
@@ -9,6 +9,7 @@
 #include "walletdb.h"
 #include "net.h"
 #include "ntp.h"
+#include "timedata.h"
 
 using namespace json_spirit;
 using namespace std;
index 8f82c97..a7d8336 100644 (file)
@@ -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 (file)
index 0000000..ae258e9
--- /dev/null
@@ -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<int64_t>::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<CNetAddr> setKnown;
+    if (setKnown.size() == NOVACOIN_TIMEDATA_MAX_SAMPLES)
+        return;
+    if (!setKnown.insert(ip).second)
+        return;
+
+    // Add data
+    static CMedianFilter<int64_t> 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<int64_t>::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<int64_t>::max())
+            printf("nNodesOffset = %+" PRId64 "  (%+" PRId64 " minutes)\n", nNodesOffset, nNodesOffset/60);
+    }
+}
diff --git a/src/timedata.h b/src/timedata.h
new file mode 100644 (file)
index 0000000..a95214b
--- /dev/null
@@ -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 <vector>
+#include <algorithm>
+#include <cassert>
+
+class CNetAddr;
+
+/** Median filter over a stream of values.
+ * Returns the median of the last N numbers
+ */
+template <typename T> class CMedianFilter
+{
+private:
+    std::vector<T> vValues;
+    std::vector<T> 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<int>(vValues.size());
+    }
+
+    std::vector<T> 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
index 942668e..860de00 100644 (file)
@@ -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<int64_t> 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<int64_t>::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<CNetAddr> 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<int64_t>::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<int64_t>::max())
-            printf("nNodesOffset = %+" PRId64 "  (%+" PRId64 " minutes)\n", nNodesOffset, nNodesOffset/60);
-    }
-}
-
 string FormatVersion(int nVersion)
 {
     if (nVersion%100 == 0)
index 84a7090..8a2d708 100644 (file)
@@ -30,8 +30,6 @@
 #endif
 #include <inttypes.h>
 
-#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<std::string>& 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 <typename T> class CMedianFilter
-{
-private:
-    std::vector<T> vValues;
-    std::vector<T> 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<int>(vValues.size());
-    }
-
-    std::vector<T> sorted () const
-    {
-        return vSorted;
-    }
-};
-
 bool NewThread(void(*pfn)(void*), void* parg);
 
 #ifdef WIN32
index b82e994..dc5d1d0 100644 (file)
@@ -13,6 +13,8 @@
 #include "base58.h"
 #include "kernel.h"
 #include "coincontrol.h"
+#include "timedata.h"
+
 #include <openssl/bio.h>
 
 #include "main.h"