Merge 18972 via neutrino_whitelist-mini

This commit is contained in:
Luke Dashjr 2025-03-05 03:27:08 +00:00
commit a5e45fc1e0
6 changed files with 34 additions and 3 deletions

View File

@ -1897,10 +1897,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
return InitError(ResolveErrMsg("bind", bind_arg)); return InitError(ResolveErrMsg("bind", bind_arg));
} }
NetPermissionFlags all_permission_flags{NetPermissionFlags::None};
for (const std::string& strBind : args.GetArgs("-whitebind")) { for (const std::string& strBind : args.GetArgs("-whitebind")) {
NetWhitebindPermissions whitebind; NetWhitebindPermissions whitebind;
bilingual_str error; bilingual_str error;
if (!NetWhitebindPermissions::TryParse(strBind, whitebind, error)) return InitError(error); if (!NetWhitebindPermissions::TryParse(strBind, whitebind, error)) return InitError(error);
NetPermissions::AddFlag(all_permission_flags, whitebind.m_flags);
connOptions.vWhiteBinds.push_back(whitebind); connOptions.vWhiteBinds.push_back(whitebind);
} }
@ -1947,6 +1950,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
ConnectionDirection connection_direction; ConnectionDirection connection_direction;
bilingual_str error; bilingual_str error;
if (!NetWhitelistPermissions::TryParse(net, subnet, connection_direction, error)) return InitError(error); if (!NetWhitelistPermissions::TryParse(net, subnet, connection_direction, error)) return InitError(error);
NetPermissions::AddFlag(all_permission_flags, subnet.m_flags);
if (connection_direction & ConnectionDirection::In) { if (connection_direction & ConnectionDirection::In) {
connOptions.vWhitelistedRangeIncoming.push_back(subnet); connOptions.vWhitelistedRangeIncoming.push_back(subnet);
} }
@ -1955,6 +1959,12 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
} }
} }
if (NetPermissions::HasFlag(all_permission_flags, NetPermissionFlags::BlockFilters_Explicit)) {
if (g_enabled_filter_types.count(BlockFilterType::BASIC) != 1) {
return InitError(_("Cannot grant blockfilters permission without -blockfilterindex."));
}
}
connOptions.vSeedNodes = args.GetArgs("-seednode"); connOptions.vSeedNodes = args.GetArgs("-seednode");
// Initiate outbound connections unless connect=0 // Initiate outbound connections unless connect=0

View File

@ -12,6 +12,7 @@ using common::ResolveErrMsg;
const std::vector<std::string> NET_PERMISSIONS_DOC{ const std::vector<std::string> NET_PERMISSIONS_DOC{
"bloomfilter (allow requesting BIP37 filtered blocks and transactions)", "bloomfilter (allow requesting BIP37 filtered blocks and transactions)",
"blockfilters (serve compact block filters to peers per BIP157)",
"noban (do not ban for misbehavior; implies download)", "noban (do not ban for misbehavior; implies download)",
"forcerelay (relay transactions that are already in the mempool; implies relay)", "forcerelay (relay transactions that are already in the mempool; implies relay)",
"relay (relay even in -blocksonly mode, and unlimited transaction announcements)", "relay (relay even in -blocksonly mode, and unlimited transaction announcements)",
@ -48,6 +49,7 @@ static bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags&
if (commaSeparator != std::string::npos) readen++; // We read "," if (commaSeparator != std::string::npos) readen++; // We read ","
if (permission == "bloomfilter" || permission == "bloom") NetPermissions::AddFlag(flags, NetPermissionFlags::BloomFilter); if (permission == "bloomfilter" || permission == "bloom") NetPermissions::AddFlag(flags, NetPermissionFlags::BloomFilter);
else if (permission == "blockfilters" || permission == "compactfilters" || permission == "cfilters") NetPermissions::AddFlag(flags, NetPermissionFlags::BlockFilters_Explicit);
else if (permission == "noban") NetPermissions::AddFlag(flags, NetPermissionFlags::NoBan); else if (permission == "noban") NetPermissions::AddFlag(flags, NetPermissionFlags::NoBan);
else if (permission == "forcerelay") NetPermissions::AddFlag(flags, NetPermissionFlags::ForceRelay); else if (permission == "forcerelay") NetPermissions::AddFlag(flags, NetPermissionFlags::ForceRelay);
else if (permission == "mempool") NetPermissions::AddFlag(flags, NetPermissionFlags::Mempool); else if (permission == "mempool") NetPermissions::AddFlag(flags, NetPermissionFlags::Mempool);
@ -92,6 +94,7 @@ static bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags&
std::vector<std::string> NetPermissions::ToStrings(NetPermissionFlags flags) std::vector<std::string> NetPermissions::ToStrings(NetPermissionFlags flags)
{ {
std::vector<std::string> strings; std::vector<std::string> strings;
if (NetPermissions::HasFlag(flags, NetPermissionFlags::BlockFilters)) strings.emplace_back("blockfilters");
if (NetPermissions::HasFlag(flags, NetPermissionFlags::BloomFilter)) strings.emplace_back("bloomfilter"); if (NetPermissions::HasFlag(flags, NetPermissionFlags::BloomFilter)) strings.emplace_back("bloomfilter");
if (NetPermissions::HasFlag(flags, NetPermissionFlags::NoBan)) strings.emplace_back("noban"); if (NetPermissions::HasFlag(flags, NetPermissionFlags::NoBan)) strings.emplace_back("noban");
if (NetPermissions::HasFlag(flags, NetPermissionFlags::ForceRelay)) strings.emplace_back("forcerelay"); if (NetPermissions::HasFlag(flags, NetPermissionFlags::ForceRelay)) strings.emplace_back("forcerelay");

View File

@ -41,10 +41,15 @@ enum class NetPermissionFlags : uint32_t {
// unlimited amounts of addrs. // unlimited amounts of addrs.
Addr = (1U << 7), Addr = (1U << 7),
// Can query compact filters even if -peerblockfilters is false
BlockFilters = (1U << 8),
// Used to avoid an error when All is used to set BlockFilters
BlockFilters_Explicit = BlockFilters | (1U << 9),
// True if the user did not specifically set fine-grained permissions with // True if the user did not specifically set fine-grained permissions with
// the -whitebind or -whitelist configuration options. // the -whitebind or -whitelist configuration options.
Implicit = (1U << 31), Implicit = (1U << 31),
All = BloomFilter | ForceRelay | Relay | NoBan | Mempool | Download | Addr, All = BloomFilter | ForceRelay | Relay | NoBan | Mempool | Download | Addr | BlockFilters,
}; };
static inline constexpr NetPermissionFlags operator|(NetPermissionFlags a, NetPermissionFlags b) static inline constexpr NetPermissionFlags operator|(NetPermissionFlags a, NetPermissionFlags b)
{ {

View File

@ -1741,6 +1741,9 @@ void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_service
if (NetPermissions::HasFlag(node.m_permission_flags, NetPermissionFlags::BloomFilter)) { if (NetPermissions::HasFlag(node.m_permission_flags, NetPermissionFlags::BloomFilter)) {
our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM); our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
} }
if (NetPermissions::HasFlag(node.m_permission_flags, NetPermissionFlags::BlockFilters)) {
our_services = static_cast<ServiceFlags>(our_services | NODE_COMPACT_FILTERS);
}
PeerRef peer = std::make_shared<Peer>(nodeid, our_services); PeerRef peer = std::make_shared<Peer>(nodeid, our_services);
{ {

View File

@ -465,7 +465,8 @@ BOOST_AUTO_TEST_CASE(netpermissions_test)
BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Both); BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Both);
const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All); const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All);
BOOST_CHECK_EQUAL(strings.size(), 7U); BOOST_CHECK_EQUAL(strings.size(), 8U);
BOOST_CHECK(std::find(strings.begin(), strings.end(), "blockfilters") != strings.end());
BOOST_CHECK(std::find(strings.begin(), strings.end(), "bloomfilter") != strings.end()); BOOST_CHECK(std::find(strings.begin(), strings.end(), "bloomfilter") != strings.end());
BOOST_CHECK(std::find(strings.begin(), strings.end(), "forcerelay") != strings.end()); BOOST_CHECK(std::find(strings.begin(), strings.end(), "forcerelay") != strings.end());
BOOST_CHECK(std::find(strings.begin(), strings.end(), "relay") != strings.end()); BOOST_CHECK(std::find(strings.begin(), strings.end(), "relay") != strings.end());

View File

@ -81,7 +81,16 @@ class P2PPermissionsTests(BitcoinTestFramework):
self.checkpermission( self.checkpermission(
# all permission added # all permission added
["-whitelist=all@127.0.0.1"], ["-whitelist=all@127.0.0.1"],
["forcerelay", "noban", "mempool", "bloomfilter", "relay", "download", "addr"]) [
"blockfilters",
"forcerelay",
"noban",
"mempool",
"bloomfilter",
"relay",
"download",
"addr",
])
for flag, permissions in [(["-whitelist=noban,out@127.0.0.1"], ["noban", "download"]), (["-whitelist=noban@127.0.0.1"], [])]: for flag, permissions in [(["-whitelist=noban,out@127.0.0.1"], ["noban", "download"]), (["-whitelist=noban@127.0.0.1"], [])]:
self.restart_node(0, flag) self.restart_node(0, flag)