aboutsummaryrefslogtreecommitdiff
path: root/src/addrdb.h
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2021-01-14 09:33:04 +0100
committerVasil Dimov <vd@FreeBSD.org>2021-06-21 14:39:44 +0200
commitd197977ae2076903ed12ab7616a7f93e88be02e1 (patch)
treef52c91c3abad65cffa13a8334c37da415c708c70 /src/addrdb.h
parent6a67366fdc3e1d383fe7cbfa209d7e85f0d96638 (diff)
banman: save the banlist in a JSON format on disk
Save the banlist in `banlist.json` instead of `banlist.dat`. This makes it possible to store Tor v3 entries in the banlist on disk (and any other addresses that cannot be serialized in addrv1 format). Only read `banlist.dat` if it exists and `banlist.json` does not exist (first start after an upgrade). Supersedes https://github.com/bitcoin/bitcoin/pull/20904 Resolves https://github.com/bitcoin/bitcoin/issues/19748
Diffstat (limited to 'src/addrdb.h')
-rw-r--r--src/addrdb.h35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/addrdb.h b/src/addrdb.h
index 8953ebb169..399103c991 100644
--- a/src/addrdb.h
+++ b/src/addrdb.h
@@ -9,6 +9,7 @@
#include <fs.h>
#include <net_types.h> // For banmap_t
#include <serialize.h>
+#include <univalue.h>
#include <string>
#include <vector>
@@ -36,6 +37,13 @@ public:
nCreateTime = nCreateTimeIn;
}
+ /**
+ * Create a ban entry from JSON.
+ * @param[in] json A JSON representation of a ban entry, as created by `ToJson()`.
+ * @throw std::runtime_error if the JSON does not have the expected fields.
+ */
+ explicit CBanEntry(const UniValue& json);
+
SERIALIZE_METHODS(CBanEntry, obj)
{
uint8_t ban_reason = 2; //! For backward compatibility
@@ -48,6 +56,12 @@ public:
nCreateTime = 0;
nBanUntil = 0;
}
+
+ /**
+ * Generate a JSON representation of this ban entry.
+ * @return JSON suitable for passing to the `CBanEntry(const UniValue&)` constructor.
+ */
+ UniValue ToJson() const;
};
/** Access to the (IP) address database (peers.dat) */
@@ -62,15 +76,30 @@ public:
static bool Read(CAddrMan& addr, CDataStream& ssPeers);
};
-/** Access to the banlist database (banlist.dat) */
+/** Access to the banlist databases (banlist.json and banlist.dat) */
class CBanDB
{
private:
- const fs::path m_ban_list_path;
+ /**
+ * JSON key under which the data is stored in the json database.
+ */
+ static constexpr const char* JSON_KEY = "banned_nets";
+
+ const fs::path m_banlist_dat;
+ const fs::path m_banlist_json;
public:
explicit CBanDB(fs::path ban_list_path);
bool Write(const banmap_t& banSet);
- bool Read(banmap_t& banSet);
+
+ /**
+ * Read the banlist from disk.
+ * @param[out] banSet The loaded list. Set if `true` is returned, otherwise it is left
+ * in an undefined state.
+ * @param[out] dirty Indicates whether the loaded list needs flushing to disk. Set if
+ * `true` is returned, otherwise it is left in an undefined state.
+ * @return true on success
+ */
+ bool Read(banmap_t& banSet, bool& dirty);
};
/**