mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 06:28:31 +01:00
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
This commit is contained in:
@@ -18,20 +18,18 @@ BanMan::BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t
|
||||
if (m_client_interface) m_client_interface->InitMessage(_("Loading banlist…").translated);
|
||||
|
||||
int64_t n_start = GetTimeMillis();
|
||||
m_is_dirty = false;
|
||||
banmap_t banmap;
|
||||
if (m_ban_db.Read(banmap)) {
|
||||
SetBanned(banmap); // thread save setter
|
||||
SetBannedSetDirty(false); // no need to write down, just read data
|
||||
SweepBanned(); // sweep out unused entries
|
||||
if (m_ban_db.Read(m_banned, m_is_dirty)) {
|
||||
SweepBanned(); // sweep out unused entries
|
||||
|
||||
LogPrint(BCLog::NET, "Loaded %d banned node ips/subnets from banlist.dat %dms\n",
|
||||
m_banned.size(), GetTimeMillis() - n_start);
|
||||
LogPrint(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
|
||||
GetTimeMillis() - n_start);
|
||||
} else {
|
||||
LogPrintf("Recreating banlist.dat\n");
|
||||
SetBannedSetDirty(true); // force write
|
||||
DumpBanlist();
|
||||
LogPrintf("Recreating the banlist database\n");
|
||||
m_banned = {};
|
||||
m_is_dirty = true;
|
||||
}
|
||||
|
||||
DumpBanlist();
|
||||
}
|
||||
|
||||
BanMan::~BanMan()
|
||||
@@ -53,8 +51,8 @@ void BanMan::DumpBanlist()
|
||||
SetBannedSetDirty(false);
|
||||
}
|
||||
|
||||
LogPrint(BCLog::NET, "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
|
||||
banmap.size(), GetTimeMillis() - n_start);
|
||||
LogPrint(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
|
||||
GetTimeMillis() - n_start);
|
||||
}
|
||||
|
||||
void BanMan::ClearBanned()
|
||||
@@ -167,13 +165,6 @@ void BanMan::GetBanned(banmap_t& banmap)
|
||||
banmap = m_banned; //create a thread safe copy
|
||||
}
|
||||
|
||||
void BanMan::SetBanned(const banmap_t& banmap)
|
||||
{
|
||||
LOCK(m_cs_banned);
|
||||
m_banned = banmap;
|
||||
m_is_dirty = true;
|
||||
}
|
||||
|
||||
void BanMan::SweepBanned()
|
||||
{
|
||||
int64_t now = GetTime();
|
||||
@@ -188,7 +179,7 @@ void BanMan::SweepBanned()
|
||||
m_banned.erase(it++);
|
||||
m_is_dirty = true;
|
||||
notify_ui = true;
|
||||
LogPrint(BCLog::NET, "%s: Removed banned node ip/subnet from banlist.dat: %s\n", __func__, sub_net.ToString());
|
||||
LogPrint(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
|
||||
} else
|
||||
++it;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user