aboutsummaryrefslogtreecommitdiff
path: root/src/rpc
diff options
context:
space:
mode:
authorAndrew Chow <github@achow101.com>2023-09-20 08:19:30 -0400
committerAndrew Chow <github@achow101.com>2023-09-20 08:25:20 -0400
commitff564c75e751db6cfaf2a5f1b8a3b471f510976f (patch)
treecd6a9a6c12c7f0bcecffa968527da584509b095e /src/rpc
parent3966b0a0b6b5e6110ba8106c04af1067fc6219bc (diff)
parent28bac81a346c0b68273fa73af924f7096cb3f41d (diff)
downloadbitcoin-ff564c75e751db6cfaf2a5f1b8a3b471f510976f.tar.xz
Merge bitcoin/bitcoin#27511: rpc: Add test-only RPC getaddrmaninfo for new/tried table address count
28bac81a346c0b68273fa73af924f7096cb3f41d test: add functional test for getaddrmaninfo (stratospher) c8eb8dae51039aa1938e7040001a149210e87275 rpc: Introduce getaddrmaninfo for count of addresses stored in new/tried table (stratospher) Pull request description: implements https://github.com/bitcoin/bitcoin/issues/26907. split off from #26988 to keep RPC, CLI discussions separate. This PR introduces a new RPC `getaddrmaninfo`which returns the count of addresses in the new/tried table of a node's addrman broken down by network type. This would be useful for users who want to see the distribution of addresses from different networks across new/tried table in the addrman. ```jsx $ getaddrmaninfo Result: { (json object) json object with network type as keys "network" : { (json object) The network (ipv4, ipv6, onion, i2p, cjdns) "new" : n, (numeric) number of addresses in new table "tried" : n, (numeric) number of addresses in tried table "total" : n (numeric) total number of addresses in both new/tried tables from a network }, ... } ``` ### additional context from [original PR](https://github.com/bitcoin/bitcoin/pull/26988) 1. network coverage tests were skipped because there’s a small chance that addresses from different networks could hash to the same bucket and cause count of different network addresses in the tests to fail. see https://github.com/bitcoin/bitcoin/pull/26988#discussion_r1137596851. 2. #26988 uses this RPC in -addrinfo CLI. Slight preference for keeping the RPC hidden since this info will mostly be useful to only super users. see https://github.com/bitcoin/bitcoin/pull/26988#discussion_r1173964808. ACKs for top commit: 0xB10C: ACK 28bac81a346c0b68273fa73af924f7096cb3f41d willcl-ark: reACK 28bac81a346c0b68273fa73af924f7096cb3f41d achow101: ACK 28bac81a346c0b68273fa73af924f7096cb3f41d brunoerg: reACK 28bac81a346c0b68273fa73af924f7096cb3f41d theStack: Code-review ACK 28bac81a346c0b68273fa73af924f7096cb3f41d Tree-SHA512: 346390167e1ebed7ca5c79328ea452633736aff8b7feefea77460e04d4489059334ae78a3f757f32f5fb7827b309d7186bebab3c3760b3dfb016d564a647371a
Diffstat (limited to 'src/rpc')
-rw-r--r--src/rpc/net.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
index f7b6c68344..e9e9ad62ae 100644
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -1016,6 +1016,55 @@ static RPCHelpMan sendmsgtopeer()
};
}
+static RPCHelpMan getaddrmaninfo()
+{
+ return RPCHelpMan{"getaddrmaninfo",
+ "\nProvides information about the node's address manager by returning the number of "
+ "addresses in the `new` and `tried` tables and their sum for all networks.\n"
+ "This RPC is for testing only.\n",
+ {},
+ RPCResult{
+ RPCResult::Type::OBJ_DYN, "", "json object with network type as keys",
+ {
+ {RPCResult::Type::OBJ, "network", "the network (" + Join(GetNetworkNames(), ", ") + ")",
+ {
+ {RPCResult::Type::NUM, "new", "number of addresses in the new table, which represent potential peers the node has discovered but hasn't yet successfully connected to."},
+ {RPCResult::Type::NUM, "tried", "number of addresses in the tried table, which represent peers the node has successfully connected to in the past."},
+ {RPCResult::Type::NUM, "total", "total number of addresses in both new/tried tables"},
+ }},
+ }
+ },
+ RPCExamples{
+ HelpExampleCli("getaddrmaninfo", "")
+ + HelpExampleRpc("getaddrmaninfo", "")
+ },
+ [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
+ {
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ if (!node.addrman) {
+ throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Address manager functionality missing or disabled");
+ }
+
+ UniValue ret(UniValue::VOBJ);
+ for (int n = 0; n < NET_MAX; ++n) {
+ enum Network network = static_cast<enum Network>(n);
+ if (network == NET_UNROUTABLE || network == NET_INTERNAL) continue;
+ UniValue obj(UniValue::VOBJ);
+ obj.pushKV("new", node.addrman->Size(network, true));
+ obj.pushKV("tried", node.addrman->Size(network, false));
+ obj.pushKV("total", node.addrman->Size(network));
+ ret.pushKV(GetNetworkName(network), obj);
+ }
+ UniValue obj(UniValue::VOBJ);
+ obj.pushKV("new", node.addrman->Size(std::nullopt, true));
+ obj.pushKV("tried", node.addrman->Size(std::nullopt, false));
+ obj.pushKV("total", node.addrman->Size());
+ ret.pushKV("all_networks", obj);
+ return ret;
+ },
+ };
+}
+
void RegisterNetRPCCommands(CRPCTable& t)
{
static const CRPCCommand commands[]{
@@ -1035,6 +1084,7 @@ void RegisterNetRPCCommands(CRPCTable& t)
{"hidden", &addconnection},
{"hidden", &addpeeraddress},
{"hidden", &sendmsgtopeer},
+ {"hidden", &getaddrmaninfo},
};
for (const auto& c : commands) {
t.appendCommand(c.name, &c);