mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
net: move CBanDB and CAddrDB out of net.h/cpp
This will eventually solve a circular dependency
This commit is contained in:
parent
531214fb10
commit
d93b14dc5d
@ -71,6 +71,7 @@ endif
|
|||||||
.PHONY: FORCE check-symbols check-security
|
.PHONY: FORCE check-symbols check-security
|
||||||
# bitcoin core #
|
# bitcoin core #
|
||||||
BITCOIN_CORE_H = \
|
BITCOIN_CORE_H = \
|
||||||
|
addrdb.h \
|
||||||
addrman.h \
|
addrman.h \
|
||||||
base58.h \
|
base58.h \
|
||||||
bloom.h \
|
bloom.h \
|
||||||
@ -164,6 +165,7 @@ libbitcoin_server_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(MINIUPNPC_CP
|
|||||||
libbitcoin_server_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
libbitcoin_server_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||||
libbitcoin_server_a_SOURCES = \
|
libbitcoin_server_a_SOURCES = \
|
||||||
addrman.cpp \
|
addrman.cpp \
|
||||||
|
addrdb.cpp \
|
||||||
bloom.cpp \
|
bloom.cpp \
|
||||||
blockencodings.cpp \
|
blockencodings.cpp \
|
||||||
chain.cpp \
|
chain.cpp \
|
||||||
|
218
src/addrdb.cpp
Normal file
218
src/addrdb.cpp
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include "addrdb.h"
|
||||||
|
|
||||||
|
#include "addrman.h"
|
||||||
|
#include "chainparams.h"
|
||||||
|
#include "clientversion.h"
|
||||||
|
#include "hash.h"
|
||||||
|
#include "random.h"
|
||||||
|
#include "streams.h"
|
||||||
|
#include "tinyformat.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
|
CBanDB::CBanDB()
|
||||||
|
{
|
||||||
|
pathBanlist = GetDataDir() / "banlist.dat";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CBanDB::Write(const banmap_t& banSet)
|
||||||
|
{
|
||||||
|
// Generate random temporary filename
|
||||||
|
unsigned short randv = 0;
|
||||||
|
GetRandBytes((unsigned char*)&randv, sizeof(randv));
|
||||||
|
std::string tmpfn = strprintf("banlist.dat.%04x", randv);
|
||||||
|
|
||||||
|
// serialize banlist, checksum data up to that point, then append csum
|
||||||
|
CDataStream ssBanlist(SER_DISK, CLIENT_VERSION);
|
||||||
|
ssBanlist << FLATDATA(Params().MessageStart());
|
||||||
|
ssBanlist << banSet;
|
||||||
|
uint256 hash = Hash(ssBanlist.begin(), ssBanlist.end());
|
||||||
|
ssBanlist << hash;
|
||||||
|
|
||||||
|
// open temp output file, and associate with CAutoFile
|
||||||
|
boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
|
||||||
|
FILE *file = fopen(pathTmp.string().c_str(), "wb");
|
||||||
|
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
||||||
|
if (fileout.IsNull())
|
||||||
|
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
||||||
|
|
||||||
|
// Write and commit header, data
|
||||||
|
try {
|
||||||
|
fileout << ssBanlist;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
return error("%s: Serialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
FileCommit(fileout.Get());
|
||||||
|
fileout.fclose();
|
||||||
|
|
||||||
|
// replace existing banlist.dat, if any, with new banlist.dat.XXXX
|
||||||
|
if (!RenameOver(pathTmp, pathBanlist))
|
||||||
|
return error("%s: Rename-into-place failed", __func__);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CBanDB::Read(banmap_t& banSet)
|
||||||
|
{
|
||||||
|
// open input file, and associate with CAutoFile
|
||||||
|
FILE *file = fopen(pathBanlist.string().c_str(), "rb");
|
||||||
|
CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
|
||||||
|
if (filein.IsNull())
|
||||||
|
return error("%s: Failed to open file %s", __func__, pathBanlist.string());
|
||||||
|
|
||||||
|
// use file size to size memory buffer
|
||||||
|
uint64_t fileSize = boost::filesystem::file_size(pathBanlist);
|
||||||
|
uint64_t dataSize = 0;
|
||||||
|
// Don't try to resize to a negative number if file is small
|
||||||
|
if (fileSize >= sizeof(uint256))
|
||||||
|
dataSize = fileSize - sizeof(uint256);
|
||||||
|
std::vector<unsigned char> vchData;
|
||||||
|
vchData.resize(dataSize);
|
||||||
|
uint256 hashIn;
|
||||||
|
|
||||||
|
// read data and checksum from file
|
||||||
|
try {
|
||||||
|
filein.read((char *)&vchData[0], dataSize);
|
||||||
|
filein >> hashIn;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
filein.fclose();
|
||||||
|
|
||||||
|
CDataStream ssBanlist(vchData, SER_DISK, CLIENT_VERSION);
|
||||||
|
|
||||||
|
// verify stored checksum matches input data
|
||||||
|
uint256 hashTmp = Hash(ssBanlist.begin(), ssBanlist.end());
|
||||||
|
if (hashIn != hashTmp)
|
||||||
|
return error("%s: Checksum mismatch, data corrupted", __func__);
|
||||||
|
|
||||||
|
unsigned char pchMsgTmp[4];
|
||||||
|
try {
|
||||||
|
// de-serialize file header (network specific magic number) and ..
|
||||||
|
ssBanlist >> FLATDATA(pchMsgTmp);
|
||||||
|
|
||||||
|
// ... verify the network matches ours
|
||||||
|
if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
|
||||||
|
return error("%s: Invalid network magic number", __func__);
|
||||||
|
|
||||||
|
// de-serialize address data into one CAddrMan object
|
||||||
|
ssBanlist >> banSet;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAddrDB::CAddrDB()
|
||||||
|
{
|
||||||
|
pathAddr = GetDataDir() / "peers.dat";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAddrDB::Write(const CAddrMan& addr)
|
||||||
|
{
|
||||||
|
// Generate random temporary filename
|
||||||
|
unsigned short randv = 0;
|
||||||
|
GetRandBytes((unsigned char*)&randv, sizeof(randv));
|
||||||
|
std::string tmpfn = strprintf("peers.dat.%04x", randv);
|
||||||
|
|
||||||
|
// serialize addresses, checksum data up to that point, then append csum
|
||||||
|
CDataStream ssPeers(SER_DISK, CLIENT_VERSION);
|
||||||
|
ssPeers << FLATDATA(Params().MessageStart());
|
||||||
|
ssPeers << addr;
|
||||||
|
uint256 hash = Hash(ssPeers.begin(), ssPeers.end());
|
||||||
|
ssPeers << hash;
|
||||||
|
|
||||||
|
// open temp output file, and associate with CAutoFile
|
||||||
|
boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
|
||||||
|
FILE *file = fopen(pathTmp.string().c_str(), "wb");
|
||||||
|
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
||||||
|
if (fileout.IsNull())
|
||||||
|
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
||||||
|
|
||||||
|
// Write and commit header, data
|
||||||
|
try {
|
||||||
|
fileout << ssPeers;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
return error("%s: Serialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
FileCommit(fileout.Get());
|
||||||
|
fileout.fclose();
|
||||||
|
|
||||||
|
// replace existing peers.dat, if any, with new peers.dat.XXXX
|
||||||
|
if (!RenameOver(pathTmp, pathAddr))
|
||||||
|
return error("%s: Rename-into-place failed", __func__);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAddrDB::Read(CAddrMan& addr)
|
||||||
|
{
|
||||||
|
// open input file, and associate with CAutoFile
|
||||||
|
FILE *file = fopen(pathAddr.string().c_str(), "rb");
|
||||||
|
CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
|
||||||
|
if (filein.IsNull())
|
||||||
|
return error("%s: Failed to open file %s", __func__, pathAddr.string());
|
||||||
|
|
||||||
|
// use file size to size memory buffer
|
||||||
|
uint64_t fileSize = boost::filesystem::file_size(pathAddr);
|
||||||
|
uint64_t dataSize = 0;
|
||||||
|
// Don't try to resize to a negative number if file is small
|
||||||
|
if (fileSize >= sizeof(uint256))
|
||||||
|
dataSize = fileSize - sizeof(uint256);
|
||||||
|
std::vector<unsigned char> vchData;
|
||||||
|
vchData.resize(dataSize);
|
||||||
|
uint256 hashIn;
|
||||||
|
|
||||||
|
// read data and checksum from file
|
||||||
|
try {
|
||||||
|
filein.read((char *)&vchData[0], dataSize);
|
||||||
|
filein >> hashIn;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
filein.fclose();
|
||||||
|
|
||||||
|
CDataStream ssPeers(vchData, SER_DISK, CLIENT_VERSION);
|
||||||
|
|
||||||
|
// verify stored checksum matches input data
|
||||||
|
uint256 hashTmp = Hash(ssPeers.begin(), ssPeers.end());
|
||||||
|
if (hashIn != hashTmp)
|
||||||
|
return error("%s: Checksum mismatch, data corrupted", __func__);
|
||||||
|
|
||||||
|
return Read(addr, ssPeers);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAddrDB::Read(CAddrMan& addr, CDataStream& ssPeers)
|
||||||
|
{
|
||||||
|
unsigned char pchMsgTmp[4];
|
||||||
|
try {
|
||||||
|
// de-serialize file header (network specific magic number) and ..
|
||||||
|
ssPeers >> FLATDATA(pchMsgTmp);
|
||||||
|
|
||||||
|
// ... verify the network matches ours
|
||||||
|
if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
|
||||||
|
return error("%s: Invalid network magic number", __func__);
|
||||||
|
|
||||||
|
// de-serialize address data into one CAddrMan object
|
||||||
|
ssPeers >> addr;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
// de-serialization has failed, ensure addrman is left in a clean state
|
||||||
|
addr.Clear();
|
||||||
|
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
102
src/addrdb.h
Normal file
102
src/addrdb.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_ADDRDB_H
|
||||||
|
#define BITCOIN_ADDRDB_H
|
||||||
|
|
||||||
|
#include "serialize.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
class CSubNet;
|
||||||
|
class CAddrMan;
|
||||||
|
|
||||||
|
typedef enum BanReason
|
||||||
|
{
|
||||||
|
BanReasonUnknown = 0,
|
||||||
|
BanReasonNodeMisbehaving = 1,
|
||||||
|
BanReasonManuallyAdded = 2
|
||||||
|
} BanReason;
|
||||||
|
|
||||||
|
class CBanEntry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const int CURRENT_VERSION=1;
|
||||||
|
int nVersion;
|
||||||
|
int64_t nCreateTime;
|
||||||
|
int64_t nBanUntil;
|
||||||
|
uint8_t banReason;
|
||||||
|
|
||||||
|
CBanEntry()
|
||||||
|
{
|
||||||
|
SetNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
CBanEntry(int64_t nCreateTimeIn)
|
||||||
|
{
|
||||||
|
SetNull();
|
||||||
|
nCreateTime = nCreateTimeIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(this->nVersion);
|
||||||
|
nVersion = this->nVersion;
|
||||||
|
READWRITE(nCreateTime);
|
||||||
|
READWRITE(nBanUntil);
|
||||||
|
READWRITE(banReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetNull()
|
||||||
|
{
|
||||||
|
nVersion = CBanEntry::CURRENT_VERSION;
|
||||||
|
nCreateTime = 0;
|
||||||
|
nBanUntil = 0;
|
||||||
|
banReason = BanReasonUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string banReasonToString()
|
||||||
|
{
|
||||||
|
switch (banReason) {
|
||||||
|
case BanReasonNodeMisbehaving:
|
||||||
|
return "node misbehaving";
|
||||||
|
case BanReasonManuallyAdded:
|
||||||
|
return "manually added";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<CSubNet, CBanEntry> banmap_t;
|
||||||
|
|
||||||
|
/** Access to the (IP) address database (peers.dat) */
|
||||||
|
class CAddrDB
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
boost::filesystem::path pathAddr;
|
||||||
|
public:
|
||||||
|
CAddrDB();
|
||||||
|
bool Write(const CAddrMan& addr);
|
||||||
|
bool Read(CAddrMan& addr);
|
||||||
|
bool Read(CAddrMan& addr, CDataStream& ssPeers);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Access to the banlist database (banlist.dat) */
|
||||||
|
class CBanDB
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
boost::filesystem::path pathBanlist;
|
||||||
|
public:
|
||||||
|
CBanDB();
|
||||||
|
bool Write(const banmap_t& banSet);
|
||||||
|
bool Read(banmap_t& banSet);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BITCOIN_ADDRDB_H
|
209
src/net.cpp
209
src/net.cpp
@ -2356,114 +2356,6 @@ void CNode::Fuzz(int nChance)
|
|||||||
Fuzz(2);
|
Fuzz(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// CAddrDB
|
|
||||||
//
|
|
||||||
|
|
||||||
CAddrDB::CAddrDB()
|
|
||||||
{
|
|
||||||
pathAddr = GetDataDir() / "peers.dat";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CAddrDB::Write(const CAddrMan& addr)
|
|
||||||
{
|
|
||||||
// Generate random temporary filename
|
|
||||||
unsigned short randv = 0;
|
|
||||||
GetRandBytes((unsigned char*)&randv, sizeof(randv));
|
|
||||||
std::string tmpfn = strprintf("peers.dat.%04x", randv);
|
|
||||||
|
|
||||||
// serialize addresses, checksum data up to that point, then append csum
|
|
||||||
CDataStream ssPeers(SER_DISK, CLIENT_VERSION);
|
|
||||||
ssPeers << FLATDATA(Params().MessageStart());
|
|
||||||
ssPeers << addr;
|
|
||||||
uint256 hash = Hash(ssPeers.begin(), ssPeers.end());
|
|
||||||
ssPeers << hash;
|
|
||||||
|
|
||||||
// open temp output file, and associate with CAutoFile
|
|
||||||
boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
|
|
||||||
FILE *file = fopen(pathTmp.string().c_str(), "wb");
|
|
||||||
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
|
||||||
if (fileout.IsNull())
|
|
||||||
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
|
||||||
|
|
||||||
// Write and commit header, data
|
|
||||||
try {
|
|
||||||
fileout << ssPeers;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
return error("%s: Serialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
FileCommit(fileout.Get());
|
|
||||||
fileout.fclose();
|
|
||||||
|
|
||||||
// replace existing peers.dat, if any, with new peers.dat.XXXX
|
|
||||||
if (!RenameOver(pathTmp, pathAddr))
|
|
||||||
return error("%s: Rename-into-place failed", __func__);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CAddrDB::Read(CAddrMan& addr)
|
|
||||||
{
|
|
||||||
// open input file, and associate with CAutoFile
|
|
||||||
FILE *file = fopen(pathAddr.string().c_str(), "rb");
|
|
||||||
CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
|
|
||||||
if (filein.IsNull())
|
|
||||||
return error("%s: Failed to open file %s", __func__, pathAddr.string());
|
|
||||||
|
|
||||||
// use file size to size memory buffer
|
|
||||||
uint64_t fileSize = boost::filesystem::file_size(pathAddr);
|
|
||||||
uint64_t dataSize = 0;
|
|
||||||
// Don't try to resize to a negative number if file is small
|
|
||||||
if (fileSize >= sizeof(uint256))
|
|
||||||
dataSize = fileSize - sizeof(uint256);
|
|
||||||
std::vector<unsigned char> vchData;
|
|
||||||
vchData.resize(dataSize);
|
|
||||||
uint256 hashIn;
|
|
||||||
|
|
||||||
// read data and checksum from file
|
|
||||||
try {
|
|
||||||
filein.read((char *)&vchData[0], dataSize);
|
|
||||||
filein >> hashIn;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
filein.fclose();
|
|
||||||
|
|
||||||
CDataStream ssPeers(vchData, SER_DISK, CLIENT_VERSION);
|
|
||||||
|
|
||||||
// verify stored checksum matches input data
|
|
||||||
uint256 hashTmp = Hash(ssPeers.begin(), ssPeers.end());
|
|
||||||
if (hashIn != hashTmp)
|
|
||||||
return error("%s: Checksum mismatch, data corrupted", __func__);
|
|
||||||
|
|
||||||
return Read(addr, ssPeers);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CAddrDB::Read(CAddrMan& addr, CDataStream& ssPeers)
|
|
||||||
{
|
|
||||||
unsigned char pchMsgTmp[4];
|
|
||||||
try {
|
|
||||||
// de-serialize file header (network specific magic number) and ..
|
|
||||||
ssPeers >> FLATDATA(pchMsgTmp);
|
|
||||||
|
|
||||||
// ... verify the network matches ours
|
|
||||||
if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
|
|
||||||
return error("%s: Invalid network magic number", __func__);
|
|
||||||
|
|
||||||
// de-serialize address data into one CAddrMan object
|
|
||||||
ssPeers >> addr;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
// de-serialization has failed, ensure addrman is left in a clean state
|
|
||||||
addr.Clear();
|
|
||||||
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int ReceiveFloodSize() { return 1000*GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER); }
|
unsigned int ReceiveFloodSize() { return 1000*GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER); }
|
||||||
unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER); }
|
unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER); }
|
||||||
|
|
||||||
@ -2649,107 +2541,6 @@ void CNode::EndMessage(const char* pszCommand) UNLOCK_FUNCTION(cs_vSend)
|
|||||||
LEAVE_CRITICAL_SECTION(cs_vSend);
|
LEAVE_CRITICAL_SECTION(cs_vSend);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// CBanDB
|
|
||||||
//
|
|
||||||
|
|
||||||
CBanDB::CBanDB()
|
|
||||||
{
|
|
||||||
pathBanlist = GetDataDir() / "banlist.dat";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBanDB::Write(const banmap_t& banSet)
|
|
||||||
{
|
|
||||||
// Generate random temporary filename
|
|
||||||
unsigned short randv = 0;
|
|
||||||
GetRandBytes((unsigned char*)&randv, sizeof(randv));
|
|
||||||
std::string tmpfn = strprintf("banlist.dat.%04x", randv);
|
|
||||||
|
|
||||||
// serialize banlist, checksum data up to that point, then append csum
|
|
||||||
CDataStream ssBanlist(SER_DISK, CLIENT_VERSION);
|
|
||||||
ssBanlist << FLATDATA(Params().MessageStart());
|
|
||||||
ssBanlist << banSet;
|
|
||||||
uint256 hash = Hash(ssBanlist.begin(), ssBanlist.end());
|
|
||||||
ssBanlist << hash;
|
|
||||||
|
|
||||||
// open temp output file, and associate with CAutoFile
|
|
||||||
boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
|
|
||||||
FILE *file = fopen(pathTmp.string().c_str(), "wb");
|
|
||||||
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
|
||||||
if (fileout.IsNull())
|
|
||||||
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
|
||||||
|
|
||||||
// Write and commit header, data
|
|
||||||
try {
|
|
||||||
fileout << ssBanlist;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
return error("%s: Serialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
FileCommit(fileout.Get());
|
|
||||||
fileout.fclose();
|
|
||||||
|
|
||||||
// replace existing banlist.dat, if any, with new banlist.dat.XXXX
|
|
||||||
if (!RenameOver(pathTmp, pathBanlist))
|
|
||||||
return error("%s: Rename-into-place failed", __func__);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBanDB::Read(banmap_t& banSet)
|
|
||||||
{
|
|
||||||
// open input file, and associate with CAutoFile
|
|
||||||
FILE *file = fopen(pathBanlist.string().c_str(), "rb");
|
|
||||||
CAutoFile filein(file, SER_DISK, CLIENT_VERSION);
|
|
||||||
if (filein.IsNull())
|
|
||||||
return error("%s: Failed to open file %s", __func__, pathBanlist.string());
|
|
||||||
|
|
||||||
// use file size to size memory buffer
|
|
||||||
uint64_t fileSize = boost::filesystem::file_size(pathBanlist);
|
|
||||||
uint64_t dataSize = 0;
|
|
||||||
// Don't try to resize to a negative number if file is small
|
|
||||||
if (fileSize >= sizeof(uint256))
|
|
||||||
dataSize = fileSize - sizeof(uint256);
|
|
||||||
std::vector<unsigned char> vchData;
|
|
||||||
vchData.resize(dataSize);
|
|
||||||
uint256 hashIn;
|
|
||||||
|
|
||||||
// read data and checksum from file
|
|
||||||
try {
|
|
||||||
filein.read((char *)&vchData[0], dataSize);
|
|
||||||
filein >> hashIn;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
filein.fclose();
|
|
||||||
|
|
||||||
CDataStream ssBanlist(vchData, SER_DISK, CLIENT_VERSION);
|
|
||||||
|
|
||||||
// verify stored checksum matches input data
|
|
||||||
uint256 hashTmp = Hash(ssBanlist.begin(), ssBanlist.end());
|
|
||||||
if (hashIn != hashTmp)
|
|
||||||
return error("%s: Checksum mismatch, data corrupted", __func__);
|
|
||||||
|
|
||||||
unsigned char pchMsgTmp[4];
|
|
||||||
try {
|
|
||||||
// de-serialize file header (network specific magic number) and ..
|
|
||||||
ssBanlist >> FLATDATA(pchMsgTmp);
|
|
||||||
|
|
||||||
// ... verify the network matches ours
|
|
||||||
if (memcmp(pchMsgTmp, Params().MessageStart(), sizeof(pchMsgTmp)))
|
|
||||||
return error("%s: Invalid network magic number", __func__);
|
|
||||||
|
|
||||||
// de-serialize address data into one CAddrMan object
|
|
||||||
ssBanlist >> banSet;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {
|
int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {
|
||||||
return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
|
return nNow + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
|
||||||
}
|
}
|
||||||
|
84
src/net.h
84
src/net.h
@ -6,6 +6,7 @@
|
|||||||
#ifndef BITCOIN_NET_H
|
#ifndef BITCOIN_NET_H
|
||||||
#define BITCOIN_NET_H
|
#define BITCOIN_NET_H
|
||||||
|
|
||||||
|
#include "addrdb.h"
|
||||||
#include "amount.h"
|
#include "amount.h"
|
||||||
#include "bloom.h"
|
#include "bloom.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
@ -256,67 +257,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef enum BanReason
|
|
||||||
{
|
|
||||||
BanReasonUnknown = 0,
|
|
||||||
BanReasonNodeMisbehaving = 1,
|
|
||||||
BanReasonManuallyAdded = 2
|
|
||||||
} BanReason;
|
|
||||||
|
|
||||||
class CBanEntry
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static const int CURRENT_VERSION=1;
|
|
||||||
int nVersion;
|
|
||||||
int64_t nCreateTime;
|
|
||||||
int64_t nBanUntil;
|
|
||||||
uint8_t banReason;
|
|
||||||
|
|
||||||
CBanEntry()
|
|
||||||
{
|
|
||||||
SetNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
CBanEntry(int64_t nCreateTimeIn)
|
|
||||||
{
|
|
||||||
SetNull();
|
|
||||||
nCreateTime = nCreateTimeIn;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADD_SERIALIZE_METHODS;
|
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
|
||||||
READWRITE(this->nVersion);
|
|
||||||
nVersion = this->nVersion;
|
|
||||||
READWRITE(nCreateTime);
|
|
||||||
READWRITE(nBanUntil);
|
|
||||||
READWRITE(banReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetNull()
|
|
||||||
{
|
|
||||||
nVersion = CBanEntry::CURRENT_VERSION;
|
|
||||||
nCreateTime = 0;
|
|
||||||
nBanUntil = 0;
|
|
||||||
banReason = BanReasonUnknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string banReasonToString()
|
|
||||||
{
|
|
||||||
switch (banReason) {
|
|
||||||
case BanReasonNodeMisbehaving:
|
|
||||||
return "node misbehaving";
|
|
||||||
case BanReasonManuallyAdded:
|
|
||||||
return "manually added";
|
|
||||||
default:
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::map<CSubNet, CBanEntry> banmap_t;
|
|
||||||
|
|
||||||
/** Information about a peer */
|
/** Information about a peer */
|
||||||
class CNode
|
class CNode
|
||||||
{
|
{
|
||||||
@ -819,28 +759,6 @@ public:
|
|||||||
class CTransaction;
|
class CTransaction;
|
||||||
void RelayTransaction(const CTransaction& tx);
|
void RelayTransaction(const CTransaction& tx);
|
||||||
|
|
||||||
/** Access to the (IP) address database (peers.dat) */
|
|
||||||
class CAddrDB
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
boost::filesystem::path pathAddr;
|
|
||||||
public:
|
|
||||||
CAddrDB();
|
|
||||||
bool Write(const CAddrMan& addr);
|
|
||||||
bool Read(CAddrMan& addr);
|
|
||||||
bool Read(CAddrMan& addr, CDataStream& ssPeers);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Access to the banlist database (banlist.dat) */
|
|
||||||
class CBanDB
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
boost::filesystem::path pathBanlist;
|
|
||||||
public:
|
|
||||||
CBanDB();
|
|
||||||
bool Write(const banmap_t& banSet);
|
|
||||||
bool Read(banmap_t& banSet);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
|
/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
|
||||||
int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds);
|
int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds);
|
||||||
|
Loading…
Reference in New Issue
Block a user