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.
This commit is contained in:
parent
208bf5b9e0
commit
14f888ca80
13 changed files with 118 additions and 81 deletions
|
@ -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) \
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
Normal file
91
src/timedata.cpp
Normal file
|
@ -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
Normal file
17
src/timedata.h
Normal file
|
@ -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
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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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…
Reference in a new issue