Bitcoin Core 31.99.0
P2P Digital Currency
net.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <rpc/server.h>
6
7#include <addrman.h>
8#include <addrman_impl.h>
9#include <banman.h>
10#include <chainparams.h>
11#include <clientversion.h>
12#include <common/args.h>
13#include <core_io.h>
14#include <hash.h>
15#include <net_permissions.h>
16#include <net_processing.h>
17#include <net_types.h>
18#include <netbase.h>
19#include <node/context.h>
20#ifdef ENABLE_EMBEDDED_ASMAP
21#include <node/data/ip_asn.dat.h>
22#endif
24#include <node/warnings.h>
25#include <policy/settings.h>
26#include <protocol.h>
27#include <rpc/blockchain.h>
28#include <rpc/protocol.h>
29#include <rpc/server_util.h>
30#include <rpc/util.h>
31#include <sync.h>
32#include <univalue.h>
33#include <util/asmap.h>
34#include <util/chaintype.h>
35#include <util/strencodings.h>
36#include <util/string.h>
37#include <util/time.h>
38#include <util/translation.h>
39#include <validation.h>
40
41#include <chrono>
42#include <optional>
43#include <stdexcept>
44#include <string>
45#include <string_view>
46#include <vector>
47
49using util::Join;
51
52const std::vector<std::string> CONNECTION_TYPE_DOC{
53 "outbound-full-relay (default automatic connections)",
54 "block-relay-only (does not relay transactions or addresses)",
55 "inbound (initiated by the peer)",
56 "manual (added via addnode RPC or -addnode/-connect configuration options)",
57 "addr-fetch (short-lived automatic connection for soliciting addresses)",
58 "feeler (short-lived automatic connection for testing addresses)",
59 "private-broadcast (short-lived automatic connection for broadcasting privacy-sensitive transactions)"
60};
61
62const std::vector<std::string> TRANSPORT_TYPE_DOC{
63 "detecting (peer could be v1 or v2)",
64 "v1 (plaintext transport protocol)",
65 "v2 (BIP324 encrypted transport protocol)"
66};
67
69{
70 return RPCMethod{
71 "getconnectioncount",
72 "Returns the number of connections to other nodes.\n",
73 {},
75 RPCResult::Type::NUM, "", "The connection count"
76 },
78 HelpExampleCli("getconnectioncount", "")
79 + HelpExampleRpc("getconnectioncount", "")
80 },
81 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
82{
83 NodeContext& node = EnsureAnyNodeContext(request.context);
84 const CConnman& connman = EnsureConnman(node);
85
87},
88 };
89}
90
92{
93 return RPCMethod{
94 "ping",
95 "Requests that a ping be sent to all other nodes, to measure ping time.\n"
96 "Results are provided in getpeerinfo.\n"
97 "Ping command is handled in queue with all other commands, so it measures processing backlog, not just network ping.\n",
98 {},
101 HelpExampleCli("ping", "")
102 + HelpExampleRpc("ping", "")
103 },
104 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
105{
106 NodeContext& node = EnsureAnyNodeContext(request.context);
107 PeerManager& peerman = EnsurePeerman(node);
108
109 // Request that each node send a ping during next message processing pass
110 peerman.SendPings();
111 return UniValue::VNULL;
112},
113 };
114}
115
118{
119 UniValue servicesNames(UniValue::VARR);
120
121 for (const auto& flag : serviceFlagsToStr(services)) {
122 servicesNames.push_back(flag);
123 }
124
125 return servicesNames;
126}
127
129{
130 return RPCMethod{
131 "getpeerinfo",
132 "Returns data about each connected network peer as a json array of objects.",
133 {},
134 RPCResult{
135 RPCResult::Type::ARR, "", "",
136 {
137 {RPCResult::Type::OBJ, "", "",
138 {
139 {
140 {RPCResult::Type::NUM, "id", "Peer index"},
141 {RPCResult::Type::STR, "addr", "(host:port) The IP address/hostname optionally followed by :port of the peer"},
142 {RPCResult::Type::STR, "addrbind", /*optional=*/true, "(ip:port) Bind address of the connection to the peer"},
143 {RPCResult::Type::STR, "addrlocal", /*optional=*/true, "(ip:port) Local address as reported by the peer"},
144 {RPCResult::Type::STR, "network", "Network (" + Join(GetNetworkNames(/*append_unroutable=*/true), ", ") + ")"},
145 {RPCResult::Type::NUM, "mapped_as", /*optional=*/true, "Mapped AS (Autonomous System) number at the end of the BGP route to the peer, used for diversifying\n"
146 "peer selection (only displayed if the -asmap config option is set)"},
147 {RPCResult::Type::STR_HEX, "services", "The services offered"},
148 {RPCResult::Type::ARR, "servicesnames", "the services offered, in human-readable form",
149 {
150 {RPCResult::Type::STR, "SERVICE_NAME", "the service name if it is recognised"}
151 }},
152 {RPCResult::Type::BOOL, "relaytxes", "Whether we relay transactions to this peer"},
153 {RPCResult::Type::NUM, "last_inv_sequence", "Mempool sequence number of this peer's last INV"},
154 {RPCResult::Type::NUM, "inv_to_send", "How many txs we have queued to announce to this peer"},
155 {RPCResult::Type::NUM_TIME, "lastsend", "The " + UNIX_EPOCH_TIME + " of the last send"},
156 {RPCResult::Type::NUM_TIME, "lastrecv", "The " + UNIX_EPOCH_TIME + " of the last receive"},
157 {RPCResult::Type::NUM_TIME, "last_transaction", "The " + UNIX_EPOCH_TIME + " of the last valid transaction received from this peer"},
158 {RPCResult::Type::NUM_TIME, "last_block", "The " + UNIX_EPOCH_TIME + " of the last block received from this peer"},
159 {RPCResult::Type::NUM, "bytessent", "The total bytes sent"},
160 {RPCResult::Type::NUM, "bytesrecv", "The total bytes received"},
161 {RPCResult::Type::NUM_TIME, "conntime", "The " + UNIX_EPOCH_TIME + " of the connection"},
162 {RPCResult::Type::NUM, "timeoffset", "The time offset in seconds"},
163 {RPCResult::Type::NUM, "pingtime", /*optional=*/true, "The last ping time in seconds, if any"},
164 {RPCResult::Type::NUM, "minping", /*optional=*/true, "The minimum observed ping time in seconds, if any"},
165 {RPCResult::Type::NUM, "pingwait", /*optional=*/true, "The duration in seconds of an outstanding ping (if non-zero)"},
166 {RPCResult::Type::NUM, "version", "The peer version, such as 70001"},
167 {RPCResult::Type::STR, "subver", "The string version"},
168 {RPCResult::Type::BOOL, "inbound", "Inbound (true) or Outbound (false)"},
169 {RPCResult::Type::BOOL, "bip152_hb_to", "Whether we selected peer as (compact blocks) high-bandwidth peer"},
170 {RPCResult::Type::BOOL, "bip152_hb_from", "Whether peer selected us as (compact blocks) high-bandwidth peer"},
171 {RPCResult::Type::NUM, "presynced_headers", "The current height of header pre-synchronization with this peer, or -1 if no low-work sync is in progress"},
172 {RPCResult::Type::NUM, "synced_headers", "The last header we have in common with this peer"},
173 {RPCResult::Type::NUM, "synced_blocks", "The last block we have in common with this peer"},
174 {RPCResult::Type::ARR, "inflight", "",
175 {
176 {RPCResult::Type::NUM, "n", "The heights of blocks we're currently asking from this peer"},
177 }},
178 {RPCResult::Type::BOOL, "addr_relay_enabled", "Whether we participate in address relay with this peer"},
179 {RPCResult::Type::NUM, "addr_processed", "The total number of addresses processed, excluding those dropped due to rate limiting"},
180 {RPCResult::Type::NUM, "addr_rate_limited", "The total number of addresses dropped due to rate limiting"},
181 {RPCResult::Type::ARR, "permissions", "Any special permissions that have been granted to this peer",
182 {
183 {RPCResult::Type::STR, "permission_type", Join(NET_PERMISSIONS_DOC, ",\n") + ".\n"},
184 }},
185 {RPCResult::Type::NUM, "minfeefilter", "The minimum fee rate for transactions this peer accepts"},
186 {RPCResult::Type::OBJ_DYN, "bytessent_per_msg", "",
187 {
188 {RPCResult::Type::NUM, "msg", "The total bytes sent aggregated by message type\n"
189 "When a message type is not listed in this json object, the bytes sent are 0.\n"
190 "Only known message types can appear as keys in the object."}
191 }},
192 {RPCResult::Type::OBJ_DYN, "bytesrecv_per_msg", "",
193 {
194 {RPCResult::Type::NUM, "msg", "The total bytes received aggregated by message type\n"
195 "When a message type is not listed in this json object, the bytes received are 0.\n"
196 "Only known message types can appear as keys in the object and all bytes received\n"
197 "of unknown message types are listed under '"+NET_MESSAGE_TYPE_OTHER+"'."}
198 }},
199 {RPCResult::Type::STR, "connection_type", "Type of connection: \n" + Join(CONNECTION_TYPE_DOC, ",\n") + ".\n"
200 "Please note this output is unlikely to be stable in upcoming releases as we iterate to\n"
201 "best capture connection behaviors."},
202 {RPCResult::Type::STR, "transport_protocol_type", "Type of transport protocol: \n" + Join(TRANSPORT_TYPE_DOC, ",\n") + ".\n"},
203 {RPCResult::Type::STR, "session_id", "The session ID for this connection, or \"\" if there is none (\"v2\" transport protocol only).\n"},
204 }},
205 }},
206 },
208 HelpExampleCli("getpeerinfo", "")
209 + HelpExampleRpc("getpeerinfo", "")
210 },
211 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
212{
213 NodeContext& node = EnsureAnyNodeContext(request.context);
214 const CConnman& connman = EnsureConnman(node);
215 const PeerManager& peerman = EnsurePeerman(node);
216
217 std::vector<CNodeStats> vstats;
218 connman.GetNodeStats(vstats);
219
221
222 for (const CNodeStats& stats : vstats) {
224 CNodeStateStats statestats;
225 bool fStateStats = peerman.GetNodeStateStats(stats.nodeid, statestats);
226 // GetNodeStateStats() requires the existence of a CNodeState and a Peer object
227 // to succeed for this peer. These are created at connection initialisation and
228 // exist for the duration of the connection - except if there is a race where the
229 // peer got disconnected in between the GetNodeStats() and the GetNodeStateStats()
230 // calls. In this case, the peer doesn't need to be reported here.
231 if (!fStateStats) {
232 continue;
233 }
234 obj.pushKV("id", stats.nodeid);
235 obj.pushKV("addr", stats.m_addr_name);
236 if (stats.addrBind.IsValid()) {
237 obj.pushKV("addrbind", stats.addrBind.ToStringAddrPort());
238 }
239 if (!(stats.addrLocal.empty())) {
240 obj.pushKV("addrlocal", stats.addrLocal);
241 }
242 obj.pushKV("network", GetNetworkName(stats.m_network));
243 if (stats.m_mapped_as != 0) {
244 obj.pushKV("mapped_as", stats.m_mapped_as);
245 }
246 ServiceFlags services{statestats.their_services};
247 obj.pushKV("services", strprintf("%016x", services));
248 obj.pushKV("servicesnames", GetServicesNames(services));
249 obj.pushKV("relaytxes", statestats.m_relay_txs);
250 obj.pushKV("last_inv_sequence", statestats.m_last_inv_seq);
251 obj.pushKV("inv_to_send", statestats.m_inv_to_send);
252 obj.pushKV("lastsend", TicksSinceEpoch<std::chrono::seconds>(stats.m_last_send));
253 obj.pushKV("lastrecv", TicksSinceEpoch<std::chrono::seconds>(stats.m_last_recv));
254 obj.pushKV("last_transaction", count_seconds(stats.m_last_tx_time));
255 obj.pushKV("last_block", count_seconds(stats.m_last_block_time));
256 obj.pushKV("bytessent", stats.nSendBytes);
257 obj.pushKV("bytesrecv", stats.nRecvBytes);
258 obj.pushKV("conntime", TicksSinceEpoch<std::chrono::seconds>(stats.m_connected));
259 obj.pushKV("timeoffset", Ticks<std::chrono::seconds>(statestats.time_offset));
260 if (stats.m_last_ping_time > 0us) {
261 obj.pushKV("pingtime", Ticks<SecondsDouble>(stats.m_last_ping_time));
262 }
263 if (stats.m_min_ping_time < decltype(CNode::m_min_ping_time.load())::max()) {
264 obj.pushKV("minping", Ticks<SecondsDouble>(stats.m_min_ping_time));
265 }
266 if (statestats.m_ping_wait > 0s) {
267 obj.pushKV("pingwait", Ticks<SecondsDouble>(statestats.m_ping_wait));
268 }
269 obj.pushKV("version", stats.nVersion);
270 // Use the sanitized form of subver here, to avoid tricksy remote peers from
271 // corrupting or modifying the JSON output by putting special characters in
272 // their ver message.
273 obj.pushKV("subver", stats.cleanSubVer);
274 obj.pushKV("inbound", stats.fInbound);
275 obj.pushKV("bip152_hb_to", stats.m_bip152_highbandwidth_to);
276 obj.pushKV("bip152_hb_from", stats.m_bip152_highbandwidth_from);
277 obj.pushKV("presynced_headers", statestats.presync_height);
278 obj.pushKV("synced_headers", statestats.nSyncHeight);
279 obj.pushKV("synced_blocks", statestats.nCommonHeight);
280 UniValue heights(UniValue::VARR);
281 for (const int height : statestats.vHeightInFlight) {
282 heights.push_back(height);
283 }
284 obj.pushKV("inflight", std::move(heights));
285 obj.pushKV("addr_relay_enabled", statestats.m_addr_relay_enabled);
286 obj.pushKV("addr_processed", statestats.m_addr_processed);
287 obj.pushKV("addr_rate_limited", statestats.m_addr_rate_limited);
288 UniValue permissions(UniValue::VARR);
289 for (const auto& permission : NetPermissions::ToStrings(stats.m_permission_flags)) {
290 permissions.push_back(permission);
291 }
292 obj.pushKV("permissions", std::move(permissions));
293 obj.pushKV("minfeefilter", ValueFromAmount(statestats.m_fee_filter_received));
294
295 UniValue sendPerMsgType(UniValue::VOBJ);
296 for (const auto& i : stats.mapSendBytesPerMsgType) {
297 if (i.second > 0)
298 sendPerMsgType.pushKV(i.first, i.second);
299 }
300 obj.pushKV("bytessent_per_msg", std::move(sendPerMsgType));
301
302 UniValue recvPerMsgType(UniValue::VOBJ);
303 for (const auto& i : stats.mapRecvBytesPerMsgType) {
304 if (i.second > 0)
305 recvPerMsgType.pushKV(i.first, i.second);
306 }
307 obj.pushKV("bytesrecv_per_msg", std::move(recvPerMsgType));
308 obj.pushKV("connection_type", ConnectionTypeAsString(stats.m_conn_type));
309 obj.pushKV("transport_protocol_type", TransportTypeAsString(stats.m_transport_type));
310 obj.pushKV("session_id", stats.m_session_id);
311
312 ret.push_back(std::move(obj));
313 }
314
315 return ret;
316},
317 };
318}
319
321{
322 return RPCMethod{
323 "addnode",
324 "Attempts to add or remove a node from the addnode list.\n"
325 "Or try a connection to a node once.\n"
326 "Nodes added using addnode (or -connect) are protected from DoS disconnection and are not required to be\n"
327 "full nodes/support SegWit as other outbound peers are (though such peers will not be synced from).\n" +
328 strprintf("Addnode connections are limited to %u at a time", MAX_ADDNODE_CONNECTIONS) +
329 " and are counted separately from the -maxconnections limit.\n",
330 {
331 {"node", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address/hostname optionally followed by :port of the peer to connect to"},
332 {"command", RPCArg::Type::STR, RPCArg::Optional::NO, "'add' to add a node to the list, 'remove' to remove a node from the list, 'onetry' to try a connection to the node once"},
333 {"v2transport", RPCArg::Type::BOOL, RPCArg::DefaultHint{"set by -v2transport"}, "Attempt to connect using BIP324 v2 transport protocol (ignored for 'remove' command)"},
334 },
337 HelpExampleCli("addnode", "\"192.168.0.6:8333\" \"onetry\" true")
338 + HelpExampleRpc("addnode", "\"192.168.0.6:8333\", \"onetry\" true")
339 },
340 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
341{
342 const auto command{self.Arg<std::string_view>("command")};
343 if (command != "onetry" && command != "add" && command != "remove") {
344 throw std::runtime_error(
345 self.ToString());
346 }
347
348 NodeContext& node = EnsureAnyNodeContext(request.context);
349 CConnman& connman = EnsureConnman(node);
350
351 const auto node_arg{self.Arg<std::string_view>("node")};
352 if (TrimStringView(node_arg).empty()) {
353 // Such a node would never resolve, but would be retried indefinitely.
354 throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: Node address cannot be empty");
355 }
356
357 bool node_v2transport = connman.GetLocalServices() & NODE_P2P_V2;
358 bool use_v2transport = self.MaybeArg<bool>("v2transport").value_or(node_v2transport);
359
360 if (use_v2transport && !node_v2transport) {
361 throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: v2transport requested but not enabled (see -v2transport)");
362 }
363
364 if (command == "onetry")
365 {
366 CAddress addr;
367 connman.OpenNetworkConnection(/*addrConnect=*/addr,
368 /*fCountFailure=*/false,
369 /*grant_outbound=*/{},
370 /*pszDest=*/std::string{node_arg}.c_str(),
371 /*conn_type=*/ConnectionType::MANUAL,
372 /*use_v2transport=*/use_v2transport,
373 /*proxy_override=*/std::nullopt);
374 return UniValue::VNULL;
375 }
376
377 if (command == "add")
378 {
379 if (!connman.AddNode({std::string{node_arg}, use_v2transport})) {
380 throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Node already added");
381 }
382 }
383 else if (command == "remove")
384 {
385 if (!connman.RemoveAddedNode(node_arg)) {
386 throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node could not be removed. It has not been added previously.");
387 }
388 }
389
390 return UniValue::VNULL;
391},
392 };
393}
394
396{
397 return RPCMethod{
398 "addconnection",
399 "Open an outbound connection to a specified node. This RPC is for testing only.\n",
400 {
401 {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address and port to attempt connecting to."},
402 {"connection_type", RPCArg::Type::STR, RPCArg::Optional::NO, "Type of connection to open (\"outbound-full-relay\", \"block-relay-only\", \"addr-fetch\" or \"feeler\")."},
403 {"v2transport", RPCArg::Type::BOOL, RPCArg::Optional::NO, "Attempt to connect using BIP324 v2 transport protocol"},
404 },
405 RPCResult{
406 RPCResult::Type::OBJ, "", "",
407 {
408 { RPCResult::Type::STR, "address", "Address of newly added connection." },
409 { RPCResult::Type::STR, "connection_type", "Type of connection opened." },
410 }},
412 HelpExampleCli("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\" true")
413 + HelpExampleRpc("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\" true")
414 },
415 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
416{
418 throw std::runtime_error("addconnection is for regression testing (-regtest mode) only.");
419 }
420
421 const std::string address = request.params[0].get_str();
422 auto conn_type_in{util::TrimStringView(self.Arg<std::string_view>("connection_type"))};
423 ConnectionType conn_type{};
424 if (conn_type_in == "outbound-full-relay") {
426 } else if (conn_type_in == "block-relay-only") {
427 conn_type = ConnectionType::BLOCK_RELAY;
428 } else if (conn_type_in == "addr-fetch") {
429 conn_type = ConnectionType::ADDR_FETCH;
430 } else if (conn_type_in == "feeler") {
431 conn_type = ConnectionType::FEELER;
432 } else {
434 }
435 bool use_v2transport{self.Arg<bool>("v2transport")};
436
437 NodeContext& node = EnsureAnyNodeContext(request.context);
438 CConnman& connman = EnsureConnman(node);
439
440 if (use_v2transport && !(connman.GetLocalServices() & NODE_P2P_V2)) {
441 throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: Adding v2transport connections requires -v2transport init flag to be set.");
442 }
443
444 const bool success = connman.AddConnection(address, conn_type, use_v2transport);
445 if (!success) {
446 throw JSONRPCError(RPC_CLIENT_NODE_CAPACITY_REACHED, "Error: Already at capacity for specified connection type.");
447 }
448
450 info.pushKV("address", address);
451 info.pushKV("connection_type", conn_type_in);
452
453 return info;
454},
455 };
456}
457
459{
460 return RPCMethod{
461 "disconnectnode",
462 "Immediately disconnects from the specified peer node.\n"
463 "\nStrictly one out of 'address' and 'nodeid' can be provided to identify the node.\n"
464 "\nTo disconnect by nodeid, either set 'address' to the empty string, or call using the named 'nodeid' argument only.\n",
465 {
466 {"address", RPCArg::Type::STR, RPCArg::DefaultHint{"fallback to nodeid"}, "The IP address/port of the node"},
467 {"nodeid", RPCArg::Type::NUM, RPCArg::DefaultHint{"fallback to address"}, "The node ID (see getpeerinfo for node IDs)"},
468 },
471 HelpExampleCli("disconnectnode", "\"192.168.0.6:8333\"")
472 + HelpExampleCli("disconnectnode", "\"\" 1")
473 + HelpExampleRpc("disconnectnode", "\"192.168.0.6:8333\"")
474 + HelpExampleRpc("disconnectnode", "\"\", 1")
475 },
476 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
477{
478 NodeContext& node = EnsureAnyNodeContext(request.context);
479 CConnman& connman = EnsureConnman(node);
480
481 bool success;
482 auto address{self.MaybeArg<std::string_view>("address")};
483 auto node_id{self.MaybeArg<int64_t>("nodeid")};
484
485 if (address && !node_id) {
486 /* handle disconnect-by-address */
487 success = connman.DisconnectNode(*address);
488 } else if (node_id && (!address || address->empty())) {
489 /* handle disconnect-by-id */
490 success = connman.DisconnectNode(*node_id);
491 } else {
492 throw JSONRPCError(RPC_INVALID_PARAMS, "Only one of address and nodeid should be provided.");
493 }
494
495 if (!success) {
496 throw JSONRPCError(RPC_CLIENT_NODE_NOT_CONNECTED, "Node not found in connected nodes");
497 }
498
499 return UniValue::VNULL;
500},
501 };
502}
503
505{
506 return RPCMethod{
507 "getaddednodeinfo",
508 "Returns information about the given added node, or all added nodes\n"
509 "(note that onetry addnodes are not listed here)\n",
510 {
511 {"node", RPCArg::Type::STR, RPCArg::DefaultHint{"all nodes"}, "If provided, return information about this specific node, otherwise all nodes are returned."},
512 },
513 RPCResult{
514 RPCResult::Type::ARR, "", "",
515 {
516 {RPCResult::Type::OBJ, "", "",
517 {
518 {RPCResult::Type::STR, "addednode", "The node IP address or name (as provided to addnode)"},
519 {RPCResult::Type::BOOL, "connected", "If connected"},
520 {RPCResult::Type::ARR, "addresses", "Only when connected = true",
521 {
522 {RPCResult::Type::OBJ, "", "",
523 {
524 {RPCResult::Type::STR, "address", "The bitcoin server IP and port we're connected to"},
525 {RPCResult::Type::STR, "connected", "connection, inbound or outbound"},
526 }},
527 }},
528 }},
529 }
530 },
532 HelpExampleCli("getaddednodeinfo", "\"192.168.0.201\"")
533 + HelpExampleRpc("getaddednodeinfo", "\"192.168.0.201\"")
534 },
535 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
536{
537 NodeContext& node = EnsureAnyNodeContext(request.context);
538 const CConnman& connman = EnsureConnman(node);
539
540 std::vector<AddedNodeInfo> vInfo = connman.GetAddedNodeInfo(/*include_connected=*/true);
541
542 if (auto node{self.MaybeArg<std::string_view>("node")}) {
543 bool found = false;
544 for (const AddedNodeInfo& info : vInfo) {
545 if (info.m_params.m_added_node == *node) {
546 vInfo.assign(1, info);
547 found = true;
548 break;
549 }
550 }
551 if (!found) {
552 throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node has not been added.");
553 }
554 }
555
557
558 for (const AddedNodeInfo& info : vInfo) {
560 obj.pushKV("addednode", info.m_params.m_added_node);
561 obj.pushKV("connected", info.fConnected);
562 UniValue addresses(UniValue::VARR);
563 if (info.fConnected) {
564 UniValue address(UniValue::VOBJ);
565 address.pushKV("address", info.resolvedAddress.ToStringAddrPort());
566 address.pushKV("connected", info.fInbound ? "inbound" : "outbound");
567 addresses.push_back(std::move(address));
568 }
569 obj.pushKV("addresses", std::move(addresses));
570 ret.push_back(std::move(obj));
571 }
572
573 return ret;
574},
575 };
576}
577
579{
580 return RPCMethod{"getnettotals",
581 "Returns information about network traffic, including bytes in, bytes out,\n"
582 "and current system time.",
583 {},
584 RPCResult{
585 RPCResult::Type::OBJ, "", "",
586 {
587 {RPCResult::Type::NUM, "totalbytesrecv", "Total bytes received"},
588 {RPCResult::Type::NUM, "totalbytessent", "Total bytes sent"},
589 {RPCResult::Type::NUM_TIME, "timemillis", "Current system " + UNIX_EPOCH_TIME + " in milliseconds"},
590 {RPCResult::Type::OBJ, "uploadtarget", "",
591 {
592 {RPCResult::Type::NUM, "timeframe", "Length of the measuring timeframe in seconds"},
593 {RPCResult::Type::NUM, "target", "Target in bytes"},
594 {RPCResult::Type::BOOL, "target_reached", "True if target is reached"},
595 {RPCResult::Type::BOOL, "serve_historical_blocks", "True if serving historical blocks"},
596 {RPCResult::Type::NUM, "bytes_left_in_cycle", "Bytes left in current time cycle"},
597 {RPCResult::Type::NUM, "time_left_in_cycle", "Seconds left in current time cycle"},
598 }},
599 }
600 },
602 HelpExampleCli("getnettotals", "")
603 + HelpExampleRpc("getnettotals", "")
604 },
605 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
606{
607 NodeContext& node = EnsureAnyNodeContext(request.context);
608 const CConnman& connman = EnsureConnman(node);
609
611 obj.pushKV("totalbytesrecv", connman.GetTotalBytesRecv());
612 obj.pushKV("totalbytessent", connman.GetTotalBytesSent());
613 obj.pushKV("timemillis", TicksSinceEpoch<std::chrono::milliseconds>(SystemClock::now()));
614
615 UniValue outboundLimit(UniValue::VOBJ);
616 outboundLimit.pushKV("timeframe", count_seconds(connman.GetMaxOutboundTimeframe()));
617 outboundLimit.pushKV("target", connman.GetMaxOutboundTarget());
618 outboundLimit.pushKV("target_reached", connman.OutboundTargetReached(false));
619 outboundLimit.pushKV("serve_historical_blocks", !connman.OutboundTargetReached(true));
620 outboundLimit.pushKV("bytes_left_in_cycle", connman.GetOutboundTargetBytesLeft());
621 outboundLimit.pushKV("time_left_in_cycle", count_seconds(connman.GetMaxOutboundTimeLeftInCycle()));
622 obj.pushKV("uploadtarget", std::move(outboundLimit));
623 return obj;
624},
625 };
626}
627
629{
630 UniValue networks(UniValue::VARR);
631 for (int n = 0; n < NET_MAX; ++n) {
632 enum Network network = static_cast<enum Network>(n);
633 if (network == NET_UNROUTABLE || network == NET_INTERNAL) continue;
635 obj.pushKV("name", GetNetworkName(network));
636 obj.pushKV("limited", !g_reachable_nets.Contains(network));
637 obj.pushKV("reachable", g_reachable_nets.Contains(network));
638 if (const auto proxy = GetProxy(network)) {
639 obj.pushKV("proxy", proxy->ToString());
640 obj.pushKV("proxy_randomize_credentials", proxy->m_tor_stream_isolation);
641 } else {
642 obj.pushKV("proxy", std::string());
643 obj.pushKV("proxy_randomize_credentials", false);
644 }
645 networks.push_back(std::move(obj));
646 }
647 return networks;
648}
649
651{
652 return RPCMethod{"getnetworkinfo",
653 "Returns an object containing various state info regarding P2P networking.\n",
654 {},
655 RPCResult{
656 RPCResult::Type::OBJ, "", "",
657 {
658 {RPCResult::Type::NUM, "version", "the server version"},
659 {RPCResult::Type::STR, "subversion", "the server subversion string"},
660 {RPCResult::Type::NUM, "protocolversion", "the protocol version"},
661 {RPCResult::Type::STR_HEX, "localservices", "the services we offer to the network"},
662 {RPCResult::Type::ARR, "localservicesnames", "the services we offer to the network, in human-readable form",
663 {
664 {RPCResult::Type::STR, "SERVICE_NAME", "the service name"},
665 }},
666 {RPCResult::Type::BOOL, "localrelay", "true if transaction relay is requested from peers"},
667 {RPCResult::Type::NUM, "timeoffset", "the time offset"},
668 {RPCResult::Type::NUM, "tx_send_rate", "configured target for maximum number of transactions per second to send to inbound peers"},
669 {RPCResult::Type::OBJ_DYN, "inv_buckets", "", {
670 {RPCResult::Type::OBJ, "inbound/outbound", "connection direction",
671 {
672 {RPCResult::Type::NUM, "backlog", "number of queued txs to announce"},
673 {RPCResult::Type::NUM, "count_tok", "tokens available to be consumed per-transaction"},
674 {RPCResult::Type::NUM, "size_tok", "tokens available to be consumed per-byte"},
675 }
676 }
677 }},
678 {RPCResult::Type::NUM, "connections", "the total number of connections"},
679 {RPCResult::Type::NUM, "connections_in", "the number of inbound connections"},
680 {RPCResult::Type::NUM, "connections_out", "the number of outbound connections"},
681 {RPCResult::Type::BOOL, "networkactive", "whether p2p networking is enabled"},
682 {RPCResult::Type::ARR, "networks", "information per network",
683 {
684 {RPCResult::Type::OBJ, "", "",
685 {
686 {RPCResult::Type::STR, "name", "network (" + Join(GetNetworkNames(), ", ") + ")"},
687 {RPCResult::Type::BOOL, "limited", "is the network limited using -onlynet?"},
688 {RPCResult::Type::BOOL, "reachable", "is the network reachable?"},
689 {RPCResult::Type::STR, "proxy", "(\"host:port\") the proxy that is used for this network, or empty if none"},
690 {RPCResult::Type::BOOL, "proxy_randomize_credentials", "Whether randomized credentials are used"},
691 }},
692 }},
693 {RPCResult::Type::NUM, "relayfee", "minimum relay fee rate for transactions in " + CURRENCY_UNIT + "/kvB"},
694 {RPCResult::Type::NUM, "incrementalfee", "minimum fee rate increment for mempool limiting or replacement in " + CURRENCY_UNIT + "/kvB"},
695 {RPCResult::Type::ARR, "localaddresses", "list of local addresses",
696 {
697 {RPCResult::Type::OBJ, "", "",
698 {
699 {RPCResult::Type::STR, "address", "network address"},
700 {RPCResult::Type::NUM, "port", "network port"},
701 {RPCResult::Type::NUM, "score", "relative score"},
702 }},
703 }},
704 (IsDeprecatedRPCEnabled("warnings") ?
705 RPCResult{RPCResult::Type::STR, "warnings", "any network and blockchain warnings (DEPRECATED)"} :
706 RPCResult{RPCResult::Type::ARR, "warnings", "any network and blockchain warnings (run with `-deprecatedrpc=warnings` to return the latest warning as a single string)",
707 {
708 {RPCResult::Type::STR, "", "warning"},
709 }
710 }
711 ),
712 }
713 },
715 HelpExampleCli("getnetworkinfo", "")
716 + HelpExampleRpc("getnetworkinfo", "")
717 },
718 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
719{
720 LOCK(cs_main);
722 obj.pushKV("version", CLIENT_VERSION);
723 obj.pushKV("subversion", strSubVersion);
724 obj.pushKV("protocolversion",PROTOCOL_VERSION);
725 NodeContext& node = EnsureAnyNodeContext(request.context);
726 if (node.connman) {
727 ServiceFlags services = node.connman->GetLocalServices();
728 obj.pushKV("localservices", strprintf("%016x", services));
729 obj.pushKV("localservicesnames", GetServicesNames(services));
730 }
731 if (node.peerman) {
732 auto peerman_info{node.peerman->GetInfo()};
733 obj.pushKV("localrelay", !peerman_info.ignores_incoming_txs);
734 obj.pushKV("timeoffset", Ticks<std::chrono::seconds>(peerman_info.median_outbound_time_offset));
735 obj.pushKV("tx_send_rate", peerman_info.tx_send_rate);
736 auto buckjson = [&](const auto& buckinfo) {
738 b.pushKV("backlog", buckinfo.backlog_count);
739 b.pushKV("count_tok", buckinfo.count_bucket);
740 b.pushKV("size_tok", buckinfo.size_bucket);
741 return b;
742 };
743 UniValue invbuckets{UniValue::VOBJ};
744 invbuckets.pushKV("inbound", buckjson(peerman_info.inbound_bucket));
745 invbuckets.pushKV("outbound", buckjson(peerman_info.outbound_bucket));
746 obj.pushKV("inv_buckets", invbuckets);
747 }
748 if (node.connman) {
749 obj.pushKV("networkactive", node.connman->GetNetworkActive());
750 obj.pushKV("connections", node.connman->GetNodeCount(ConnectionDirection::Both));
751 obj.pushKV("connections_in", node.connman->GetNodeCount(ConnectionDirection::In));
752 obj.pushKV("connections_out", node.connman->GetNodeCount(ConnectionDirection::Out));
753 }
754 obj.pushKV("networks", GetNetworksInfo());
755 if (node.mempool) {
756 // Those fields can be deprecated, to be replaced by the getmempoolinfo fields
757 obj.pushKV("relayfee", ValueFromAmount(node.mempool->m_opts.min_relay_feerate.GetFeePerK()));
758 obj.pushKV("incrementalfee", ValueFromAmount(node.mempool->m_opts.incremental_relay_feerate.GetFeePerK()));
759 }
760 UniValue localAddresses(UniValue::VARR);
761 {
763 for (const std::pair<const CNetAddr, LocalServiceInfo> &item : mapLocalHost)
764 {
766 rec.pushKV("address", item.first.ToStringAddr());
767 rec.pushKV("port", item.second.nPort);
768 rec.pushKV("score", item.second.nScore);
769 localAddresses.push_back(std::move(rec));
770 }
771 }
772 obj.pushKV("localaddresses", std::move(localAddresses));
773 obj.pushKV("warnings", node::GetWarningsForRpc(*CHECK_NONFATAL(node.warnings), IsDeprecatedRPCEnabled("warnings")));
774 return obj;
775},
776 };
777}
778
780{
781 return RPCMethod{
782 "setban",
783 "Attempts to add or remove an IP/Subnet from the banned list.\n",
784 {
785 {"subnet", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP/Subnet (see getpeerinfo for nodes IP) with an optional netmask (default is /32 = single IP)"},
786 {"command", RPCArg::Type::STR, RPCArg::Optional::NO, "'add' to add an IP/Subnet to the list, 'remove' to remove an IP/Subnet from the list"},
787 {"bantime", RPCArg::Type::NUM, RPCArg::Default{0}, "time in seconds how long (or until when if [absolute] is set) the IP is banned (0 or empty means using the default time of 24h which can also be overwritten by the -bantime startup argument)"},
788 {"absolute", RPCArg::Type::BOOL, RPCArg::Default{false}, "If set, the bantime must be an absolute timestamp expressed in " + UNIX_EPOCH_TIME},
789 },
792 HelpExampleCli("setban", "\"192.168.0.6\" \"add\" 86400")
793 + HelpExampleCli("setban", "\"192.168.0.0/24\" \"add\"")
794 + HelpExampleRpc("setban", "\"192.168.0.6\", \"add\", 86400")
795 },
796 [](const RPCMethod& help, const JSONRPCRequest& request) -> UniValue
797{
798 auto command{help.Arg<std::string_view>("command")};
799 if (command != "add" && command != "remove") {
800 throw std::runtime_error(help.ToString());
801 }
802 NodeContext& node = EnsureAnyNodeContext(request.context);
803 BanMan& banman = EnsureBanman(node);
804
805 CSubNet subNet;
806 CNetAddr netAddr;
807 std::string subnet_arg{help.Arg<std::string_view>("subnet")};
808 const bool isSubnet{subnet_arg.find('/') != subnet_arg.npos};
809
810 if (!isSubnet) {
811 const std::optional<CNetAddr> addr{LookupHost(subnet_arg, false)};
812 if (addr.has_value()) {
813 netAddr = static_cast<CNetAddr>(MaybeFlipIPv6toCJDNS(CService{addr.value(), /*port=*/0}));
814 }
815 } else {
816 subNet = LookupSubNet(subnet_arg);
817 }
818
819 if (! (isSubnet ? subNet.IsValid() : netAddr.IsValid()) ) {
820 throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Error: Invalid IP/Subnet");
821 }
822
823 if (command == "add") {
824 if (isSubnet ? banman.IsBanned(subNet) : banman.IsBanned(netAddr)) {
825 throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned");
826 }
827
828 int64_t banTime = 0; //use standard bantime if not specified
829 if (!request.params[2].isNull())
830 banTime = request.params[2].getInt<int64_t>();
831
832 const bool absolute{request.params[3].isNull() ? false : request.params[3].get_bool()};
833
834 if (absolute && banTime < GetTime()) {
835 throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: Absolute timestamp is in the past");
836 }
837
838 if (isSubnet) {
839 banman.Ban(subNet, banTime, absolute);
840 if (node.connman) {
841 node.connman->DisconnectNode(subNet);
842 }
843 } else {
844 banman.Ban(netAddr, banTime, absolute);
845 if (node.connman) {
846 node.connman->DisconnectNode(netAddr);
847 }
848 }
849 } else if(command == "remove") {
850 if (!( isSubnet ? banman.Unban(subNet) : banman.Unban(netAddr) )) {
851 throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Error: Unban failed. Requested address/subnet was not previously manually banned.");
852 }
853 }
854 return UniValue::VNULL;
855},
856 };
857}
858
860{
861 return RPCMethod{
862 "listbanned",
863 "List all manually banned IPs/Subnets.\n",
864 {},
866 {
867 {RPCResult::Type::OBJ, "", "",
868 {
869 {RPCResult::Type::STR, "address", "The IP/Subnet of the banned node"},
870 {RPCResult::Type::NUM_TIME, "ban_created", "The " + UNIX_EPOCH_TIME + " the ban was created"},
871 {RPCResult::Type::NUM_TIME, "banned_until", "The " + UNIX_EPOCH_TIME + " the ban expires"},
872 {RPCResult::Type::NUM_TIME, "ban_duration", "The ban duration, in seconds"},
873 {RPCResult::Type::NUM_TIME, "time_remaining", "The time remaining until the ban expires, in seconds"},
874 }},
875 }},
877 HelpExampleCli("listbanned", "")
878 + HelpExampleRpc("listbanned", "")
879 },
880 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
881{
882 BanMan& banman = EnsureAnyBanman(request.context);
883
884 banmap_t banMap;
885 banman.GetBanned(banMap);
886 const int64_t current_time{GetTime()};
887
888 UniValue bannedAddresses(UniValue::VARR);
889 for (const auto& entry : banMap)
890 {
891 const CBanEntry& banEntry = entry.second;
893 rec.pushKV("address", entry.first.ToString());
894 rec.pushKV("ban_created", banEntry.nCreateTime);
895 rec.pushKV("banned_until", banEntry.nBanUntil);
896 rec.pushKV("ban_duration", (banEntry.nBanUntil - banEntry.nCreateTime));
897 rec.pushKV("time_remaining", (banEntry.nBanUntil - current_time));
898
899 bannedAddresses.push_back(std::move(rec));
900 }
901
902 return bannedAddresses;
903},
904 };
905}
906
908{
909 return RPCMethod{
910 "clearbanned",
911 "Clear all banned IPs.\n",
912 {},
915 HelpExampleCli("clearbanned", "")
916 + HelpExampleRpc("clearbanned", "")
917 },
918 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
919{
920 BanMan& banman = EnsureAnyBanman(request.context);
921
922 banman.ClearBanned();
923
924 return UniValue::VNULL;
925},
926 };
927}
928
930{
931 return RPCMethod{
932 "setnetworkactive",
933 "Disable/enable all p2p network activity.\n",
934 {
935 {"state", RPCArg::Type::BOOL, RPCArg::Optional::NO, "true to enable networking, false to disable"},
936 },
937 RPCResult{RPCResult::Type::BOOL, "", "The value that was passed in"},
938 RPCExamples{""},
939 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
940{
941 NodeContext& node = EnsureAnyNodeContext(request.context);
942 CConnman& connman = EnsureConnman(node);
943
944 connman.SetNetworkActive(request.params[0].get_bool());
945
946 return connman.GetNetworkActive();
947},
948 };
949}
950
952{
953 return RPCMethod{"getnodeaddresses",
954 "Return known addresses, after filtering for quality and recency.\n"
955 "These can potentially be used to find new peers in the network.\n"
956 "The total number of addresses known to the node may be higher.",
957 {
958 {"count", RPCArg::Type::NUM, RPCArg::Default{1}, "The maximum number of addresses to return. Specify 0 to return all known addresses."},
959 {"network", RPCArg::Type::STR, RPCArg::DefaultHint{"all networks"}, "Return only addresses of the specified network. Can be one of: " + Join(GetNetworkNames(), ", ") + "."},
960 },
961 RPCResult{
962 RPCResult::Type::ARR, "", "",
963 {
964 {RPCResult::Type::OBJ, "", "",
965 {
966 {RPCResult::Type::NUM_TIME, "time", "The " + UNIX_EPOCH_TIME + " when the node was last seen"},
967 {RPCResult::Type::NUM, "services", "The services offered by the node"},
968 {RPCResult::Type::STR, "address", "The address of the node"},
969 {RPCResult::Type::NUM, "port", "The port number of the node"},
970 {RPCResult::Type::STR, "network", "The network (" + Join(GetNetworkNames(), ", ") + ") the node connected through"},
971 }},
972 }
973 },
975 HelpExampleCli("getnodeaddresses", "8")
976 + HelpExampleCli("getnodeaddresses", "4 \"i2p\"")
977 + HelpExampleCli("-named getnodeaddresses", "network=onion count=12")
978 + HelpExampleRpc("getnodeaddresses", "8")
979 + HelpExampleRpc("getnodeaddresses", "4, \"i2p\"")
980 },
981 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
982{
983 NodeContext& node = EnsureAnyNodeContext(request.context);
984 const CConnman& connman = EnsureConnman(node);
985
986 const int count{request.params[0].isNull() ? 1 : request.params[0].getInt<int>()};
987 if (count < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Address count out of range");
988
989 const std::optional<Network> network{request.params[1].isNull() ? std::nullopt : std::optional<Network>{ParseNetwork(request.params[1].get_str())}};
990 if (network == NET_UNROUTABLE) {
991 throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Network not recognized: %s", request.params[1].get_str()));
992 }
993
994 // returns a shuffled list of CAddress
995 const std::vector<CAddress> vAddr{connman.GetAddressesUnsafe(count, /*max_pct=*/0, network)};
997
998 for (const CAddress& addr : vAddr) {
1000 obj.pushKV("time", TicksSinceEpoch<std::chrono::seconds>(addr.nTime));
1001 obj.pushKV("services", static_cast<std::underlying_type_t<decltype(addr.nServices)>>(addr.nServices));
1002 obj.pushKV("address", addr.ToStringAddr());
1003 obj.pushKV("port", addr.GetPort());
1004 obj.pushKV("network", GetNetworkName(addr.GetNetClass()));
1005 ret.push_back(std::move(obj));
1006 }
1007 return ret;
1008},
1009 };
1010}
1011
1013{
1014 return RPCMethod{"addpeeraddress",
1015 "Add the address of a potential peer to an address manager table. This RPC is for testing only.",
1016 {
1017 {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address of the peer"},
1018 {"port", RPCArg::Type::NUM, RPCArg::Optional::NO, "The port of the peer"},
1019 {"tried", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, attempt to add the peer to the tried addresses table"},
1020 },
1021 RPCResult{
1022 RPCResult::Type::OBJ, "", "",
1023 {
1024 {RPCResult::Type::BOOL, "success", "whether the peer address was successfully added to the address manager table"},
1025 {RPCResult::Type::STR, "error", /*optional=*/true, "error description, if the address could not be added"},
1026 },
1027 },
1029 HelpExampleCli("addpeeraddress", "\"1.2.3.4\" 8333 true")
1030 + HelpExampleRpc("addpeeraddress", "\"1.2.3.4\", 8333, true")
1031 },
1032 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
1033{
1034 AddrMan& addrman = EnsureAnyAddrman(request.context);
1035
1036 const std::string& addr_string{request.params[0].get_str()};
1037 const auto port{request.params[1].getInt<uint16_t>()};
1038 const bool tried{request.params[2].isNull() ? false : request.params[2].get_bool()};
1039
1041 std::optional<CNetAddr> net_addr{LookupHost(addr_string, false)};
1042 if (!net_addr.has_value()) {
1043 throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Invalid IP address");
1044 }
1045
1046 bool success{false};
1047
1048 CService service{net_addr.value(), port};
1050 address.nTime = Now<NodeSeconds>();
1051 // The source address is set equal to the address. This is equivalent to the peer
1052 // announcing itself.
1053 if (addrman.Add({address}, address)) {
1054 success = true;
1055 if (tried) {
1056 // Attempt to move the address to the tried addresses table.
1057 if (!addrman.Good(address)) {
1058 success = false;
1059 obj.pushKV("error", "failed-adding-to-tried");
1060 }
1061 }
1062 } else {
1063 obj.pushKV("error", "failed-adding-to-new");
1064 }
1065
1066 obj.pushKV("success", success);
1067 return obj;
1068},
1069 };
1070}
1071
1073{
1074 return RPCMethod{
1075 "sendmsgtopeer",
1076 "Send a p2p message to a peer specified by id.\n"
1077 "The message type and body must be provided, the message header will be generated.\n"
1078 "This RPC is for testing only.",
1079 {
1080 {"peer_id", RPCArg::Type::NUM, RPCArg::Optional::NO, "The peer to send the message to."},
1081 {"msg_type", RPCArg::Type::STR, RPCArg::Optional::NO, strprintf("The message type (maximum length %i)", CMessageHeader::MESSAGE_TYPE_SIZE)},
1082 {"msg", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The serialized message body to send, in hex, without a message header"},
1083 },
1084 RPCResult{RPCResult::Type::OBJ, "", "", std::vector<RPCResult>{}},
1086 HelpExampleCli("sendmsgtopeer", "0 \"addr\" \"ffffff\"") + HelpExampleRpc("sendmsgtopeer", "0 \"addr\" \"ffffff\"")},
1087 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue {
1088 const NodeId peer_id{request.params[0].getInt<int64_t>()};
1089 const auto msg_type{self.Arg<std::string_view>("msg_type")};
1090 if (msg_type.size() > CMessageHeader::MESSAGE_TYPE_SIZE) {
1091 throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Error: msg_type too long, max length is %i", CMessageHeader::MESSAGE_TYPE_SIZE));
1092 }
1093 auto msg{TryParseHex<unsigned char>(self.Arg<std::string_view>("msg"))};
1094 if (!msg.has_value()) {
1095 throw JSONRPCError(RPC_INVALID_PARAMETER, "Error parsing input for msg");
1096 }
1097
1098 NodeContext& node = EnsureAnyNodeContext(request.context);
1099 CConnman& connman = EnsureConnman(node);
1100
1101 CSerializedNetMsg msg_ser;
1102 msg_ser.data = msg.value();
1103 msg_ser.m_type = msg_type;
1104
1105 bool success = connman.ForNode(peer_id, [&](CNode* node) {
1106 connman.PushMessage(node, std::move(msg_ser));
1107 return true;
1108 });
1109
1110 if (!success) {
1111 throw JSONRPCError(RPC_MISC_ERROR, "Error: Could not send message to peer");
1112 }
1113
1115 return ret;
1116 },
1117 };
1118}
1119
1121{
1122 return RPCMethod{
1123 "getaddrmaninfo",
1124 "Provides information about the node's address manager by returning the number of "
1125 "addresses in the `new` and `tried` tables and their sum for all networks.\n",
1126 {},
1127 RPCResult{
1128 RPCResult::Type::OBJ_DYN, "", "json object with network type as keys", {
1129 {RPCResult::Type::OBJ, "network", "the network (" + Join(GetNetworkNames(), ", ") + ", all_networks)", {
1130 {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."},
1131 {RPCResult::Type::NUM, "tried", "number of addresses in the tried table, which represent peers the node has successfully connected to in the past."},
1132 {RPCResult::Type::NUM, "total", "total number of addresses in both new/tried tables"},
1133 }},
1134 }},
1135 RPCExamples{HelpExampleCli("getaddrmaninfo", "") + HelpExampleRpc("getaddrmaninfo", "")},
1136 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue {
1137 AddrMan& addrman = EnsureAnyAddrman(request.context);
1138
1140 for (int n = 0; n < NET_MAX; ++n) {
1141 enum Network network = static_cast<enum Network>(n);
1142 if (network == NET_UNROUTABLE || network == NET_INTERNAL) continue;
1144 obj.pushKV("new", addrman.Size(network, true));
1145 obj.pushKV("tried", addrman.Size(network, false));
1146 obj.pushKV("total", addrman.Size(network));
1147 ret.pushKV(GetNetworkName(network), std::move(obj));
1148 }
1150 obj.pushKV("new", addrman.Size(std::nullopt, true));
1151 obj.pushKV("tried", addrman.Size(std::nullopt, false));
1152 obj.pushKV("total", addrman.Size());
1153 ret.pushKV("all_networks", std::move(obj));
1154 return ret;
1155 },
1156 };
1157}
1158
1160{
1161 return RPCMethod{
1162 "exportasmap",
1163 "Export the embedded ASMap data to a file. Any existing file at the path will be overwritten.\n",
1164 {
1165 {"path", RPCArg::Type::STR, RPCArg::Optional::NO, "Path to the output file. If relative, will be prefixed by datadir."},
1166 },
1167 RPCResult{
1168 RPCResult::Type::OBJ, "", "",
1169 {
1170 {RPCResult::Type::STR, "path", "the absolute path that the ASMap data was written to"},
1171 {RPCResult::Type::NUM, "bytes_written", "the number of bytes written to the file"},
1172 {RPCResult::Type::STR_HEX, "file_hash", "the SHA256 hash of the exported ASMap data"},
1173 }
1174 },
1176 HelpExampleCli("exportasmap", "\"asmap.dat\"") + HelpExampleRpc("exportasmap", "\"asmap.dat\"")},
1177 [&](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue {
1178#ifndef ENABLE_EMBEDDED_ASMAP
1179 throw JSONRPCError(RPC_MISC_ERROR, "No embedded ASMap data available");
1180#else
1181 if (node::data::ip_asn.empty() || !CheckStandardAsmap(node::data::ip_asn)) {
1182 throw JSONRPCError(RPC_MISC_ERROR, "Embedded ASMap data appears to be corrupted");
1183 }
1184
1185 const ArgsManager& args{EnsureAnyArgsman(request.context)};
1186 const fs::path export_path{fsbridge::AbsPathJoin(args.GetDataDirNet(), fs::u8path(self.Arg<std::string_view>("path")))};
1187
1188 AutoFile file{fsbridge::fopen(export_path, "wb")};
1189 if (file.IsNull()) {
1190 throw JSONRPCError(RPC_MISC_ERROR, strprintf("Failed to open asmap file: %s", fs::PathToString(export_path)));
1191 }
1192
1193 file << node::data::ip_asn;
1194
1195 if (file.fclose() != 0) {
1196 throw JSONRPCError(RPC_MISC_ERROR, strprintf("Failed to close asmap file: %s", fs::PathToString(export_path)));
1197 }
1198
1199 HashWriter hasher;
1200 hasher.write(node::data::ip_asn);
1201
1202 UniValue result(UniValue::VOBJ);
1203 result.pushKV("path", export_path.utf8string());
1204 result.pushKV("bytes_written", node::data::ip_asn.size());
1205 result.pushKV("file_hash", HexStr(hasher.GetSHA256()));
1206 return result;
1207#endif
1208 },
1209 };
1210}
1211
1212UniValue AddrmanEntryToJSON(const AddrInfo& info, const CConnman& connman)
1213{
1215 ret.pushKV("address", info.ToStringAddr());
1216 const uint32_t mapped_as{connman.GetMappedAS(info)};
1217 if (mapped_as) {
1218 ret.pushKV("mapped_as", mapped_as);
1219 }
1220 ret.pushKV("port", info.GetPort());
1221 ret.pushKV("services", static_cast<std::underlying_type_t<decltype(info.nServices)>>(info.nServices));
1222 ret.pushKV("time", TicksSinceEpoch<std::chrono::seconds>(info.nTime));
1223 ret.pushKV("network", GetNetworkName(info.GetNetClass()));
1224 ret.pushKV("source", info.source.ToStringAddr());
1225 ret.pushKV("source_network", GetNetworkName(info.source.GetNetClass()));
1226 const uint32_t source_mapped_as{connman.GetMappedAS(info.source)};
1227 if (source_mapped_as) {
1228 ret.pushKV("source_mapped_as", source_mapped_as);
1229 }
1230 return ret;
1231}
1232
1233UniValue AddrmanTableToJSON(const std::vector<std::pair<AddrInfo, AddressPosition>>& tableInfos, const CConnman& connman)
1234{
1235 UniValue table(UniValue::VOBJ);
1236 for (const auto& e : tableInfos) {
1237 AddrInfo info = e.first;
1238 AddressPosition location = e.second;
1239 std::ostringstream key;
1240 key << location.bucket << "/" << location.position;
1241 // Address manager tables have unique entries so there is no advantage
1242 // in using UniValue::pushKV, which checks if the key already exists
1243 // in O(N). UniValue::pushKVEnd is used instead which currently is O(1).
1244 table.pushKVEnd(key.str(), AddrmanEntryToJSON(info, connman));
1245 }
1246 return table;
1247}
1248
1250{
1251 return RPCMethod{"getrawaddrman",
1252 "EXPERIMENTAL warning: this call may be changed in future releases.\n"
1253 "\nReturns information on all address manager entries for the new and tried tables.\n",
1254 {},
1255 RPCResult{
1256 RPCResult::Type::OBJ_DYN, "", "", {
1257 {RPCResult::Type::OBJ_DYN, "table", "buckets with addresses in the address manager table ( new, tried )", {
1258 {RPCResult::Type::OBJ, "bucket/position", "the location in the address manager table (<bucket>/<position>)", {
1259 {RPCResult::Type::STR, "address", "The address of the node"},
1260 {RPCResult::Type::NUM, "mapped_as", /*optional=*/true, "Mapped AS (Autonomous System) number at the end of the BGP route to the peer, used for diversifying peer selection (only displayed if the -asmap config option is set)"},
1261 {RPCResult::Type::NUM, "port", "The port number of the node"},
1262 {RPCResult::Type::STR, "network", "The network (" + Join(GetNetworkNames(), ", ") + ") of the address"},
1263 {RPCResult::Type::NUM, "services", "The services offered by the node"},
1264 {RPCResult::Type::NUM_TIME, "time", "The " + UNIX_EPOCH_TIME + " when the node was last seen"},
1265 {RPCResult::Type::STR, "source", "The address that relayed the address to us"},
1266 {RPCResult::Type::STR, "source_network", "The network (" + Join(GetNetworkNames(), ", ") + ") of the source address"},
1267 {RPCResult::Type::NUM, "source_mapped_as", /*optional=*/true, "Mapped AS (Autonomous System) number at the end of the BGP route to the source, used for diversifying peer selection (only displayed if the -asmap config option is set)"}
1268 }}
1269 }}
1270 }
1271 },
1273 HelpExampleCli("getrawaddrman", "")
1274 + HelpExampleRpc("getrawaddrman", "")
1275 },
1276 [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue {
1277 AddrMan& addrman = EnsureAnyAddrman(request.context);
1278 NodeContext& node_context = EnsureAnyNodeContext(request.context);
1279 CConnman& connman = EnsureConnman(node_context);
1280
1282 ret.pushKV("new", AddrmanTableToJSON(addrman.GetEntries(false), connman));
1283 ret.pushKV("tried", AddrmanTableToJSON(addrman.GetEntries(true), connman));
1284 return ret;
1285 },
1286 };
1287}
1288
1290{
1291 static const CRPCCommand commands[]{
1292 {"network", &getconnectioncount},
1293 {"network", &ping},
1294 {"network", &getpeerinfo},
1295 {"network", &addnode},
1296 {"network", &disconnectnode},
1297 {"network", &getaddednodeinfo},
1298 {"network", &getnettotals},
1299 {"network", &getnetworkinfo},
1300 {"network", &setban},
1301 {"network", &listbanned},
1302 {"network", &clearbanned},
1303 {"network", &setnetworkactive},
1304 {"network", &getnodeaddresses},
1305 {"network", &getaddrmaninfo},
1306 {"network", &exportasmap},
1307 {"hidden", &addconnection},
1308 {"hidden", &addpeeraddress},
1309 {"hidden", &sendmsgtopeer},
1310 {"hidden", &getrawaddrman},
1311 };
1312 for (const auto& c : commands) {
1313 t.appendCommand(c.name, &c);
1314 }
1315}
int ret
const auto command
ArgsManager & args
Definition: bitcoind.cpp:280
const CChainParams & Params()
Return the currently selected parameters.
#define CHECK_NONFATAL(condition)
Identity function.
Definition: check.h:112
Extended statistics about a CAddress.
Definition: addrman_impl.h:46
CNetAddr source
where knowledge about this address first came from
Definition: addrman_impl.h:55
Stochastic address manager.
Definition: addrman.h:110
size_t Size(std::optional< Network > net=std::nullopt, std::optional< bool > in_new=std::nullopt) const
Return size information about addrman.
Definition: addrman.cpp:1279
std::vector< std::pair< AddrInfo, AddressPosition > > GetEntries(bool from_tried) const
Returns an information-location pair for all addresses in the selected addrman table.
Definition: addrman.cpp:1319
bool Good(const CService &addr, NodeSeconds time=Now< NodeSeconds >())
Mark an address record as accessible and attempt to move it to addrman's tried table.
Definition: addrman.cpp:1289
bool Add(const std::vector< CAddress > &vAddr, const CNetAddr &source, std::chrono::seconds time_penalty=0s)
Attempt to add one or more addresses to addrman's new table.
Definition: addrman.cpp:1284
fs::path GetDataDirNet() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get data directory path with appended network identifier.
Definition: args.cpp:330
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:395
Definition: banman.h:64
void Ban(const CNetAddr &net_addr, int64_t ban_time_offset=0, bool since_unix_epoch=false) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition: banman.cpp:118
bool IsBanned(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Return whether net_addr is banned.
Definition: banman.cpp:89
void GetBanned(banmap_t &banmap) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition: banman.cpp:174
void ClearBanned() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition: banman.cpp:72
bool Unban(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition: banman.cpp:156
A CService with information about it as peer.
Definition: protocol.h:387
ServiceFlags nServices
Serialized as uint64_t in V1, and as CompactSize in V2.
Definition: protocol.h:479
NodeSeconds nTime
Always included in serialization. The behavior is unspecified if the value is not representable as ui...
Definition: protocol.h:477
Definition: net_types.h:15
int64_t nCreateTime
Definition: net_types.h:19
int64_t nBanUntil
Definition: net_types.h:20
ChainType GetChainType() const
Return the chain type.
Definition: chainparams.h:111
Definition: net.h:1085
bool GetNetworkActive() const
Definition: net.h:1183
bool OutboundTargetReached(bool historicalBlockServingLimit) const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
check if the outbound target is reached if param historicalBlockServingLimit is set true,...
Definition: net.cpp:4015
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3981
bool AddConnection(const std::string &address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Attempts to open a connection.
Definition: net.cpp:1893
std::chrono::seconds GetMaxOutboundTimeframe() const
Definition: net.cpp:3988
ServiceFlags GetLocalServices() const
Used to convey which local services we are offering peers during node connection.
Definition: net.cpp:4058
bool AddNode(const AddedNodeParams &add) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3832
std::vector< AddedNodeInfo > GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:2990
uint32_t GetMappedAS(const CNetAddr &addr) const
Definition: net.cpp:3892
uint64_t GetTotalBytesRecv() const
Definition: net.cpp:4046
bool OpenNetworkConnection(const CAddress &addrConnect, bool fCountFailure, CountingSemaphoreGrant<> &&grant_outbound, const char *pszDest, ConnectionType conn_type, bool use_v2transport, const std::optional< Proxy > &proxy_override) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Open a new P2P connection and initialize it with the PeerManager at m_msgproc.
Definition: net.cpp:3090
void SetNetworkActive(bool active)
Definition: net.cpp:3452
std::chrono::seconds GetMaxOutboundTimeLeftInCycle() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3993
void GetNodeStats(std::vector< CNodeStats > &vstats) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3897
bool ForNode(NodeId id, std::function< bool(CNode *pnode)> func) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:4223
std::vector< CAddress > GetAddressesUnsafe(size_t max_addresses, size_t max_pct, std::optional< Network > network, bool filtered=true) const
Return randomly selected addresses.
Definition: net.cpp:3783
bool DisconnectNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3911
uint64_t GetTotalBytesSent() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:4051
size_t GetNodeCount(ConnectionDirection) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3869
uint64_t GetOutboundTargetBytesLeft() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
response the bytes left in the current max outbound cycle in case of no limit, it will always respons...
Definition: net.cpp:4036
void PushMessage(CNode *pnode, CSerializedNetMsg &&msg) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:4163
static constexpr size_t MESSAGE_TYPE_SIZE
Definition: protocol.h:31
Network address.
Definition: netaddress.h:113
Network GetNetClass() const
Definition: netaddress.cpp:674
std::string ToStringAddr() const
Definition: netaddress.cpp:580
bool IsValid() const
Definition: netaddress.cpp:424
Information about a peer.
Definition: net.h:683
std::atomic< NodeClock::duration > m_min_ping_time
Lowest measured round-trip duration.
Definition: net.h:912
RPC command dispatcher.
Definition: server.h:90
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:530
uint16_t GetPort() const
Definition: netaddress.cpp:835
bool IsValid() const
A writer stream (for serialization) that computes a 256-bit hash.
Definition: hash.h:109
uint256 GetSHA256()
Compute the SHA256 hash of all data written to this object.
Definition: hash.h:134
void write(std::span< const std::byte > src)
Definition: hash.h:114
static std::vector< std::string > ToStrings(NetPermissionFlags flags)
virtual void SendPings()=0
Send ping message to all peers.
virtual bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) const =0
Get statistics from node state.
auto MaybeArg(std::string_view key) const
Helper to get an optional request argument.
Definition: util.h:503
std::string ToString() const
Definition: util.cpp:772
auto Arg(std::string_view key) const
Helper to get a required or default-valued request argument.
Definition: util.h:471
bool Contains(Network net) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:134
void push_back(UniValue val)
Definition: univalue.cpp:103
@ VNULL
Definition: univalue.h:24
@ VOBJ
Definition: univalue.h:24
@ VARR
Definition: univalue.h:24
void pushKVEnd(std::string key, UniValue val)
Definition: univalue.cpp:117
Int getInt() const
Definition: univalue.h:140
void pushKV(std::string key, UniValue val)
Definition: univalue.cpp:125
static const int CLIENT_VERSION
Definition: clientversion.h:26
std::string TransportTypeAsString(TransportProtocolType transport_type)
Convert TransportProtocolType enum to a string value.
std::string ConnectionTypeAsString(ConnectionType conn_type)
Convert ConnectionType enum to a string value.
ConnectionType
Different types of connections to a peer.
@ BLOCK_RELAY
We use block-relay-only connections to help prevent against partition attacks.
@ MANUAL
We open manual connections to addresses that users explicitly requested via the addnode RPC or the -a...
@ OUTBOUND_FULL_RELAY
These are the default connections that we use to connect with the network.
@ FEELER
Feeler connections are short-lived connections made to check that a node is alive.
@ ADDR_FETCH
AddrFetch connections are short lived connections used to solicit addresses from peers.
UniValue ValueFromAmount(const CAmount amount)
Definition: core_io.cpp:283
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:8
const std::string CURRENCY_UNIT
Definition: feerate.h:19
static path u8path(std::string_view utf8_str)
Definition: fs.h:82
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition: fs.h:162
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition: hex_base.cpp:30
FILE * fopen(const fs::path &p, const char *mode)
Definition: fs.cpp:23
fs::path AbsPathJoin(const fs::path &base, const fs::path &path)
Helper function for joining two paths.
Definition: fs.cpp:32
Definition: messages.h:21
UniValue GetWarningsForRpc(const Warnings &warnings, bool use_deprecated)
RPC helper function that wraps warnings.GetMessages().
Definition: warnings.cpp:54
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:162
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:208
std::string strSubVersion
Subversion as sent to the P2P network in version messages.
Definition: net.cpp:121
const std::string NET_MESSAGE_TYPE_OTHER
Definition: net.cpp:109
GlobalMutex g_maplocalhost_mutex
Definition: net.cpp:119
static const int MAX_ADDNODE_CONNECTIONS
Maximum number of addnode outgoing nodes.
Definition: net.h:71
int64_t NodeId
Definition: net.h:105
const std::vector< std::string > NET_PERMISSIONS_DOC
std::map< CSubNet, CBanEntry > banmap_t
Definition: net_types.h:41
Network
A network type.
Definition: netaddress.h:33
@ NET_MAX
Dummy value to indicate the number of NET_* constants.
Definition: netaddress.h:57
@ NET_UNROUTABLE
Addresses from these networks are not publicly routable on the global Internet.
Definition: netaddress.h:35
@ NET_INTERNAL
A set of addresses that represent the hash of a string or FQDN.
Definition: netaddress.h:54
CSubNet LookupSubNet(const std::string &subnet_str)
Parse and resolve a specified subnet string into the appropriate internal representation.
Definition: netbase.cpp:831
std::vector< CNetAddr > LookupHost(const std::string &name, unsigned int nMaxSolutions, bool fAllowLookup, DNSLookupFn dns_lookup_function)
Resolve a host string to its corresponding network addresses.
Definition: netbase.cpp:173
std::string GetNetworkName(enum Network net)
Definition: netbase.cpp:114
enum Network ParseNetwork(const std::string &net_in)
Definition: netbase.cpp:100
CService MaybeFlipIPv6toCJDNS(const CService &service)
If an IPv6 address belongs to the address range used by the CJDNS network and the CJDNS network is re...
Definition: netbase.cpp:961
ReachableNets g_reachable_nets
Definition: netbase.cpp:43
std::optional< Proxy > GetProxy(enum Network net)
Definition: netbase.cpp:726
std::vector< std::string > GetNetworkNames(bool append_unroutable)
Return a vector of publicly routable Network names; optionally append NET_UNROUTABLE.
Definition: netbase.cpp:130
std::vector< std::string > serviceFlagsToStr(uint64_t flags)
Convert service flags (a bitmask of NODE_*) to human readable strings.
Definition: protocol.cpp:108
ServiceFlags
nServices flags
Definition: protocol.h:321
@ NODE_P2P_V2
Definition: protocol.h:342
@ NODE_WITNESS
Definition: protocol.h:332
@ NODE_NETWORK
Definition: protocol.h:327
static const int PROTOCOL_VERSION
network protocol versioning
UniValue JSONRPCError(int code, const std::string &message)
Definition: request.cpp:70
const std::vector< std::string > CONNECTION_TYPE_DOC
Definition: net.cpp:52
void RegisterNetRPCCommands(CRPCTable &t)
Definition: net.cpp:1289
static RPCMethod disconnectnode()
Definition: net.cpp:458
static RPCMethod addpeeraddress()
Definition: net.cpp:1012
static RPCMethod addnode()
Definition: net.cpp:320
static RPCMethod getrawaddrman()
Definition: net.cpp:1249
static RPCMethod getaddednodeinfo()
Definition: net.cpp:504
static RPCMethod getnetworkinfo()
Definition: net.cpp:650
static RPCMethod getaddrmaninfo()
Definition: net.cpp:1120
static RPCMethod listbanned()
Definition: net.cpp:859
static UniValue GetNetworksInfo()
Definition: net.cpp:628
static RPCMethod clearbanned()
Definition: net.cpp:907
UniValue AddrmanTableToJSON(const std::vector< std::pair< AddrInfo, AddressPosition > > &tableInfos, const CConnman &connman)
Definition: net.cpp:1233
static RPCMethod exportasmap()
Definition: net.cpp:1159
const std::vector< std::string > TRANSPORT_TYPE_DOC
Definition: net.cpp:62
static UniValue GetServicesNames(ServiceFlags services)
Returns, given services flags, a list of humanly readable (known) network services.
Definition: net.cpp:117
static RPCMethod sendmsgtopeer()
Definition: net.cpp:1072
static RPCMethod getconnectioncount()
Definition: net.cpp:68
static RPCMethod getnodeaddresses()
Definition: net.cpp:951
static RPCMethod setban()
Definition: net.cpp:779
static RPCMethod getnettotals()
Definition: net.cpp:578
static RPCMethod addconnection()
Definition: net.cpp:395
static RPCMethod setnetworkactive()
Definition: net.cpp:929
UniValue AddrmanEntryToJSON(const AddrInfo &info, const CConnman &connman)
Definition: net.cpp:1212
static RPCMethod ping()
Definition: net.cpp:91
static RPCMethod getpeerinfo()
Definition: net.cpp:128
@ RPC_CLIENT_NODE_NOT_CONNECTED
Node to disconnect not found in connected nodes.
Definition: protocol.h:86
@ RPC_CLIENT_INVALID_IP_OR_SUBNET
Invalid IP/Subnet.
Definition: protocol.h:87
@ RPC_MISC_ERROR
General application defined errors.
Definition: protocol.h:63
@ RPC_CLIENT_NODE_ALREADY_ADDED
Node is already added.
Definition: protocol.h:84
@ RPC_INVALID_PARAMS
Definition: protocol.h:56
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
Definition: protocol.h:67
@ RPC_CLIENT_NODE_NOT_ADDED
Node has not been added before.
Definition: protocol.h:85
@ RPC_CLIENT_NODE_CAPACITY_REACHED
Max number of outbound or block-relay connections already open.
Definition: protocol.h:89
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
Definition: util.cpp:183
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
Definition: util.cpp:201
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
Definition: util.cpp:43
bool IsDeprecatedRPCEnabled(const std::string &method)
Definition: server.cpp:699
static RPCMethod help()
Definition: server.cpp:122
BanMan & EnsureBanman(const NodeContext &node)
Definition: server_util.cpp:48
AddrMan & EnsureAnyAddrman(const std::any &context)
NodeContext & EnsureAnyNodeContext(const std::any &context)
Definition: server_util.cpp:25
BanMan & EnsureAnyBanman(const std::any &context)
Definition: server_util.cpp:56
PeerManager & EnsurePeerman(const NodeContext &node)
CConnman & EnsureConnman(const NodeContext &node)
ArgsManager & EnsureAnyArgsman(const std::any &context)
Definition: server_util.cpp:69
Location information for an address in AddrMan.
Definition: addrman.h:59
const int bucket
Definition: addrman.h:72
const int position
Definition: addrman.h:73
NodeClock::duration m_ping_wait
std::vector< int > vHeightInFlight
CAmount m_fee_filter_received
std::chrono::seconds time_offset
uint64_t m_addr_rate_limited
uint64_t m_last_inv_seq
uint64_t m_addr_processed
int64_t presync_height
ServiceFlags their_services
std::string m_type
Definition: net.h:139
std::vector< unsigned char > data
Definition: net.h:138
@ STR_HEX
Special type that is a STR with only hex chars.
std::string DefaultHint
Hint for default value.
Definition: util.h:221
@ NO
Required arg.
@ NUM_TIME
Special numeric to denote unix epoch time.
@ OBJ_DYN
Special dictionary with keys that are not literals.
@ STR_HEX
Special string with only hex chars.
NodeContext struct containing references to chain state and connection state.
Definition: context.h:59
#define LOCK(cs)
Definition: sync.h:268
static int count
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172
bool CheckStandardAsmap(const std::span< const std::byte > data)
Provides a safe interface for validating ASMap data before use.
Definition: asmap.cpp:308
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:89
constexpr int64_t count_seconds(std::chrono::seconds t)
Definition: time.h:97