26class DbNotFoundError :
public std::exception {
27 using std::exception::exception;
30template <
typename Stream,
typename Data>
31bool SerializeDB(
const CChainParams &chainParams, Stream &stream,
36 hashwriter << chainParams.
DiskMagic() << data;
37 stream << hashwriter.GetHash();
38 }
catch (
const std::exception &e) {
39 LogError(
"%s: Serialize or I/O error - %s\n", __func__, e.what());
46template <
typename Data>
48 const fs::path &path,
const Data &data,
int version) {
50 const uint16_t randv{GetRand<uint16_t>()};
57 if (fileout.IsNull()) {
60 LogError(
"%s: Failed to open file %s\n", __func__,
66 if (!SerializeDB(chainParams, fileout, data)) {
74 LogError(
"%s: Failed to flush file %s\n", __func__,
83 LogError(
"%s: Rename-into-place failed\n", __func__);
90template <
typename Stream,
typename Data>
91void DeserializeDB(
const CChainParams &chainParams, Stream &stream, Data &data,
92 bool fCheckSum =
true) {
96 verifier >> pchMsgTmp;
98 if (memcmp(pchMsgTmp, std::begin(chainParams.
DiskMagic()),
100 throw std::runtime_error{
"Invalid network magic number"};
110 if (hashTmp != verifier.GetHash()) {
111 throw std::runtime_error{
"Checksum mismatch, data corrupted"};
116template <
typename Data>
118 Data &data,
int version) {
122 if (filein.IsNull()) {
123 throw DbNotFoundError{};
126 DeserializeDB(chainParams, filein, data);
132 : m_ban_list_path(
std::move(ban_list_path)), chainParams(_chainParams) {}
146 }
catch (
const std::exception &) {
147 LogPrintf(
"Missing or invalid file %s\n",
158 return SerializeFileDB(chainParams,
"peers", pathAddr, addr,
164 DeserializeDB(chainParams, ssPeers, addr,
false);
170 auto check_addrman = std::clamp<int32_t>(
174 std::make_unique<AddrMan>(asmap,
false,
180 DeserializeFileDB(chainparams, path_addr, *addrman,
CLIENT_VERSION);
181 LogPrintf(
"Loaded %i addresses from peers.dat %dms\n", addrman->size(),
183 }
catch (
const DbNotFoundError &) {
185 addrman = std::make_unique<AddrMan>(
188 LogPrintf(
"Creating peers.dat because the file was not found (%s)\n",
194 strprintf(
_(
"Failed to rename invalid peers.dat file. "
195 "Please move or delete it and try again."))};
198 addrman = std::make_unique<AddrMan>(
201 LogPrintf(
"Creating new peers.dat because the file version was not "
202 "compatible (%s). Original backed up to peers.dat.bak\n",
205 }
catch (
const std::exception &e) {
207 _(
"Invalid or corrupt peers.dat (%s). If you believe this is a "
208 "bug, please report it to %s. As a workaround, you can move the "
209 "file (%s) out of the way (rename, move, or delete) to have a "
210 "new one created on the next start."),
211 e.what(), PACKAGE_BUGREPORT,
218 return {std::move(addrman)};
223 const std::vector<CAddress> &anchors) {
225 "Flush %d outbound block-relay-only peer addresses to anchors.dat",
227 SerializeFileDB(chainParams,
"anchors", anchors_db_path, anchors,
233 std::vector<CAddress> anchors;
235 DeserializeFileDB(chainParams, anchors_db_path, anchors,
237 LogPrintf(
"Loaded %i addresses from %s\n", anchors.size(),
239 }
catch (
const std::exception &) {
243 fs::remove(anchors_db_path);
std::vector< CAddress > ReadAnchors(const CChainParams &chainParams, const fs::path &anchors_db_path)
Read the anchor IP address database (anchors.dat)
util::Result< std::unique_ptr< AddrMan > > LoadAddrman(const CChainParams &chainparams, const std::vector< bool > &asmap, const ArgsManager &args)
Returns an error string on failure.
void ReadFromStream(const CChainParams &chainParams, AddrMan &addr, CDataStream &ssPeers)
Only used by tests.
bool DumpPeerAddresses(const CChainParams &chainParams, const ArgsManager &args, const AddrMan &addr)
void DumpAnchors(const CChainParams &chainParams, const fs::path &anchors_db_path, const std::vector< CAddress > &anchors)
Dump the anchor IP address database (anchors.dat)
static constexpr int32_t DEFAULT_ADDRMAN_CONSISTENCY_CHECKS
Default for -checkaddrman.
Stochastic address manager.
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
bool Write(const banmap_t &banSet)
const fs::path m_ban_list_path
CBanDB(fs::path ban_list_path, const CChainParams &_chainParams)
bool Read(banmap_t &banSet)
const CChainParams & chainParams
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
const CMessageHeader::MessageMagic & DiskMagic() const
Reads data from an underlying stream, while hashing the read data.
Writes data to an underlying source stream, while hashing the written data.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
static constexpr int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
bool RenameOver(fs::path src, fs::path dest)
bool FileCommit(FILE *file)
Ensure file contents are fully committed to disk, using a platform-specific feature analogous to fsyn...
static auto quoted(const std::string &s)
static std::string PathToString(const path &path)
Convert path object to byte string.
FILE * fopen(const fs::path &p, const char *mode)
Implement std::hash so RCUPtr can be used as a key for maps or sets.
std::map< CSubNet, CBanEntry > banmap_t
static constexpr int ADDRV2_FORMAT
A flag that is ORed into the protocol version to designate that addresses should be serialized in (un...
int64_t GetTimeMillis()
Returns the system time (not mockable)
#define LOG_TIME_SECONDS(end_msg)
bilingual_str _(const char *psz)
Translation function.