Browse Source

Move network-time related functions to timedata.cpp/h

The network time-offset-mangement functions from util.cpp are moved to
timedata.(cpp|h). This breaks the dependency of util on netbase.
0.10
Wladimir J. van der Laan 11 years ago
parent
commit
14f888ca80
  1. 2
      src/Makefile.am
  2. 1
      src/addrman.h
  3. 1
      src/alert.cpp
  4. 1
      src/qt/transactiondesc.cpp
  5. 1
      src/qt/transactionrecord.cpp
  6. 1
      src/rpcmisc.cpp
  7. 1
      src/rpcnet.cpp
  8. 1
      src/rpcwallet.cpp
  9. 91
      src/timedata.cpp
  10. 17
      src/timedata.h
  11. 77
      src/util.cpp
  12. 4
      src/util.h
  13. 1
      src/wallet.cpp

2
src/Makefile.am

@ -80,6 +80,7 @@ BITCOIN_CORE_H = \
serialize.h \ serialize.h \
sync.h \ sync.h \
threadsafety.h \ threadsafety.h \
timedata.h \
tinyformat.h \ tinyformat.h \
txdb.h \ txdb.h \
txmempool.h \ txmempool.h \
@ -129,6 +130,7 @@ libbitcoin_server_a_SOURCES = \
rpcnet.cpp \ rpcnet.cpp \
rpcrawtransaction.cpp \ rpcrawtransaction.cpp \
rpcserver.cpp \ rpcserver.cpp \
timedata.cpp \
txdb.cpp \ txdb.cpp \
txmempool.cpp \ txmempool.cpp \
$(JSON_H) \ $(JSON_H) \

1
src/addrman.h

@ -8,6 +8,7 @@
#include "netbase.h" #include "netbase.h"
#include "protocol.h" #include "protocol.h"
#include "sync.h" #include "sync.h"
#include "timedata.h"
#include "util.h" #include "util.h"
#include <map> #include <map>

1
src/alert.cpp

@ -8,6 +8,7 @@
#include "chainparams.h" #include "chainparams.h"
#include "key.h" #include "key.h"
#include "net.h" #include "net.h"
#include "timedata.h"
#include "ui_interface.h" #include "ui_interface.h"
#include "util.h" #include "util.h"

1
src/qt/transactiondesc.cpp

@ -12,6 +12,7 @@
#include "main.h" #include "main.h"
#include "paymentserver.h" #include "paymentserver.h"
#include "transactionrecord.h" #include "transactionrecord.h"
#include "timedata.h"
#include "ui_interface.h" #include "ui_interface.h"
#include "wallet.h" #include "wallet.h"

1
src/qt/transactionrecord.cpp

@ -5,6 +5,7 @@
#include "transactionrecord.h" #include "transactionrecord.h"
#include "base58.h" #include "base58.h"
#include "timedata.h"
#include "wallet.h" #include "wallet.h"
#include <stdint.h> #include <stdint.h>

1
src/rpcmisc.cpp

@ -9,6 +9,7 @@
#include "net.h" #include "net.h"
#include "netbase.h" #include "netbase.h"
#include "rpcserver.h" #include "rpcserver.h"
#include "timedata.h"
#include "util.h" #include "util.h"
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
#include "wallet.h" #include "wallet.h"

1
src/rpcnet.cpp

@ -9,6 +9,7 @@
#include "netbase.h" #include "netbase.h"
#include "protocol.h" #include "protocol.h"
#include "sync.h" #include "sync.h"
#include "timedata.h"
#include "util.h" #include "util.h"
#include <boost/foreach.hpp> #include <boost/foreach.hpp>

1
src/rpcwallet.cpp

@ -8,6 +8,7 @@
#include "init.h" #include "init.h"
#include "net.h" #include "net.h"
#include "netbase.h" #include "netbase.h"
#include "timedata.h"
#include "util.h" #include "util.h"
#include "wallet.h" #include "wallet.h"
#include "walletdb.h" #include "walletdb.h"

91
src/timedata.cpp

@ -0,0 +1,91 @@
// 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.
#include "timedata.h"
#include "netbase.h"
#include "sync.h"
#include "ui_interface.h"
#include "util.h"
#include <boost/foreach.hpp>
using namespace std;
static CCriticalSection cs_nTimeOffset;
static int64_t nTimeOffset = 0;
//
// "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)
//
//
int64_t GetTimeOffset()
{
LOCK(cs_nTimeOffset);
return nTimeOffset;
}
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.insert(ip).second)
return;
// Add data
static CMedianFilter<int64_t> vTimeOffsets(200,0);
vTimeOffsets.input(nOffsetSample);
LogPrintf("Added time data, samples %d, offset %+d (%+d minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60);
if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1)
{
int64_t nMedian = vTimeOffsets.median();
std::vector<int64_t> vSorted = vTimeOffsets.sorted();
// Only let other nodes change our time by so much
if (abs64(nMedian) < 70 * 60)
{
nTimeOffset = nMedian;
}
else
{
nTimeOffset = 0;
static bool fDone;
if (!fDone)
{
// If nobody has a time different than ours but within 5 minutes of ours, give a warning
bool fMatch = false;
BOOST_FOREACH(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 Bitcoin will not work properly.");
strMiscWarning = strMessage;
LogPrintf("*** %s\n", strMessage);
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING);
}
}
}
if (fDebug) {
BOOST_FOREACH(int64_t n, vSorted)
LogPrintf("%+d ", n);
LogPrintf("| ");
}
LogPrintf("nTimeOffset = %+d (%+d minutes)\n", nTimeOffset, nTimeOffset/60);
}
}

17
src/timedata.h

@ -0,0 +1,17 @@
// 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 BITCOIN_TIMEDATA_H
#define BITCOIN_TIMEDATA_H
#include <stdint.h>
class CNetAddr;
/* Functions to keep track of adjusted P2P time */
int64_t GetTimeOffset();
int64_t GetAdjustedTime();
void AddTimeData(const CNetAddr& ip, int64_t nTime);
#endif

77
src/util.cpp

@ -6,7 +6,6 @@
#include "util.h" #include "util.h"
#include "chainparams.h" #include "chainparams.h"
#include "netbase.h"
#include "sync.h" #include "sync.h"
#include "ui_interface.h" #include "ui_interface.h"
#include "uint256.h" #include "uint256.h"
@ -1157,13 +1156,6 @@ void ShrinkDebugFile()
fclose(file); fclose(file);
} }
//
// "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)
//
static int64_t nMockTime = 0; // For unit testing static int64_t nMockTime = 0; // For unit testing
int64_t GetTime() int64_t GetTime()
@ -1178,75 +1170,6 @@ void SetMockTime(int64_t nMockTimeIn)
nMockTime = nMockTimeIn; nMockTime = nMockTimeIn;
} }
static CCriticalSection cs_nTimeOffset;
static int64_t nTimeOffset = 0;
int64_t GetTimeOffset()
{
LOCK(cs_nTimeOffset);
return nTimeOffset;
}
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.insert(ip).second)
return;
// Add data
static CMedianFilter<int64_t> vTimeOffsets(200,0);
vTimeOffsets.input(nOffsetSample);
LogPrintf("Added time data, samples %d, offset %+d (%+d minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60);
if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1)
{
int64_t nMedian = vTimeOffsets.median();
std::vector<int64_t> vSorted = vTimeOffsets.sorted();
// Only let other nodes change our time by so much
if (abs64(nMedian) < 70 * 60)
{
nTimeOffset = nMedian;
}
else
{
nTimeOffset = 0;
static bool fDone;
if (!fDone)
{
// If nobody has a time different than ours but within 5 minutes of ours, give a warning
bool fMatch = false;
BOOST_FOREACH(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 Bitcoin will not work properly.");
strMiscWarning = strMessage;
LogPrintf("*** %s\n", strMessage);
uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING);
}
}
}
if (fDebug) {
BOOST_FOREACH(int64_t n, vSorted)
LogPrintf("%+d ", n);
LogPrintf("| ");
}
LogPrintf("nTimeOffset = %+d (%+d minutes)\n", nTimeOffset, nTimeOffset/60);
}
}
uint32_t insecure_rand_Rz = 11; uint32_t insecure_rand_Rz = 11;
uint32_t insecure_rand_Rw = 11; uint32_t insecure_rand_Rw = 11;
void seed_insecure_rand(bool fDeterministic) void seed_insecure_rand(bool fDeterministic)

4
src/util.h

@ -32,7 +32,6 @@
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
class CNetAddr;
class uint256; class uint256;
static const int64_t COIN = 100000000; static const int64_t COIN = 100000000;
@ -191,11 +190,8 @@ uint64_t GetRand(uint64_t nMax);
uint256 GetRandHash(); uint256 GetRandHash();
int64_t GetTime(); int64_t GetTime();
void SetMockTime(int64_t nMockTimeIn); void SetMockTime(int64_t nMockTimeIn);
int64_t GetAdjustedTime();
int64_t GetTimeOffset();
std::string FormatFullVersion(); std::string FormatFullVersion();
std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments); 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); void runCommand(std::string strCommand);

1
src/wallet.cpp

@ -9,6 +9,7 @@
#include "checkpoints.h" #include "checkpoints.h"
#include "coincontrol.h" #include "coincontrol.h"
#include "net.h" #include "net.h"
#include "timedata.h"
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <openssl/rand.h> #include <openssl/rand.h>

Loading…
Cancel
Save