Bitcoin Core 32.99.0
P2P Digital Currency
net.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#include <bitcoin-build-config.h> // IWYU pragma: keep
7
8#include <net.h>
9
10#include <addrdb.h>
11#include <addrman.h>
12#include <banman.h>
13#include <clientversion.h>
14#include <common/args.h>
15#include <common/netif.h>
16#include <compat/compat.h>
17#include <consensus/consensus.h>
18#include <crypto/sha256.h>
19#include <i2p.h>
20#include <key.h>
21#include <logging.h>
22#include <memusage.h>
23#include <net_permissions.h>
24#include <netaddress.h>
25#include <netbase.h>
26#include <node/eviction.h>
27#include <node/interface_ui.h>
28#include <protocol.h>
29#include <random.h>
30#include <scheduler.h>
31#include <util/fs.h>
32#include <util/overflow.h>
33#include <util/sock.h>
34#include <util/strencodings.h>
35#include <util/thread.h>
36#include <util/threadinterrupt.h>
37#include <util/trace.h>
38#include <util/translation.h>
39#include <util/vector.h>
40
41#include <algorithm>
42#include <array>
43#include <cmath>
44#include <cstdint>
45#include <cstring>
46#include <functional>
47#include <optional>
48#include <string_view>
49#include <unordered_map>
50
51TRACEPOINT_SEMAPHORE(net, closed_connection);
52TRACEPOINT_SEMAPHORE(net, evicted_inbound_connection);
53TRACEPOINT_SEMAPHORE(net, inbound_connection);
54TRACEPOINT_SEMAPHORE(net, outbound_connection);
55TRACEPOINT_SEMAPHORE(net, outbound_message);
56
58static constexpr size_t MAX_BLOCK_RELAY_ONLY_ANCHORS = 2;
59static_assert (MAX_BLOCK_RELAY_ONLY_ANCHORS <= static_cast<size_t>(MAX_BLOCK_RELAY_ONLY_CONNECTIONS), "MAX_BLOCK_RELAY_ONLY_ANCHORS must not exceed MAX_BLOCK_RELAY_ONLY_CONNECTIONS.");
61const char* const ANCHORS_DATABASE_FILENAME = "anchors.dat";
62
63// How often to dump addresses to peers.dat
64static constexpr std::chrono::minutes DUMP_PEERS_INTERVAL{15};
65
67static constexpr int DNSSEEDS_TO_QUERY_AT_ONCE = 3;
68
70static constexpr int SEED_OUTBOUND_CONNECTION_THRESHOLD = 2;
71
81static constexpr std::chrono::seconds DNSSEEDS_DELAY_FEW_PEERS{11};
82static constexpr std::chrono::minutes DNSSEEDS_DELAY_MANY_PEERS{5};
83static constexpr int DNSSEEDS_DELAY_PEER_THRESHOLD = 1000; // "many" vs "few" peers
84
86static constexpr std::chrono::seconds MAX_UPLOAD_TIMEFRAME{60 * 60 * 24};
87
88// A random time period (0 to 1 seconds) is added to feeler connections to prevent synchronization.
89static constexpr auto FEELER_SLEEP_WINDOW{1s};
90
92static constexpr auto EXTRA_NETWORK_PEER_INTERVAL{5min};
93
97 BF_REPORT_ERROR = (1U << 0),
102 BF_DONT_ADVERTISE = (1U << 1),
103};
104
105// The set of sockets cannot be modified while waiting
106// The sleep time needs to be small to avoid new sockets stalling
107static const uint64_t SELECT_TIMEOUT_MILLISECONDS = 50;
108
109const std::string NET_MESSAGE_TYPE_OTHER = "*other*";
110
111static const uint64_t RANDOMIZER_ID_NETGROUP = 0x6c0edd8036ef4036ULL; // SHA256("netgroup")[0:8]
112static const uint64_t RANDOMIZER_ID_LOCALHOSTNONCE = 0xd93e69e2bbfa5735ULL; // SHA256("localhostnonce")[0:8]
113static const uint64_t RANDOMIZER_ID_NETWORKKEY = 0x0e8a2b136c592a7dULL; // SHA256("networkkey")[0:8]
114//
115// Global state variables
116//
117bool fDiscover = true;
118bool fListen = true;
120std::map<CNetAddr, LocalServiceInfo> mapLocalHost GUARDED_BY(g_maplocalhost_mutex);
121std::string strSubVersion;
122
124{
125 return sizeof(*this) + memusage::DynamicUsage(m_type) + memusage::DynamicUsage(data);
126}
127
128size_t CNetMessage::GetMemoryUsage() const noexcept
129{
130 return sizeof(*this) + memusage::DynamicUsage(m_type) + m_recv.GetMemoryUsage();
131}
132
133void CConnman::AddAddrFetch(const std::string& strDest)
134{
136 m_addr_fetches.push_back(strDest);
137}
138
140{
141 // If -bind= is provided with ":port" part, use that (first one if multiple are provided).
142 for (const std::string& bind_arg : gArgs.GetArgs("-bind")) {
143 constexpr uint16_t dummy_port = 0;
144
145 const std::optional<CService> bind_addr{Lookup(bind_arg, dummy_port, /*fAllowLookup=*/false)};
146 if (bind_addr.has_value() && bind_addr->GetPort() != dummy_port) return bind_addr->GetPort();
147 }
148
149 // Otherwise, if -whitebind= without NetPermissionFlags::NoBan is provided, use that
150 // (-whitebind= is required to have ":port").
151 for (const std::string& whitebind_arg : gArgs.GetArgs("-whitebind")) {
152 NetWhitebindPermissions whitebind;
153 bilingual_str error;
154 if (NetWhitebindPermissions::TryParse(whitebind_arg, whitebind, error)) {
156 return whitebind.m_service.GetPort();
157 }
158 }
159 }
160
161 // Otherwise, if -port= is provided, use that. Otherwise use the default port.
162 return static_cast<uint16_t>(gArgs.GetIntArg("-port", Params().GetDefaultPort()));
163}
164
165// Determine the "best" local address for a particular peer.
166[[nodiscard]] static std::optional<CService> GetLocal(const CNode& peer)
167{
168 if (!fListen) return std::nullopt;
169
170 std::optional<CService> addr;
171 int nBestScore = -1;
172 int nBestReachability = -1;
173 {
175 for (const auto& [local_addr, local_service_info] : mapLocalHost) {
176 // For privacy reasons, don't advertise our privacy-network address
177 // to other networks and don't advertise our other-network address
178 // to privacy networks.
179 if (local_addr.GetNetwork() != peer.ConnectedThroughNetwork()
180 && (local_addr.IsPrivacyNet() || peer.IsConnectedThroughPrivacyNet())) {
181 continue;
182 }
183 const int nScore{local_service_info.nScore};
184 const int nReachability{local_addr.GetReachabilityFrom(peer.addr)};
185 if (nReachability > nBestReachability || (nReachability == nBestReachability && nScore > nBestScore)) {
186 addr.emplace(CService{local_addr, local_service_info.nPort});
187 nBestReachability = nReachability;
188 nBestScore = nScore;
189 }
190 }
191 }
192 return addr;
193}
194
196static std::vector<CAddress> ConvertSeeds(const std::vector<uint8_t> &vSeedsIn)
197{
198 // It'll only connect to one or two seed nodes because once it connects,
199 // it'll get a pile of addresses with newer timestamps.
200 // Seed nodes are given a random 'last seen time' of between one and two
201 // weeks ago.
202 const auto one_week{7 * 24h};
203 std::vector<CAddress> vSeedsOut;
206 while (!s.empty()) {
207 CService endpoint;
208 s >> endpoint;
209 CAddress addr{endpoint, SeedsAssumedServiceFlags()};
210 addr.nTime = rng.rand_uniform_delay(Now<NodeSeconds>() - one_week, -one_week);
211 LogDebug(BCLog::NET, "Added hardcoded seed: %s\n", addr.ToStringAddrPort());
212 vSeedsOut.push_back(addr);
213 }
214 return vSeedsOut;
215}
216
217// Determine the "best" local address for a particular peer.
218// If none, return the unroutable 0.0.0.0 but filled in with
219// the normal parameters, since the IP may be changed to a useful
220// one by discovery.
222{
223 return GetLocal(peer).value_or(CService{CNetAddr(), GetListenPort()});
224}
225
226static int GetnScore(const CService& addr)
227{
229 const auto it = mapLocalHost.find(addr);
230 return (it != mapLocalHost.end()) ? it->second.nScore : 0;
231}
232
233// Is our peer's addrLocal potentially useful as an external IP source?
234[[nodiscard]] static bool IsPeerAddrLocalGood(CNode *pnode)
235{
236 CService addrLocal = pnode->GetAddrLocal();
237 return fDiscover && pnode->addr.IsRoutable() && addrLocal.IsRoutable() &&
238 g_reachable_nets.Contains(addrLocal);
239}
240
241std::optional<CService> GetLocalAddrForPeer(CNode& node)
242{
243 CService addrLocal{GetLocalAddress(node)};
244 // If discovery is enabled, sometimes give our peer the address it
245 // tells us that it sees us as in case it has a better idea of our
246 // address than we do.
248 if (IsPeerAddrLocalGood(&node) && (!addrLocal.IsRoutable() ||
249 rng.randbits((GetnScore(addrLocal) > LOCAL_MANUAL) ? 3 : 1) == 0))
250 {
251 if (node.IsInboundConn()) {
252 // For inbound connections, assume both the address and the port
253 // as seen from the peer.
254 addrLocal = CService{node.GetAddrLocal()};
255 } else {
256 // For outbound connections, assume just the address as seen from
257 // the peer and leave the port in `addrLocal` as returned by
258 // `GetLocalAddress()` above. The peer has no way to observe our
259 // listening port when we have initiated the connection.
260 addrLocal.SetIP(node.GetAddrLocal());
261 }
262 }
263 if (addrLocal.IsRoutable()) {
264 LogDebug(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
265 return addrLocal;
266 }
267 // Address is unroutable. Don't advertise.
268 return std::nullopt;
269}
270
272{
274 return mapLocalHost.clear();
275}
276
277// learn a new local address
278bool AddLocal(const CService& addr_, int nScore, bool add_even_if_unreachable)
279{
280 CService addr{MaybeFlipIPv6toCJDNS(addr_)};
281
282 if (!addr.IsRoutable())
283 return false;
284
285 if (!fDiscover && nScore < LOCAL_MANUAL)
286 return false;
287
288 if (!g_reachable_nets.Contains(addr) && !add_even_if_unreachable)
289 return false;
290
291 if (fLogIPs) {
292 LogInfo("AddLocal(%s,%i)\n", addr.ToStringAddrPort(), nScore);
293 }
294
295 {
297 const auto [it, is_newly_added] = mapLocalHost.emplace(addr, LocalServiceInfo());
298 LocalServiceInfo &info = it->second;
299 if (is_newly_added || nScore >= info.nScore) {
300 info.nScore = SaturatingAdd(nScore, is_newly_added ? 0 : 1);
301 info.nPort = addr.GetPort();
302 }
303 }
304
305 return true;
306}
307
308bool AddLocal(const CNetAddr& addr, int nScore, bool add_even_if_unreachable)
309{
310 return AddLocal(CService(addr, GetListenPort()), nScore, add_even_if_unreachable);
311}
312
313void RemoveLocal(const CService& addr)
314{
316 if (fLogIPs) {
317 LogInfo("RemoveLocal(%s)\n", addr.ToStringAddrPort());
318 }
319
320 mapLocalHost.erase(addr);
321}
322
324bool SeenLocal(const CService& addr)
325{
327 const auto it = mapLocalHost.find(addr);
328 if (it == mapLocalHost.end()) return false;
329 it->second.nScore = SaturatingAdd(it->second.nScore, 1);
330 return true;
331}
332
333
335bool IsLocal(const CService& addr)
336{
338 return mapLocalHost.contains(addr);
339}
340
341bool CConnman::AlreadyConnectedToHost(std::string_view host) const
342{
344 return std::ranges::any_of(m_nodes, [&host](CNode* node) { return node->m_addr_name == host; });
345}
346
348{
350 return std::ranges::any_of(m_nodes, [&addr_port](CNode* node) { return node->addr == addr_port; });
351}
352
354{
356 return std::ranges::any_of(m_nodes, [&addr](CNode* node) { return node->addr == addr; });
357}
358
360{
362 for (const CNode* pnode : m_nodes) {
363 // Omit private broadcast connections from this check to prevent this privacy attack:
364 // - We connect to a peer in an attempt to privately broadcast a transaction. From our
365 // VERSION message the peer deducts that this is a short-lived connection for
366 // broadcasting a transaction, takes our nonce and delays their VERACK.
367 // - The peer starts connecting to (clearnet) nodes and sends them a VERSION message
368 // which contains our nonce. If the peer manages to connect to us we would disconnect.
369 // - Upon a disconnect, the peer knows our clearnet address. They go back to the short
370 // lived privacy broadcast connection and continue with VERACK.
371 if (!pnode->fSuccessfullyConnected && !pnode->IsInboundConn() && !pnode->IsPrivateBroadcastConn() &&
372 pnode->GetLocalNonce() == nonce)
373 return false;
374 }
375 return true;
376}
377
379 const char* pszDest,
380 bool fCountFailure,
381 ConnectionType conn_type,
382 bool use_v2transport,
383 const std::optional<Proxy>& proxy_override)
384{
387 assert(conn_type != ConnectionType::INBOUND);
388
389 if (pszDest == nullptr) {
390 if (IsLocal(addrConnect))
391 return nullptr;
392
393 // Look for an existing connection
394 if (AlreadyConnectedToAddressPort(addrConnect)) {
395 LogInfo("Failed to open new connection to %s, already connected", addrConnect.ToStringAddrPort());
396 return nullptr;
397 }
398 }
399
400 LogDebug(BCLog::NET, "trying %s connection (%s) to %s, lastseen=%.1fhrs\n",
401 use_v2transport ? "v2" : "v1",
402 ConnectionTypeAsString(conn_type),
403 pszDest ? pszDest : addrConnect.ToStringAddrPort(),
404 Ticks<HoursDouble>(pszDest ? 0h : Now<NodeSeconds>() - addrConnect.nTime));
405
406 // Resolve
407 const uint16_t default_port{pszDest != nullptr ? GetDefaultPort(pszDest) :
409
410 // Collection of addresses to try to connect to: either all dns resolved addresses if a domain name (pszDest) is provided, or addrConnect otherwise.
411 std::vector<CAddress> connect_to{};
412 if (pszDest) {
413 std::vector<CService> resolved{Lookup(pszDest, default_port, fNameLookup && !HaveNameProxy(), 256)};
414 if (!resolved.empty()) {
415 std::shuffle(resolved.begin(), resolved.end(), FastRandomContext());
416 // If the connection is made by name, it can be the case that the name resolves to more than one address.
417 // We don't want to connect any more of them if we are already connected to one
418 for (const auto& r : resolved) {
419 addrConnect = CAddress{MaybeFlipIPv6toCJDNS(r), NODE_NONE};
420 if (!addrConnect.IsValid()) {
421 LogDebug(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToStringAddrPort(), pszDest);
422 return nullptr;
423 }
424 // It is possible that we already have a connection to the IP/port pszDest resolved to.
425 // In that case, drop the connection that was just created.
426 if (AlreadyConnectedToAddressPort(addrConnect)) {
427 LogInfo("Not opening a connection to %s, already connected to %s\n", pszDest, addrConnect.ToStringAddrPort());
428 return nullptr;
429 }
430 // Add the address to the resolved addresses vector so we can try to connect to it later on
431 connect_to.push_back(addrConnect);
432 }
433 } else {
434 // For resolution via proxy
435 connect_to.push_back(addrConnect);
436 }
437 } else {
438 // Connect via addrConnect directly
439 connect_to.push_back(addrConnect);
440 }
441
442 // Connect
443 std::unique_ptr<Sock> sock;
444 CService addr_bind;
445 assert(!addr_bind.IsValid());
446 std::unique_ptr<i2p::sam::Session> i2p_transient_session;
447
448 for (auto& target_addr : connect_to) {
449 if (target_addr.IsValid()) {
450 const std::optional<Proxy> use_proxy{
451 proxy_override.has_value() ? proxy_override : GetProxy(target_addr.GetNetwork()),
452 };
453 bool proxyConnectionFailed = false;
454
455 if (target_addr.IsI2P() && use_proxy) {
456 i2p::Connection conn;
457 bool connected{false};
458
459 // If an I2P SAM session already exists, normally we would re-use it. But in the case of
460 // private broadcast we force a new transient session. A Connect() using m_i2p_sam_session
461 // would use our permanent I2P address as a source address.
463 connected = m_i2p_sam_session->Connect(target_addr, conn, proxyConnectionFailed);
464 } else {
465 {
467 if (m_unused_i2p_sessions.empty()) {
468 i2p_transient_session =
469 std::make_unique<i2p::sam::Session>(*use_proxy, m_interrupt_net);
470 } else {
471 i2p_transient_session.swap(m_unused_i2p_sessions.front());
472 m_unused_i2p_sessions.pop();
473 }
474 }
475 connected = i2p_transient_session->Connect(target_addr, conn, proxyConnectionFailed);
476 if (!connected) {
478 if (m_unused_i2p_sessions.size() < MAX_UNUSED_I2P_SESSIONS_SIZE) {
479 m_unused_i2p_sessions.emplace(i2p_transient_session.release());
480 }
481 }
482 }
483
484 if (connected) {
485 sock = std::move(conn.sock);
486 addr_bind = conn.me;
487 }
488 } else if (use_proxy) {
489 LogDebug(BCLog::PROXY, "Using proxy: %s to connect to %s\n", use_proxy->ToString(), target_addr.ToStringAddrPort());
490 sock = ConnectThroughProxy(*use_proxy, target_addr.ToStringAddr(), target_addr.GetPort(), proxyConnectionFailed);
491 } else {
492 // No proxy needed (none set for target network). Private broadcast connections
493 // must always use a proxy, otherwise they would leak the originator's IP address.
494 if (Assume(conn_type != ConnectionType::PRIVATE_BROADCAST)) {
495 sock = ConnectDirectly(target_addr, conn_type == ConnectionType::MANUAL);
496 }
497 }
498 if (!proxyConnectionFailed) {
499 // If a connection to the node was attempted, and failure (if any) is not caused by a problem connecting to
500 // the proxy, mark this as an attempt.
501 addrman.get().Attempt(target_addr, fCountFailure);
502 }
503 } else if (pszDest) {
504 if (const auto name_proxy = GetNameProxy()) {
505 std::string host;
506 uint16_t port{default_port};
507 SplitHostPort(pszDest, port, host);
508 bool proxyConnectionFailed;
509 sock = ConnectThroughProxy(*name_proxy, host, port, proxyConnectionFailed);
510 }
511 }
512 // Check any other resolved address (if any) if we fail to connect
513 if (!sock) {
514 continue;
515 }
516
518 std::vector<NetWhitelistPermissions> whitelist_permissions = conn_type == ConnectionType::MANUAL ? vWhitelistedRangeOutgoing : std::vector<NetWhitelistPermissions>{};
519 AddWhitelistPermissionFlags(permission_flags, target_addr, whitelist_permissions);
520
521 // Add node
522 NodeId id = GetNewNodeId();
524 if (!addr_bind.IsValid()) {
525 addr_bind = GetBindAddress(*sock);
526 }
528 .Write(target_addr.GetNetClass())
529 .Write(addr_bind.GetAddrBytes())
530 // For outbound connections, the port of the bound address is randomly
531 // assigned by the OS and would therefore not be useful for seeding.
532 .Write(0)
533 .Finalize();
534 CNode* pnode = new CNode(id,
535 std::move(sock),
536 target_addr,
537 CalculateKeyedNetGroup(target_addr),
538 nonce,
539 addr_bind,
540 pszDest ? pszDest : "",
541 conn_type,
542 /*inbound_onion=*/false,
543 network_id,
545 .permission_flags = permission_flags,
546 .proxy_override = proxy_override,
547 .i2p_sam_session = std::move(i2p_transient_session),
548 .recv_flood_size = nReceiveFloodSize,
549 .use_v2transport = use_v2transport,
550 });
551 pnode->AddRef();
552
553 // We're making a new connection, harvest entropy from the time (and our peer count)
554 RandAddEvent((uint32_t)id);
555
556 return pnode;
557 }
558
559 return nullptr;
560}
561
563{
564 fDisconnect = true;
566 if (m_sock) {
567 LogDebug(BCLog::NET, "Resetting socket for %s", LogPeer());
568 m_sock.reset();
569
570 TRACEPOINT(net, closed_connection,
571 GetId(),
572 m_addr_name.c_str(),
573 ConnectionTypeAsString().c_str(),
575 TicksSinceEpoch<std::chrono::seconds>(m_connected));
576 }
577 m_i2p_sam_session.reset();
578}
579
580void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, std::optional<CNetAddr> addr, const std::vector<NetWhitelistPermissions>& ranges) const {
581 for (const auto& subnet : ranges) {
582 if (addr.has_value() && subnet.m_subnet.Match(addr.value())) {
583 NetPermissions::AddFlag(flags, subnet.m_flags);
584 }
585 }
592 }
593}
594
596{
599 return m_addr_local;
600}
601
602void CNode::SetAddrLocal(const CService& addrLocalIn) {
605 if (Assume(!m_addr_local.IsValid())) { // Addr local can only be set once during version msg processing
606 m_addr_local = addrLocalIn;
607 }
608}
609
611{
613}
614
616{
618}
619
620#undef X
621#define X(name) stats.name = name
623{
624 stats.nodeid = this->GetId();
625 X(addr);
626 X(addrBind);
628 X(m_last_send);
629 X(m_last_recv);
632 X(m_connected);
633 X(m_addr_name);
634 X(nVersion);
635 {
637 X(cleanSubVer);
638 }
639 stats.fInbound = IsInboundConn();
642 {
643 LOCK(cs_vSend);
644 X(mapSendBytesPerMsgType);
645 X(nSendBytes);
646 }
647 {
648 LOCK(cs_vRecv);
649 X(mapRecvBytesPerMsgType);
650 X(nRecvBytes);
651 Transport::Info info = m_transport->GetInfo();
652 stats.m_transport_type = info.transport_type;
653 if (info.session_id) stats.m_session_id = HexStr(*info.session_id);
654 }
656
659
660 // Leave string empty if addrLocal invalid (not filled in yet)
661 CService addrLocalUnlocked = GetAddrLocal();
662 stats.addrLocal = addrLocalUnlocked.IsValid() ? addrLocalUnlocked.ToStringAddrPort() : "";
663
664 X(m_conn_type);
665}
666#undef X
667
668bool CNode::ReceiveMsgBytes(std::span<const uint8_t> msg_bytes, bool& complete)
669{
670 complete = false;
671 const auto time{NodeClock::now()};
672 LOCK(cs_vRecv);
673 m_last_recv = time;
674 nRecvBytes += msg_bytes.size();
675 while (msg_bytes.size() > 0) {
676 // absorb network data
677 if (!m_transport->ReceivedBytes(msg_bytes)) {
678 // Serious transport problem, disconnect from the peer.
679 return false;
680 }
681
682 if (m_transport->ReceivedMessageComplete()) {
683 // decompose a transport agnostic CNetMessage from the deserializer
684 bool reject_message{false};
685 CNetMessage msg = m_transport->GetReceivedMessage(time, reject_message);
686 if (reject_message) {
687 // Message deserialization failed. Drop the message but don't disconnect the peer.
688 // store the size of the corrupt message
689 mapRecvBytesPerMsgType.at(NET_MESSAGE_TYPE_OTHER) += msg.m_raw_message_size;
690 continue;
691 }
692
693 // Store received bytes per message type.
694 // To prevent a memory DOS, only allow known message types.
695 auto i = mapRecvBytesPerMsgType.find(msg.m_type);
696 if (i == mapRecvBytesPerMsgType.end()) {
697 i = mapRecvBytesPerMsgType.find(NET_MESSAGE_TYPE_OTHER);
698 }
699 assert(i != mapRecvBytesPerMsgType.end());
700 i->second += msg.m_raw_message_size;
701
702 // push the message to the process queue,
703 vRecvMsg.push_back(std::move(msg));
704
705 complete = true;
706 }
707 }
708
709 return true;
710}
711
712std::string CNode::LogPeer() const
713{
714 auto peer_info{strprintf("peer=%d", GetId())};
715 if (fLogIPs) {
716 return strprintf("%s, peeraddr=%s", peer_info, addr.ToStringAddrPort());
717 } else {
718 return peer_info;
719 }
720}
721
722std::string CNode::DisconnectMsg() const
723{
724 return strprintf("disconnecting %s", LogPeer());
725}
726
727V1Transport::V1Transport(const NodeId node_id) noexcept
728 : m_magic_bytes{Params().MessageStart()}, m_node_id{node_id}
729{
730 LOCK(m_recv_mutex);
731 Reset();
732}
733
735{
736 return {.transport_type = TransportProtocolType::V1, .session_id = {}};
737}
738
739int V1Transport::readHeader(std::span<const uint8_t> msg_bytes)
740{
742 // copy data to temporary parsing buffer
743 unsigned int nRemaining = CMessageHeader::HEADER_SIZE - nHdrPos;
744 unsigned int nCopy = std::min<unsigned int>(nRemaining, msg_bytes.size());
745
746 memcpy(&hdrbuf[nHdrPos], msg_bytes.data(), nCopy);
747 nHdrPos += nCopy;
748
749 // if header incomplete, exit
750 if (nHdrPos < CMessageHeader::HEADER_SIZE)
751 return nCopy;
752
753 // deserialize to CMessageHeader
754 try {
755 hdrbuf >> hdr;
756 }
757 catch (const std::exception&) {
758 LogDebug(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
759 return -1;
760 }
761
762 // Check start string, network magic
763 if (hdr.pchMessageStart != m_magic_bytes) {
764 LogDebug(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
765 return -1;
766 }
767
768 // reject messages larger than MAX_SIZE or MAX_PROTOCOL_MESSAGE_LENGTH
769 // NOTE: failing to perform this check previously allowed a malicious peer to make us allocate 32MiB of memory per
770 // connection. See https://bitcoincore.org/en/2024/07/03/disclose_receive_buffer_oom.
771 if (hdr.nMessageSize > MAX_SIZE || hdr.nMessageSize > MAX_PROTOCOL_MESSAGE_LENGTH) {
772 LogDebug(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetMessageType()), hdr.nMessageSize, m_node_id);
773 return -1;
774 }
775
776 // switch state to reading message data
777 in_data = true;
778
779 return nCopy;
780}
781
782int V1Transport::readData(std::span<const uint8_t> msg_bytes)
783{
785 unsigned int nRemaining = hdr.nMessageSize - nDataPos;
786 unsigned int nCopy = std::min<unsigned int>(nRemaining, msg_bytes.size());
787
788 if (vRecv.size() < nDataPos + nCopy) {
789 // Allocate up to 256 KiB ahead, but never more than the total message size.
790 vRecv.resize(std::min(hdr.nMessageSize, nDataPos + nCopy + 256 * 1024));
791 }
792
793 hasher.Write(msg_bytes.first(nCopy));
794 memcpy(&vRecv[nDataPos], msg_bytes.data(), nCopy);
795 nDataPos += nCopy;
796
797 return nCopy;
798}
799
801{
804 if (data_hash.IsNull())
805 hasher.Finalize(data_hash);
806 return data_hash;
807}
808
810{
812 // Initialize out parameter
813 reject_message = false;
814 // decompose a single CNetMessage from the TransportDeserializer
816 CNetMessage msg(std::move(vRecv));
817
818 // store message type string, time, and sizes
819 msg.m_type = hdr.GetMessageType();
820 msg.m_time = time;
821 msg.m_message_size = hdr.nMessageSize;
822 msg.m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
823
824 uint256 hash = GetMessageHash();
825
826 // We just received a message off the wire, harvest entropy from the time (and the message checksum)
827 RandAddEvent(ReadLE32(hash.begin()));
828
829 // Check checksum and header message type string
830 if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) {
831 LogDebug(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
832 SanitizeString(msg.m_type), msg.m_message_size,
833 HexStr(std::span{hash}.first(CMessageHeader::CHECKSUM_SIZE)),
834 HexStr(hdr.pchChecksum),
835 m_node_id);
836 reject_message = true;
837 } else if (!hdr.IsMessageTypeValid()) {
838 LogDebug(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
839 SanitizeString(hdr.GetMessageType()), msg.m_message_size, m_node_id);
840 reject_message = true;
841 }
842
843 // Always reset the network deserializer (prepare for the next message)
844 Reset();
845 return msg;
846}
847
849{
850 AssertLockNotHeld(m_send_mutex);
851 // Determine whether a new message can be set.
852 LOCK(m_send_mutex);
853 if (m_sending_header || m_bytes_sent < m_message_to_send.data.size()) return false;
854
855 // create dbl-sha256 checksum
856 uint256 hash = Hash(msg.data);
857
858 // create header
859 CMessageHeader hdr(m_magic_bytes, msg.m_type.c_str(), msg.data.size());
861
862 // serialize header
863 m_header_to_send.clear();
864 VectorWriter{m_header_to_send, 0, hdr};
865
866 // update state
867 m_message_to_send = std::move(msg);
868 m_sending_header = true;
869 m_bytes_sent = 0;
870 return true;
871}
872
873Transport::BytesToSend V1Transport::GetBytesToSend(bool have_next_message) const noexcept
874{
875 AssertLockNotHeld(m_send_mutex);
876 LOCK(m_send_mutex);
877 if (m_sending_header) {
878 return {std::span{m_header_to_send}.subspan(m_bytes_sent),
879 // We have more to send after the header if the message has payload, or if there
880 // is a next message after that.
881 have_next_message || !m_message_to_send.data.empty(),
882 m_message_to_send.m_type
883 };
884 } else {
885 return {std::span{m_message_to_send.data}.subspan(m_bytes_sent),
886 // We only have more to send after this message's payload if there is another
887 // message.
888 have_next_message,
889 m_message_to_send.m_type
890 };
891 }
892}
893
894void V1Transport::MarkBytesSent(size_t bytes_sent) noexcept
895{
896 AssertLockNotHeld(m_send_mutex);
897 LOCK(m_send_mutex);
898 m_bytes_sent += bytes_sent;
899 if (m_sending_header && m_bytes_sent == m_header_to_send.size()) {
900 // We're done sending a message's header. Switch to sending its data bytes.
901 m_sending_header = false;
902 m_bytes_sent = 0;
903 } else if (!m_sending_header && m_bytes_sent == m_message_to_send.data.size()) {
904 // We're done sending a message's data. Wipe the data vector to reduce memory consumption.
905 ClearShrink(m_message_to_send.data);
906 m_bytes_sent = 0;
907 }
908}
909
910size_t V1Transport::GetSendMemoryUsage() const noexcept
911{
914 // Don't count sending-side fields besides m_message_to_send, as they're all small and bounded.
915 return m_message_to_send.GetMemoryUsage();
916}
917
918namespace {
919
925const std::array<std::string, BIP324_SHORTIDS_IMPLEMENTED> V2_MESSAGE_IDS = {
926 "", // 12 bytes follow encoding the message type like in V1
955 "", "", "", // Unimplemented message types 29-31
956 "", "", "", "", // Unimplemented message types 32-35
957 "", // Unimplemented message type 36
959};
960
961class V2MessageMap
962{
963 std::unordered_map<std::string, uint8_t> m_map;
964
965public:
966 V2MessageMap() noexcept
967 {
968 for (size_t i = 1; i < std::size(V2_MESSAGE_IDS); ++i) {
969 m_map.emplace(V2_MESSAGE_IDS[i], i);
970 }
971 }
972
973 std::optional<uint8_t> operator()(const std::string& message_name) const noexcept
974 {
975 auto it = m_map.find(message_name);
976 if (it == m_map.end()) return std::nullopt;
977 return it->second;
978 }
979};
980
981const V2MessageMap V2_MESSAGE_MAP;
982
983std::vector<uint8_t> GenerateRandomGarbage() noexcept
984{
985 std::vector<uint8_t> ret;
989 return ret;
990}
991
992} // namespace
993
995{
996 AssertLockHeld(m_send_mutex);
997 Assume(m_send_state == SendState::AWAITING_KEY);
998 Assume(m_send_buffer.empty());
999 // Initialize the send buffer with ellswift pubkey + provided garbage.
1000 m_send_buffer.resize(EllSwiftPubKey::size() + m_send_garbage.size());
1001 std::copy(std::begin(m_cipher.GetOurPubKey()), std::end(m_cipher.GetOurPubKey()), MakeWritableByteSpan(m_send_buffer).begin());
1002 std::copy(m_send_garbage.begin(), m_send_garbage.end(), m_send_buffer.begin() + EllSwiftPubKey::size());
1003 // We cannot wipe m_send_garbage as it will still be used as AAD later in the handshake.
1004}
1005
1006V2Transport::V2Transport(NodeId nodeid, bool initiating, const CKey& key, std::span<const std::byte> ent32, std::vector<uint8_t> garbage) noexcept
1007 : m_cipher{key, ent32},
1008 m_initiating{initiating},
1009 m_nodeid{nodeid},
1010 m_v1_fallback{nodeid},
1011 m_recv_state{initiating ? RecvState::KEY : RecvState::KEY_MAYBE_V1},
1012 m_send_garbage{std::move(garbage)},
1013 m_send_state{initiating ? SendState::AWAITING_KEY : SendState::MAYBE_V1}
1014{
1015 Assume(m_send_garbage.size() <= MAX_GARBAGE_LEN);
1016 // Start sending immediately if we're the initiator of the connection.
1017 if (initiating) {
1018 LOCK(m_send_mutex);
1019 StartSendingHandshake();
1020 }
1021}
1022
1023V2Transport::V2Transport(NodeId nodeid, bool initiating) noexcept
1024 : V2Transport{nodeid, initiating, GenerateRandomKey(),
1025 MakeByteSpan(GetRandHash()), GenerateRandomGarbage()} {}
1026
1028{
1029 AssertLockHeld(m_recv_mutex);
1030 // Enforce allowed state transitions.
1031 switch (m_recv_state) {
1032 case RecvState::KEY_MAYBE_V1:
1033 Assume(recv_state == RecvState::KEY || recv_state == RecvState::V1);
1034 break;
1035 case RecvState::KEY:
1036 Assume(recv_state == RecvState::GARB_GARBTERM);
1037 break;
1038 case RecvState::GARB_GARBTERM:
1039 Assume(recv_state == RecvState::VERSION);
1040 break;
1041 case RecvState::VERSION:
1042 Assume(recv_state == RecvState::APP);
1043 break;
1044 case RecvState::APP:
1045 Assume(recv_state == RecvState::APP_READY);
1046 break;
1047 case RecvState::APP_READY:
1048 Assume(recv_state == RecvState::APP);
1049 break;
1050 case RecvState::V1:
1051 Assume(false); // V1 state cannot be left
1052 break;
1053 }
1054 // Change state.
1055 m_recv_state = recv_state;
1056}
1057
1058void V2Transport::SetSendState(SendState send_state) noexcept
1059{
1060 AssertLockHeld(m_send_mutex);
1061 // Enforce allowed state transitions.
1062 switch (m_send_state) {
1063 case SendState::MAYBE_V1:
1064 Assume(send_state == SendState::V1 || send_state == SendState::AWAITING_KEY);
1065 break;
1066 case SendState::AWAITING_KEY:
1067 Assume(send_state == SendState::READY);
1068 break;
1069 case SendState::READY:
1070 case SendState::V1:
1071 Assume(false); // Final states
1072 break;
1073 }
1074 // Change state.
1075 m_send_state = send_state;
1076}
1077
1079{
1080 AssertLockNotHeld(m_recv_mutex);
1081 LOCK(m_recv_mutex);
1082 if (m_recv_state == RecvState::V1) return m_v1_fallback.ReceivedMessageComplete();
1083
1084 return m_recv_state == RecvState::APP_READY;
1085}
1086
1088{
1089 AssertLockHeld(m_recv_mutex);
1090 AssertLockNotHeld(m_send_mutex);
1091 Assume(m_recv_state == RecvState::KEY_MAYBE_V1);
1092 // We still have to determine if this is a v1 or v2 connection. The bytes being received could
1093 // be the beginning of either a v1 packet (network magic + "version\x00\x00\x00\x00\x00"), or
1094 // of a v2 public key. BIP324 specifies that a mismatch with this 16-byte string should trigger
1095 // sending of the key.
1096 std::array<uint8_t, V1_PREFIX_LEN> v1_prefix = {0, 0, 0, 0, 'v', 'e', 'r', 's', 'i', 'o', 'n', 0, 0, 0, 0, 0};
1097 std::copy(std::begin(Params().MessageStart()), std::end(Params().MessageStart()), v1_prefix.begin());
1098 Assume(m_recv_buffer.size() <= v1_prefix.size());
1099 if (!std::equal(m_recv_buffer.begin(), m_recv_buffer.end(), v1_prefix.begin())) {
1100 // Mismatch with v1 prefix, so we can assume a v2 connection.
1101 SetReceiveState(RecvState::KEY); // Convert to KEY state, leaving received bytes around.
1102 // Transition the sender to AWAITING_KEY state and start sending.
1103 LOCK(m_send_mutex);
1106 } else if (m_recv_buffer.size() == v1_prefix.size()) {
1107 // Full match with the v1 prefix, so fall back to v1 behavior.
1108 LOCK(m_send_mutex);
1109 std::span<const uint8_t> feedback{m_recv_buffer};
1110 // Feed already received bytes to v1 transport. It should always accept these, because it's
1111 // less than the size of a v1 header, and these are the first bytes fed to m_v1_fallback.
1112 bool ret = m_v1_fallback.ReceivedBytes(feedback);
1113 Assume(feedback.empty());
1114 Assume(ret);
1117 // Reset v2 transport buffers to save memory.
1118 ClearShrink(m_recv_buffer);
1119 ClearShrink(m_send_buffer);
1120 } else {
1121 // We have not received enough to distinguish v1 from v2 yet. Wait until more bytes come.
1122 }
1123}
1124
1126{
1127 AssertLockHeld(m_recv_mutex);
1128 AssertLockNotHeld(m_send_mutex);
1129 Assume(m_recv_state == RecvState::KEY);
1130 Assume(m_recv_buffer.size() <= EllSwiftPubKey::size());
1131
1132 // As a special exception, if bytes 4-16 of the key on a responder connection match the
1133 // corresponding bytes of a V1 version message, but bytes 0-4 don't match the network magic
1134 // (if they did, we'd have switched to V1 state already), assume this is a peer from
1135 // another network, and disconnect them. They will almost certainly disconnect us too when
1136 // they receive our uniformly random key and garbage, but detecting this case specially
1137 // means we can log it.
1138 static constexpr std::array<uint8_t, 12> MATCH = {'v', 'e', 'r', 's', 'i', 'o', 'n', 0, 0, 0, 0, 0};
1139 static constexpr size_t OFFSET = std::tuple_size_v<MessageStartChars>;
1140 if (!m_initiating && m_recv_buffer.size() >= OFFSET + MATCH.size()) {
1141 if (std::equal(MATCH.begin(), MATCH.end(), m_recv_buffer.begin() + OFFSET)) {
1142 LogDebug(BCLog::NET, "V2 transport error: V1 peer with wrong MessageStart %s\n",
1143 HexStr(std::span(m_recv_buffer).first(OFFSET)));
1144 return false;
1145 }
1146 }
1147
1148 if (m_recv_buffer.size() == EllSwiftPubKey::size()) {
1149 // Other side's key has been fully received, and can now be Diffie-Hellman combined with
1150 // our key to initialize the encryption ciphers.
1151
1152 // Initialize the ciphers.
1153 EllSwiftPubKey ellswift(MakeByteSpan(m_recv_buffer));
1154 LOCK(m_send_mutex);
1155 m_cipher.Initialize(ellswift, m_initiating);
1156
1157 // Switch receiver state to GARB_GARBTERM.
1159 m_recv_buffer.clear();
1161 // Switch sender state to READY.
1163
1164 // Append the garbage terminator to the send buffer.
1165 m_send_buffer.resize(m_send_buffer.size() + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
1166 std::copy(m_cipher.GetSendGarbageTerminator().begin(),
1168 MakeWritableByteSpan(m_send_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN).begin());
1169
1170 // Construct version packet in the send buffer, with the sent garbage data as AAD.
1171 m_send_buffer.resize(m_send_buffer.size() + BIP324Cipher::EXPANSION + VERSION_CONTENTS.size());
1173 /*contents=*/VERSION_CONTENTS,
1174 /*aad=*/MakeByteSpan(m_send_garbage),
1175 /*ignore=*/false,
1176 /*output=*/MakeWritableByteSpan(m_send_buffer).last(BIP324Cipher::EXPANSION + VERSION_CONTENTS.size()));
1177 // We no longer need the garbage.
1178 ClearShrink(m_send_garbage);
1179 } else {
1180 // We still have to receive more key bytes.
1181 }
1182 return true;
1183}
1184
1186{
1187 AssertLockHeld(m_recv_mutex);
1188 Assume(m_recv_state == RecvState::GARB_GARBTERM);
1190 if (m_recv_buffer.size() >= BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
1191 if (std::ranges::equal(MakeByteSpan(m_recv_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN), m_cipher.GetReceiveGarbageTerminator())) {
1192 // Garbage terminator received. Store garbage to authenticate it as AAD later.
1193 m_recv_aad = std::move(m_recv_buffer);
1194 m_recv_aad.resize(m_recv_aad.size() - BIP324Cipher::GARBAGE_TERMINATOR_LEN);
1195 m_recv_buffer.clear();
1197 } else if (m_recv_buffer.size() == MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN) {
1198 // We've reached the maximum length for garbage + garbage terminator, and the
1199 // terminator still does not match. Abort.
1200 LogDebug(BCLog::NET, "V2 transport error: missing garbage terminator, peer=%d\n", m_nodeid);
1201 return false;
1202 } else {
1203 // We still need to receive more garbage and/or garbage terminator bytes.
1204 }
1205 } else {
1206 // We have less than GARBAGE_TERMINATOR_LEN (16) bytes, so we certainly need to receive
1207 // more first.
1208 }
1209 return true;
1210}
1211
1213{
1214 AssertLockHeld(m_recv_mutex);
1215 Assume(m_recv_state == RecvState::VERSION || m_recv_state == RecvState::APP);
1216
1217 // The maximum permitted contents length for a packet, consisting of:
1218 // - 0x00 byte: indicating long message type encoding
1219 // - 12 bytes of message type
1220 // - payload
1221 static constexpr size_t MAX_CONTENTS_LEN =
1223 std::min<size_t>(MAX_SIZE, MAX_PROTOCOL_MESSAGE_LENGTH);
1224
1225 if (m_recv_buffer.size() == BIP324Cipher::LENGTH_LEN) {
1226 // Length descriptor received.
1227 m_recv_len = m_cipher.DecryptLength(MakeByteSpan(m_recv_buffer));
1228 if (m_recv_len > MAX_CONTENTS_LEN) {
1229 LogDebug(BCLog::NET, "V2 transport error: packet too large (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
1230 return false;
1231 }
1232 } else if (m_recv_buffer.size() > BIP324Cipher::LENGTH_LEN && m_recv_buffer.size() == m_recv_len + BIP324Cipher::EXPANSION) {
1233 // Ciphertext received, decrypt it into m_recv_decode_buffer.
1234 // Note that it is impossible to reach this branch without hitting the branch above first,
1235 // as GetMaxBytesToProcess only allows up to LENGTH_LEN into the buffer before that point.
1236 m_recv_decode_buffer.resize(m_recv_len);
1237 bool ignore{false};
1238 bool ret = m_cipher.Decrypt(
1239 /*input=*/MakeByteSpan(m_recv_buffer).subspan(BIP324Cipher::LENGTH_LEN),
1240 /*aad=*/MakeByteSpan(m_recv_aad),
1241 /*ignore=*/ignore,
1242 /*contents=*/MakeWritableByteSpan(m_recv_decode_buffer));
1243 if (!ret) {
1244 LogDebug(BCLog::NET, "V2 transport error: packet decryption failure (%u bytes), peer=%d\n", m_recv_len, m_nodeid);
1245 return false;
1246 }
1247 // We have decrypted a valid packet with the AAD we expected, so clear the expected AAD.
1248 ClearShrink(m_recv_aad);
1249 // Feed the last 4 bytes of the Poly1305 authentication tag (and its timing) into our RNG.
1250 RandAddEvent(ReadLE32(m_recv_buffer.data() + m_recv_buffer.size() - 4));
1251
1252 // At this point we have a valid packet decrypted into m_recv_decode_buffer. If it's not a
1253 // decoy, which we simply ignore, use the current state to decide what to do with it.
1254 if (!ignore) {
1255 switch (m_recv_state) {
1256 case RecvState::VERSION:
1257 // Version message received; transition to application phase. The contents is
1258 // ignored, but can be used for future extensions.
1260 break;
1261 case RecvState::APP:
1262 // Application message decrypted correctly. It can be extracted using GetMessage().
1264 break;
1265 default:
1266 // Any other state is invalid (this function should not have been called).
1267 Assume(false);
1268 }
1269 }
1270 // Wipe the receive buffer where the next packet will be received into.
1271 ClearShrink(m_recv_buffer);
1272 // In all but APP_READY state, we can wipe the decoded contents.
1273 if (m_recv_state != RecvState::APP_READY) ClearShrink(m_recv_decode_buffer);
1274 } else {
1275 // We either have less than 3 bytes, so we don't know the packet's length yet, or more
1276 // than 3 bytes but less than the packet's full ciphertext. Wait until those arrive.
1277 }
1278 return true;
1279}
1280
1282{
1283 AssertLockHeld(m_recv_mutex);
1284 switch (m_recv_state) {
1286 // During the KEY_MAYBE_V1 state we do not allow more than the length of v1 prefix into the
1287 // receive buffer.
1288 Assume(m_recv_buffer.size() <= V1_PREFIX_LEN);
1289 // As long as we're not sure if this is a v1 or v2 connection, don't receive more than what
1290 // is strictly necessary to distinguish the two (16 bytes). If we permitted more than
1291 // the v1 header size (24 bytes), we may not be able to feed the already-received bytes
1292 // back into the m_v1_fallback V1 transport.
1293 return V1_PREFIX_LEN - m_recv_buffer.size();
1294 case RecvState::KEY:
1295 // During the KEY state, we only allow the 64-byte key into the receive buffer.
1296 Assume(m_recv_buffer.size() <= EllSwiftPubKey::size());
1297 // As long as we have not received the other side's public key, don't receive more than
1298 // that (64 bytes), as garbage follows, and locating the garbage terminator requires the
1299 // key exchange first.
1300 return EllSwiftPubKey::size() - m_recv_buffer.size();
1302 // Process garbage bytes one by one (because terminator may appear anywhere).
1303 return 1;
1304 case RecvState::VERSION:
1305 case RecvState::APP:
1306 // These three states all involve decoding a packet. Process the length descriptor first,
1307 // so that we know where the current packet ends (and we don't process bytes from the next
1308 // packet or decoy yet). Then, process the ciphertext bytes of the current packet.
1309 if (m_recv_buffer.size() < BIP324Cipher::LENGTH_LEN) {
1310 return BIP324Cipher::LENGTH_LEN - m_recv_buffer.size();
1311 } else {
1312 // Note that BIP324Cipher::EXPANSION is the total difference between contents size
1313 // and encoded packet size, which includes the 3 bytes due to the packet length.
1314 // When transitioning from receiving the packet length to receiving its ciphertext,
1315 // the encrypted packet length is left in the receive buffer.
1316 return BIP324Cipher::EXPANSION + m_recv_len - m_recv_buffer.size();
1317 }
1319 // No bytes can be processed until GetMessage() is called.
1320 return 0;
1321 case RecvState::V1:
1322 // Not allowed (must be dealt with by the caller).
1323 Assume(false);
1324 return 0;
1325 }
1326 Assume(false); // unreachable
1327 return 0;
1328}
1329
1330bool V2Transport::ReceivedBytes(std::span<const uint8_t>& msg_bytes) noexcept
1331{
1332 AssertLockNotHeld(m_recv_mutex);
1334 static constexpr size_t MAX_RESERVE_AHEAD = 256 * 1024;
1335
1336 LOCK(m_recv_mutex);
1337 if (m_recv_state == RecvState::V1) return m_v1_fallback.ReceivedBytes(msg_bytes);
1338
1339 // Process the provided bytes in msg_bytes in a loop. In each iteration a nonzero number of
1340 // bytes (decided by GetMaxBytesToProcess) are taken from the beginning om msg_bytes, and
1341 // appended to m_recv_buffer. Then, depending on the receiver state, one of the
1342 // ProcessReceived*Bytes functions is called to process the bytes in that buffer.
1343 while (!msg_bytes.empty()) {
1344 // Decide how many bytes to copy from msg_bytes to m_recv_buffer.
1345 size_t max_read = GetMaxBytesToProcess();
1346
1347 // Reserve space in the buffer if there is not enough.
1348 if (m_recv_buffer.size() + std::min(msg_bytes.size(), max_read) > m_recv_buffer.capacity()) {
1349 switch (m_recv_state) {
1350 case RecvState::KEY_MAYBE_V1:
1351 case RecvState::KEY:
1352 case RecvState::GARB_GARBTERM:
1353 // During the initial states (key/garbage), allocate once to fit the maximum (4111
1354 // bytes).
1355 m_recv_buffer.reserve(MAX_GARBAGE_LEN + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
1356 break;
1357 case RecvState::VERSION:
1358 case RecvState::APP: {
1359 // During states where a packet is being received, as much as is expected but never
1360 // more than MAX_RESERVE_AHEAD bytes in addition to what is received so far.
1361 // This means attackers that want to cause us to waste allocated memory are limited
1362 // to MAX_RESERVE_AHEAD above the largest allowed message contents size, and to
1363 // MAX_RESERVE_AHEAD more than they've actually sent us.
1364 size_t alloc_add = std::min(max_read, msg_bytes.size() + MAX_RESERVE_AHEAD);
1365 m_recv_buffer.reserve(m_recv_buffer.size() + alloc_add);
1366 break;
1367 }
1368 case RecvState::APP_READY:
1369 // The buffer is empty in this state.
1370 Assume(m_recv_buffer.empty());
1371 break;
1372 case RecvState::V1:
1373 // Should have bailed out above.
1374 Assume(false);
1375 break;
1376 }
1377 }
1378
1379 // Can't read more than provided input.
1380 max_read = std::min(msg_bytes.size(), max_read);
1381 // Copy data to buffer.
1382 m_recv_buffer.insert(m_recv_buffer.end(), UCharCast(msg_bytes.data()), UCharCast(msg_bytes.data() + max_read));
1383 msg_bytes = msg_bytes.subspan(max_read);
1384
1385 // Process data in the buffer.
1386 switch (m_recv_state) {
1387 case RecvState::KEY_MAYBE_V1:
1388 ProcessReceivedMaybeV1Bytes();
1389 if (m_recv_state == RecvState::V1) return true;
1390 break;
1391
1392 case RecvState::KEY:
1393 if (!ProcessReceivedKeyBytes()) return false;
1394 break;
1395
1396 case RecvState::GARB_GARBTERM:
1397 if (!ProcessReceivedGarbageBytes()) return false;
1398 break;
1399
1400 case RecvState::VERSION:
1401 case RecvState::APP:
1402 if (!ProcessReceivedPacketBytes()) return false;
1403 break;
1404
1405 case RecvState::APP_READY:
1406 return true;
1407
1408 case RecvState::V1:
1409 // We should have bailed out before.
1410 Assume(false);
1411 break;
1412 }
1413 // Make sure we have made progress before continuing.
1414 Assume(max_read > 0);
1415 }
1416
1417 return true;
1418}
1419
1420std::optional<std::string> V2Transport::GetMessageType(std::span<const uint8_t>& contents) noexcept
1421{
1422 if (contents.size() == 0) return std::nullopt; // Empty contents
1423 uint8_t first_byte = contents[0];
1424 contents = contents.subspan(1); // Strip first byte.
1425
1426 if (first_byte != 0) {
1427 // Short (1 byte) encoding.
1428 if (first_byte < std::size(V2_MESSAGE_IDS)) {
1429 // Valid short message id.
1430 return V2_MESSAGE_IDS[first_byte];
1431 } else {
1432 // Unknown short message id.
1433 return std::nullopt;
1434 }
1435 }
1436
1437 if (contents.size() < CMessageHeader::MESSAGE_TYPE_SIZE) {
1438 return std::nullopt; // Long encoding needs 12 message type bytes.
1439 }
1440
1441 size_t msg_type_len{0};
1442 while (msg_type_len < CMessageHeader::MESSAGE_TYPE_SIZE && contents[msg_type_len] != 0) {
1443 // Verify that message type bytes before the first 0x00 are in range. BIP324 specifies the
1444 // long message type encoding as "an ASCII message type (as in the v1 P2P protocol)".
1445 if (contents[msg_type_len] < ' ' || contents[msg_type_len] > 0x7E) {
1446 return {};
1447 }
1448 ++msg_type_len;
1449 }
1450 std::string ret{reinterpret_cast<const char*>(contents.data()), msg_type_len};
1451 while (msg_type_len < CMessageHeader::MESSAGE_TYPE_SIZE) {
1452 // Verify that message type bytes after the first 0x00 are also 0x00.
1453 if (contents[msg_type_len] != 0) return {};
1454 ++msg_type_len;
1455 }
1456 // Strip message type bytes of contents.
1457 contents = contents.subspan(CMessageHeader::MESSAGE_TYPE_SIZE);
1458 return ret;
1459}
1460
1462{
1463 AssertLockNotHeld(m_recv_mutex);
1464 LOCK(m_recv_mutex);
1465 if (m_recv_state == RecvState::V1) return m_v1_fallback.GetReceivedMessage(time, reject_message);
1466
1467 Assume(m_recv_state == RecvState::APP_READY);
1468 std::span<const uint8_t> contents{m_recv_decode_buffer};
1469 auto msg_type = GetMessageType(contents);
1471 // Note that BIP324Cipher::EXPANSION also includes the length descriptor size.
1472 msg.m_raw_message_size = m_recv_decode_buffer.size() + BIP324Cipher::EXPANSION;
1473 if (msg_type) {
1474 reject_message = false;
1475 msg.m_type = std::move(*msg_type);
1476 msg.m_time = time;
1477 msg.m_message_size = contents.size();
1478 msg.m_recv.resize(contents.size());
1479 std::copy(contents.begin(), contents.end(), UCharCast(msg.m_recv.data()));
1480 } else {
1481 LogDebug(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
1482 reject_message = true;
1483 }
1484 ClearShrink(m_recv_decode_buffer);
1485 SetReceiveState(RecvState::APP);
1486
1487 return msg;
1488}
1489
1491{
1492 AssertLockNotHeld(m_send_mutex);
1493 LOCK(m_send_mutex);
1494 if (m_send_state == SendState::V1) return m_v1_fallback.SetMessageToSend(msg);
1495 // We only allow adding a new message to be sent when in the READY state (so the packet cipher
1496 // is available) and the send buffer is empty. This limits the number of messages in the send
1497 // buffer to just one, and leaves the responsibility for queueing them up to the caller.
1498 if (!(m_send_state == SendState::READY && m_send_buffer.empty())) return false;
1499 // Construct contents (encoding message type + payload).
1500 std::vector<uint8_t> contents;
1501 auto short_message_id = V2_MESSAGE_MAP(msg.m_type);
1502 if (short_message_id) {
1503 contents.resize(1 + msg.data.size());
1504 contents[0] = *short_message_id;
1505 std::copy(msg.data.begin(), msg.data.end(), contents.begin() + 1);
1506 } else {
1507 // Initialize with zeroes, and then write the message type string starting at offset 1.
1508 // This means contents[0] and the unused positions in contents[1..13] remain 0x00.
1509 contents.resize(1 + CMessageHeader::MESSAGE_TYPE_SIZE + msg.data.size(), 0);
1510 std::copy(msg.m_type.begin(), msg.m_type.end(), contents.data() + 1);
1511 std::copy(msg.data.begin(), msg.data.end(), contents.begin() + 1 + CMessageHeader::MESSAGE_TYPE_SIZE);
1512 }
1513 // Construct ciphertext in send buffer.
1514 m_send_buffer.resize(contents.size() + BIP324Cipher::EXPANSION);
1515 m_cipher.Encrypt(MakeByteSpan(contents), {}, false, MakeWritableByteSpan(m_send_buffer));
1516 m_send_type = msg.m_type;
1517 // Release memory
1518 ClearShrink(msg.data);
1519 return true;
1520}
1521
1522Transport::BytesToSend V2Transport::GetBytesToSend(bool have_next_message) const noexcept
1523{
1524 AssertLockNotHeld(m_send_mutex);
1525 LOCK(m_send_mutex);
1526 if (m_send_state == SendState::V1) return m_v1_fallback.GetBytesToSend(have_next_message);
1527
1528 if (m_send_state == SendState::MAYBE_V1) Assume(m_send_buffer.empty());
1529 Assume(m_send_pos <= m_send_buffer.size());
1530 return {
1531 std::span{m_send_buffer}.subspan(m_send_pos),
1532 // We only have more to send after the current m_send_buffer if there is a (next)
1533 // message to be sent, and we're capable of sending packets. */
1534 have_next_message && m_send_state == SendState::READY,
1535 m_send_type
1536 };
1537}
1538
1539void V2Transport::MarkBytesSent(size_t bytes_sent) noexcept
1540{
1541 AssertLockNotHeld(m_send_mutex);
1542 LOCK(m_send_mutex);
1543 if (m_send_state == SendState::V1) return m_v1_fallback.MarkBytesSent(bytes_sent);
1544
1545 if (m_send_state == SendState::AWAITING_KEY && m_send_pos == 0 && bytes_sent > 0) {
1546 LogDebug(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
1547 }
1548
1549 m_send_pos += bytes_sent;
1550 Assume(m_send_pos <= m_send_buffer.size());
1551 if (m_send_pos >= CMessageHeader::HEADER_SIZE) {
1552 m_sent_v1_header_worth = true;
1553 }
1554 // Wipe the buffer when everything is sent.
1555 if (m_send_pos == m_send_buffer.size()) {
1556 m_send_pos = 0;
1557 ClearShrink(m_send_buffer);
1558 }
1559}
1560
1562{
1563 AssertLockNotHeld(m_send_mutex);
1564 AssertLockNotHeld(m_recv_mutex);
1565 // Only outgoing connections need reconnection.
1566 if (!m_initiating) return false;
1567
1568 LOCK(m_recv_mutex);
1569 // We only reconnect in the very first state and when the receive buffer is empty. Together
1570 // these conditions imply nothing has been received so far.
1571 if (m_recv_state != RecvState::KEY) return false;
1572 if (!m_recv_buffer.empty()) return false;
1573 // Check if we've sent enough for the other side to disconnect us (if it was V1).
1574 LOCK(m_send_mutex);
1575 return m_sent_v1_header_worth;
1576}
1577
1578size_t V2Transport::GetSendMemoryUsage() const noexcept
1579{
1580 AssertLockNotHeld(m_send_mutex);
1581 LOCK(m_send_mutex);
1582 if (m_send_state == SendState::V1) return m_v1_fallback.GetSendMemoryUsage();
1583
1584 return sizeof(m_send_buffer) + memusage::DynamicUsage(m_send_buffer);
1585}
1586
1588{
1589 AssertLockNotHeld(m_recv_mutex);
1590 LOCK(m_recv_mutex);
1591 if (m_recv_state == RecvState::V1) return m_v1_fallback.GetInfo();
1592
1593 Transport::Info info;
1594
1595 // Do not report v2 and session ID until the version packet has been received
1596 // and verified (confirming that the other side very likely has the same keys as us).
1597 if (m_recv_state != RecvState::KEY_MAYBE_V1 && m_recv_state != RecvState::KEY &&
1598 m_recv_state != RecvState::GARB_GARBTERM && m_recv_state != RecvState::VERSION) {
1601 } else {
1603 }
1604
1605 return info;
1606}
1607
1608std::pair<size_t, bool> CConnman::SocketSendData(CNode& node) const
1609{
1610 auto it = node.vSendMsg.begin();
1611 size_t nSentSize = 0;
1612 bool data_left{false};
1613 std::optional<bool> expected_more;
1614
1615 while (true) {
1616 if (it != node.vSendMsg.end()) {
1617 // If possible, move one message from the send queue to the transport. This fails when
1618 // there is an existing message still being sent, or (for v2 transports) when the
1619 // handshake has not yet completed.
1620 size_t memusage = it->GetMemoryUsage();
1621 if (node.m_transport->SetMessageToSend(*it)) {
1622 // Update memory usage of send buffer (as *it will be deleted).
1623 node.m_send_memusage -= memusage;
1624 ++it;
1625 }
1626 }
1627 const auto& [data, more, msg_type] = node.m_transport->GetBytesToSend(it != node.vSendMsg.end());
1628 // We rely on the 'more' value returned by GetBytesToSend to correctly predict whether more
1629 // bytes are still to be sent, to correctly set the MSG_MORE flag. As a sanity check,
1630 // verify that the previously returned 'more' was correct.
1631 if (expected_more.has_value()) Assume(!data.empty() == *expected_more);
1632 expected_more = more;
1633 data_left = !data.empty(); // will be overwritten on next loop if all of data gets sent
1634 int nBytes = 0;
1635 if (!data.empty()) {
1636 LOCK(node.m_sock_mutex);
1637 // There is no socket in case we've already disconnected, or in test cases without
1638 // real connections. In these cases, we bail out immediately and just leave things
1639 // in the send queue and transport.
1640 if (!node.m_sock) {
1641 break;
1642 }
1644#ifdef MSG_MORE
1645 if (more) {
1646 flags |= MSG_MORE;
1647 }
1648#endif
1649 nBytes = node.m_sock->Send(data.data(), data.size(), flags);
1650 }
1651 if (nBytes > 0) {
1652 node.m_last_send = NodeClock::now();
1653 node.nSendBytes += nBytes;
1654 // Notify transport that bytes have been processed.
1655 node.m_transport->MarkBytesSent(nBytes);
1656 // Update statistics per message type.
1657 if (!msg_type.empty()) { // don't report v2 handshake bytes for now
1658 node.AccountForSentBytes(msg_type, nBytes);
1659 }
1660 nSentSize += nBytes;
1661 if ((size_t)nBytes != data.size()) {
1662 // could not send full message; stop sending more
1663 break;
1664 }
1665 } else {
1666 if (nBytes < 0) {
1667 // error
1668 int nErr = WSAGetLastError();
1669 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) {
1670 LogDebug(BCLog::NET, "socket send error, %s: %s", node.DisconnectMsg(), NetworkErrorString(nErr));
1671 node.CloseSocketDisconnect();
1672 }
1673 }
1674 break;
1675 }
1676 }
1677
1678 node.fPauseSend = node.m_send_memusage + node.m_transport->GetSendMemoryUsage() > nSendBufferMaxSize;
1679
1680 if (it == node.vSendMsg.end()) {
1681 assert(node.m_send_memusage == 0);
1682 }
1683 node.vSendMsg.erase(node.vSendMsg.begin(), it);
1684 return {nSentSize, data_left};
1685}
1686
1695bool CConnman::AttemptToEvictConnection(bool evict_tx_relay_peer_only, std::optional<NodeId> protect_peer)
1696{
1698
1699 std::vector<NodeEvictionCandidate> vEvictionCandidates;
1700 {
1701
1703 for (const CNode* node : m_nodes) {
1704 if (node->fDisconnect)
1705 continue;
1706 if (protect_peer.has_value() && node->GetId() == protect_peer) {
1707 continue;
1708 }
1709 if (evict_tx_relay_peer_only && !node->m_relays_txs) {
1710 continue;
1711 }
1712 NodeEvictionCandidate candidate{
1713 .id = node->GetId(),
1714 .m_connected = node->m_connected,
1715 .m_min_ping_time = node->m_min_ping_time,
1716 .m_last_block_time = node->m_last_block_time,
1717 .m_last_tx_time = node->m_last_tx_time,
1718 .fRelevantServices = node->m_has_all_wanted_services,
1719 .m_relay_txs = node->m_relays_txs.load(),
1720 .fBloomFilter = node->m_bloom_filter_loaded.load(),
1721 .nKeyedNetGroup = node->nKeyedNetGroup,
1722 .prefer_evict = node->m_prefer_evict,
1723 .m_is_local = node->addr.IsLocal(),
1724 .m_network = node->ConnectedThroughNetwork(),
1725 .m_noban = node->HasPermission(NetPermissionFlags::NoBan),
1726 .m_conn_type = node->m_conn_type,
1727 };
1728 vEvictionCandidates.push_back(candidate);
1729 }
1730 }
1731 const std::optional<NodeId> node_id_to_evict = SelectNodeToEvict(std::move(vEvictionCandidates));
1732 if (!node_id_to_evict) {
1733 return false;
1734 }
1736 for (CNode* pnode : m_nodes) {
1737 if (pnode->GetId() == *node_id_to_evict) {
1738 LogDebug(BCLog::NET, "selected %s connection for eviction, %s", pnode->ConnectionTypeAsString(), pnode->DisconnectMsg());
1739 TRACEPOINT(net, evicted_inbound_connection,
1740 pnode->GetId(),
1741 pnode->m_addr_name.c_str(),
1742 pnode->ConnectionTypeAsString().c_str(),
1743 pnode->ConnectedThroughNetwork(),
1744 TicksSinceEpoch<std::chrono::seconds>(pnode->m_connected));
1745 pnode->fDisconnect = true;
1746 return true;
1747 }
1748 }
1749 return false;
1750}
1751
1752void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
1754
1755 struct sockaddr_storage sockaddr;
1756 socklen_t len = sizeof(sockaddr);
1757 auto sock = hListenSocket.sock->Accept((struct sockaddr*)&sockaddr, &len);
1758
1759 if (!sock) {
1760 const int nErr = WSAGetLastError();
1761 if (nErr != WSAEWOULDBLOCK) {
1762 LogInfo("socket error accept failed: %s\n", NetworkErrorString(nErr));
1763 }
1764 return;
1765 }
1766
1767 CService addr;
1768 if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr, len)) {
1769 LogWarning("Unknown socket family\n");
1770 } else {
1771 addr = MaybeFlipIPv6toCJDNS(addr);
1772 }
1773
1774 const CService addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(*sock))};
1775
1777 hListenSocket.AddSocketPermissionFlags(permission_flags);
1778
1779 CreateNodeFromAcceptedSocket(std::move(sock), permission_flags, addr_bind, addr);
1780}
1781
1782void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
1783 NetPermissionFlags permission_flags,
1784 const CService& addr_bind,
1785 const CService& addr)
1786{
1788
1789 int nInbound = 0;
1790
1791 const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
1792
1793 // Tor inbound connections do not reveal the peer's actual network address.
1794 // Therefore do not apply address-based whitelist permissions to them.
1795 AddWhitelistPermissionFlags(permission_flags, inbound_onion ? std::optional<CNetAddr>{} : addr, vWhitelistedRangeIncoming);
1796
1797 {
1799 for (const CNode* pnode : m_nodes) {
1800 if (pnode->IsInboundConn()) nInbound++;
1801 }
1802 }
1803
1804 if (!fNetworkActive) {
1805 LogDebug(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
1806 return;
1807 }
1808
1809 if (!sock->IsSelectable()) {
1810 LogInfo("connection from %s dropped: non-selectable socket\n", addr.ToStringAddrPort());
1811 return;
1812 }
1813
1814 // According to the internet TCP_NODELAY is not carried into accepted sockets
1815 // on all platforms. Set it again here just to be sure.
1816 const int on{1};
1817 if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
1818 LogDebug(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
1819 addr.ToStringAddrPort());
1820 }
1821
1822 // Don't accept connections from banned peers.
1823 bool banned = m_banman && m_banman->IsBanned(addr);
1824 if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && banned)
1825 {
1826 LogDebug(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
1827 return;
1828 }
1829
1830 // Only accept connections from discouraged peers if our inbound slots aren't (almost) full.
1831 bool discouraged = m_banman && m_banman->IsDiscouraged(addr);
1832 if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && nInbound + 1 >= m_max_inbound && discouraged)
1833 {
1834 LogDebug(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
1835 return;
1836 }
1837
1838 if (nInbound >= m_max_inbound)
1839 {
1840 if (!AttemptToEvictConnection(/*evict_tx_relay_peer_only=*/false)) {
1841 // No connection to evict, disconnect the new connection
1842 LogDebug(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
1843 return;
1844 }
1845 }
1846
1847 NodeId id = GetNewNodeId();
1849
1850 // The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
1851 // detected, so use it whenever we signal NODE_P2P_V2.
1852 ServiceFlags local_services = GetLocalServices();
1853 const bool use_v2transport(local_services & NODE_P2P_V2);
1854
1856 .Write(inbound_onion ? NET_ONION : addr.GetNetClass())
1857 .Write(addr_bind.GetAddrBytes())
1858 .Write(addr_bind.GetPort()) // inbound connections use bind port
1859 .Finalize();
1860 CNode* pnode = new CNode(id,
1861 std::move(sock),
1862 CAddress{addr, NODE_NONE},
1864 nonce,
1865 addr_bind,
1866 /*addrNameIn=*/"",
1868 inbound_onion,
1869 network_id,
1871 .permission_flags = permission_flags,
1872 .prefer_evict = discouraged,
1873 .recv_flood_size = nReceiveFloodSize,
1874 .use_v2transport = use_v2transport,
1875 });
1876 pnode->AddRef();
1877 m_msgproc->InitializeNode(*pnode, local_services);
1878 {
1880 m_nodes.push_back(pnode);
1881 }
1882 LogDebug(BCLog::NET, "connection from %s accepted\n", addr.ToStringAddrPort());
1883 TRACEPOINT(net, inbound_connection,
1884 pnode->GetId(),
1885 pnode->m_addr_name.c_str(),
1886 pnode->ConnectionTypeAsString().c_str(),
1887 pnode->ConnectedThroughNetwork(),
1889
1890 // We received a new connection, harvest entropy from the time (and our peer count)
1891 RandAddEvent((uint32_t)id);
1892}
1893
1894bool CConnman::AddConnection(const std::string& address, ConnectionType conn_type, bool use_v2transport = false)
1895{
1898 std::optional<int> max_connections;
1899 switch (conn_type) {
1903 return false;
1905 max_connections = m_max_outbound_full_relay;
1906 break;
1908 max_connections = m_max_outbound_block_relay;
1909 break;
1910 // no limit for ADDR_FETCH because -seednode has no limit either
1912 break;
1913 // no limit for FEELER connections since they're short-lived
1915 break;
1916 } // no default case, so the compiler can warn about missing cases
1917
1918 // Count existing connections
1919 int existing_connections = WITH_LOCK(m_nodes_mutex,
1920 return std::count_if(m_nodes.begin(), m_nodes.end(), [conn_type](CNode* node) { return node->m_conn_type == conn_type; }););
1921
1922 // Max connections of specified type already exist
1923 if (max_connections != std::nullopt && existing_connections >= max_connections) return false;
1924
1925 // Max total outbound connections already exist
1927 if (!grant) return false;
1928
1929 OpenNetworkConnection(/*addrConnect=*/CAddress{},
1930 /*fCountFailure=*/false,
1931 /*grant_outbound=*/std::move(grant),
1932 /*pszDest=*/address.c_str(),
1933 /*conn_type=*/conn_type,
1934 /*use_v2transport=*/use_v2transport,
1935 /*proxy_override=*/std::nullopt);
1936 return true;
1937}
1938
1940{
1943
1944 // Use a temporary variable to accumulate desired reconnections, so we don't need
1945 // m_reconnections_mutex while holding m_nodes_mutex.
1946 decltype(m_reconnections) reconnections_to_add;
1947
1948 {
1950
1951 const bool network_active{fNetworkActive};
1952 if (!network_active) {
1953 // Disconnect any connected nodes
1954 for (CNode* pnode : m_nodes) {
1955 if (!pnode->fDisconnect) {
1956 LogDebug(BCLog::NET, "Network not active, %s", pnode->DisconnectMsg());
1957 pnode->fDisconnect = true;
1958 }
1959 }
1960 }
1961
1962 // Disconnect unused nodes
1963 std::vector<CNode*> nodes_copy = m_nodes;
1964 for (CNode* pnode : nodes_copy)
1965 {
1966 if (pnode->fDisconnect)
1967 {
1968 // remove from m_nodes
1969 m_nodes.erase(remove(m_nodes.begin(), m_nodes.end(), pnode), m_nodes.end());
1970
1971 // Add to reconnection list if appropriate. We don't reconnect right here, because
1972 // the creation of a connection is a blocking operation (up to several seconds),
1973 // and we don't want to hold up the socket handler thread for that long.
1974 if (network_active && pnode->m_transport->ShouldReconnectV1()) {
1975 reconnections_to_add.push_back({
1976 .proxy_override = pnode->m_proxy_override,
1977 .addr_connect = pnode->addr,
1978 .grant = std::move(pnode->grantOutbound),
1979 .destination = pnode->m_dest,
1980 .conn_type = pnode->m_conn_type,
1981 .use_v2transport = false});
1982 LogDebug(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
1983 }
1984
1985 // release outbound grant (if any)
1986 pnode->grantOutbound.Release();
1987
1988 // close socket and cleanup
1989 pnode->CloseSocketDisconnect();
1990
1991 // update connection count by network
1992 if (pnode->IsManualOrFullOutboundConn()) --m_network_conn_counts[pnode->addr.GetNetwork()];
1993
1994 // hold in disconnected pool until all refs are released
1995 pnode->Release();
1996 m_nodes_disconnected.push_back(pnode);
1997 }
1998 }
1999 }
2000 {
2001 // Delete disconnected nodes
2002 std::list<CNode*> nodes_disconnected_copy = m_nodes_disconnected;
2003 for (CNode* pnode : nodes_disconnected_copy)
2004 {
2005 // Destroy the object only after other threads have stopped using it.
2006 if (pnode->GetRefCount() <= 0) {
2007 m_nodes_disconnected.remove(pnode);
2008 DeleteNode(pnode);
2009 }
2010 }
2011 }
2012 {
2013 // Move entries from reconnections_to_add to m_reconnections.
2015 m_reconnections.splice(m_reconnections.end(), std::move(reconnections_to_add));
2016 }
2017}
2018
2020{
2022
2023 size_t nodes_size;
2024 {
2026 nodes_size = m_nodes.size();
2027 }
2028 if(nodes_size != nPrevNodeCount) {
2029 nPrevNodeCount = nodes_size;
2030 if (m_client_interface) {
2031 m_client_interface->NotifyNumConnectionsChanged(nodes_size);
2032 }
2033 }
2034}
2035
2037{
2038 return node.m_connected + m_peer_connect_timeout < now;
2039}
2040
2042{
2043 // Tests that see disconnects after using mocktime can start nodes with a
2044 // large timeout. For example, -peertimeout=999999999.
2045 const auto last_send{node.m_last_send.load()};
2046 const auto last_recv{node.m_last_recv.load()};
2047
2048 if (!ShouldRunInactivityChecks(node, now)) return false;
2049
2050 bool has_received{last_recv > NodeClock::epoch};
2051 bool has_sent{last_send > NodeClock::epoch};
2052
2053 if (!has_received || !has_sent) {
2054 std::string has_never;
2055 if (!has_received) has_never += ", never received from peer";
2056 if (!has_sent) has_never += ", never sent to peer";
2058 "socket no message in first %i seconds%s, %s",
2060 has_never,
2061 node.DisconnectMsg()
2062 );
2063 return true;
2064 }
2065
2066 if (now > last_send + TIMEOUT_INTERVAL) {
2068 "socket sending timeout: %is, %s", Ticks<std::chrono::seconds>(now - last_send),
2069 node.DisconnectMsg()
2070 );
2071 return true;
2072 }
2073
2074 if (now > last_recv + TIMEOUT_INTERVAL) {
2076 "socket receive timeout: %is, %s", Ticks<std::chrono::seconds>(now - last_recv),
2077 node.DisconnectMsg()
2078 );
2079 return true;
2080 }
2081
2082 if (!node.fSuccessfullyConnected) {
2083 if (node.m_transport->GetInfo().transport_type == TransportProtocolType::DETECTING) {
2084 LogDebug(BCLog::NET, "V2 handshake timeout, %s", node.DisconnectMsg());
2085 } else {
2086 LogDebug(BCLog::NET, "version handshake timeout, %s", node.DisconnectMsg());
2087 }
2088 return true;
2089 }
2090
2091 return false;
2092}
2093
2095{
2096 Sock::EventsPerSock events_per_sock;
2097
2098 for (const ListenSocket& hListenSocket : vhListenSocket) {
2099 events_per_sock.emplace(hListenSocket.sock, Sock::Events{Sock::RecvEvent});
2100 }
2101
2102 for (CNode* pnode : nodes) {
2103 bool select_recv = !pnode->fPauseRecv;
2104 bool select_send;
2105 {
2106 LOCK(pnode->cs_vSend);
2107 // Sending is possible if either there are bytes to send right now, or if there will be
2108 // once a potential message from vSendMsg is handed to the transport. GetBytesToSend
2109 // determines both of these in a single call.
2110 const auto& [to_send, more, _msg_type] = pnode->m_transport->GetBytesToSend(!pnode->vSendMsg.empty());
2111 select_send = !to_send.empty() || more;
2112 }
2113 if (!select_recv && !select_send) continue;
2114
2115 LOCK(pnode->m_sock_mutex);
2116 if (pnode->m_sock) {
2117 Sock::Event event = (select_send ? Sock::SendEvent : 0) | (select_recv ? Sock::RecvEvent : 0);
2118 events_per_sock.emplace(pnode->m_sock, Sock::Events{event});
2119 }
2120 }
2121
2122 return events_per_sock;
2123}
2124
2126{
2129
2130 Sock::EventsPerSock events_per_sock;
2131
2132 {
2133 const NodesSnapshot snap{*this, /*shuffle=*/false};
2134
2135 const auto timeout = std::chrono::milliseconds(SELECT_TIMEOUT_MILLISECONDS);
2136
2137 // Check for the readiness of the already connected sockets and the
2138 // listening sockets in one call ("readiness" as in poll(2) or
2139 // select(2)). If none are ready, wait for a short while and return
2140 // empty sets.
2141 events_per_sock = GenerateWaitSockets(snap.Nodes());
2142 if (events_per_sock.empty() || !events_per_sock.begin()->first->WaitMany(timeout, events_per_sock)) {
2143 m_interrupt_net->sleep_for(timeout);
2144 }
2145
2146 // Service (send/receive) each of the already connected nodes.
2147 SocketHandlerConnected(snap.Nodes(), events_per_sock);
2148 }
2149
2150 // Accept new connections from listening sockets.
2151 SocketHandlerListening(events_per_sock);
2152}
2153
2154void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
2155 const Sock::EventsPerSock& events_per_sock)
2156{
2158
2159 const auto now{NodeClock::now()};
2160
2161 for (CNode* pnode : nodes) {
2162 if (m_interrupt_net->interrupted()) {
2163 return;
2164 }
2165
2166 //
2167 // Receive
2168 //
2169 bool recvSet = false;
2170 bool sendSet = false;
2171 bool errorSet = false;
2172 {
2173 LOCK(pnode->m_sock_mutex);
2174 if (!pnode->m_sock) {
2175 continue;
2176 }
2177 const auto it = events_per_sock.find(pnode->m_sock);
2178 if (it != events_per_sock.end()) {
2179 recvSet = it->second.occurred & Sock::RecvEvent;
2180 sendSet = it->second.occurred & Sock::SendEvent;
2181 errorSet = it->second.occurred & Sock::ErrorEvent;
2182 }
2183 }
2184
2185 if (sendSet) {
2186 // Send data
2187 auto [bytes_sent, data_left] = WITH_LOCK(pnode->cs_vSend, return SocketSendData(*pnode));
2188 if (bytes_sent) {
2189 RecordBytesSent(bytes_sent);
2190
2191 // If both receiving and (non-optimistic) sending were possible, we first attempt
2192 // sending. If that succeeds, but does not fully drain the send queue, do not
2193 // attempt to receive. This avoids needlessly queueing data if the remote peer
2194 // is slow at receiving data, by means of TCP flow control. We only do this when
2195 // sending actually succeeded to make sure progress is always made; otherwise a
2196 // deadlock would be possible when both sides have data to send, but neither is
2197 // receiving.
2198 if (data_left) recvSet = false;
2199 }
2200 }
2201
2202 if (recvSet || errorSet)
2203 {
2204 // typical socket buffer is 8K-64K
2205 uint8_t pchBuf[0x10000];
2206 int nBytes = 0;
2207 {
2208 LOCK(pnode->m_sock_mutex);
2209 if (!pnode->m_sock) {
2210 continue;
2211 }
2212 nBytes = pnode->m_sock->Recv(pchBuf, sizeof(pchBuf), MSG_DONTWAIT);
2213 }
2214 if (nBytes > 0)
2215 {
2216 bool notify = false;
2217 if (!pnode->ReceiveMsgBytes({pchBuf, (size_t)nBytes}, notify)) {
2219 "receiving message bytes failed, %s",
2220 pnode->DisconnectMsg()
2221 );
2222 pnode->CloseSocketDisconnect();
2223 }
2224 RecordBytesRecv(nBytes);
2225 if (notify) {
2226 pnode->MarkReceivedMsgsForProcessing();
2228 }
2229 }
2230 else if (nBytes == 0)
2231 {
2232 // socket closed gracefully
2233 if (!pnode->fDisconnect) {
2234 LogDebug(BCLog::NET, "socket closed, %s", pnode->DisconnectMsg());
2235 }
2236 pnode->CloseSocketDisconnect();
2237 }
2238 else if (nBytes < 0)
2239 {
2240 // error
2241 int nErr = WSAGetLastError();
2242 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
2243 {
2244 if (!pnode->fDisconnect) {
2245 LogDebug(BCLog::NET, "socket recv error, %s: %s", pnode->DisconnectMsg(), NetworkErrorString(nErr));
2246 }
2247 pnode->CloseSocketDisconnect();
2248 }
2249 }
2250 }
2251
2252 if (InactivityCheck(*pnode, now)) pnode->fDisconnect = true;
2253 }
2254}
2255
2257{
2259
2260 for (const ListenSocket& listen_socket : vhListenSocket) {
2261 if (m_interrupt_net->interrupted()) {
2262 return;
2263 }
2264 const auto it = events_per_sock.find(listen_socket.sock);
2265 if (it != events_per_sock.end() && it->second.occurred & Sock::RecvEvent) {
2266 AcceptConnection(listen_socket);
2267 }
2268 }
2269}
2270
2272{
2274
2275 while (!m_interrupt_net->interrupted()) {
2278 SocketHandler();
2279 }
2280}
2281
2283{
2284 {
2286 fMsgProcWake = true;
2287 }
2288 condMsgProc.notify_one();
2289}
2290
2292{
2293 int outbound_connection_count = 0;
2294
2295 if (!gArgs.GetArgs("-seednode").empty()) {
2296 auto start = NodeClock::now();
2297 constexpr std::chrono::seconds SEEDNODE_TIMEOUT = 30s;
2298 LogInfo("-seednode enabled. Trying the provided seeds for %d seconds before defaulting to the dnsseeds.\n", SEEDNODE_TIMEOUT.count());
2299 while (!m_interrupt_net->interrupted()) {
2300 if (!m_interrupt_net->sleep_for(500ms)) {
2301 return;
2302 }
2303
2304 // Abort if we have spent enough time without reaching our target.
2305 // Giving seed nodes 30 seconds so this does not become a race against fixedseeds (which triggers after 1 min)
2306 if (NodeClock::now() > start + SEEDNODE_TIMEOUT) {
2307 LogInfo("Couldn't connect to enough peers via seed nodes. Handing fetch logic to the DNS seeds.\n");
2308 break;
2309 }
2310
2311 outbound_connection_count = GetFullOutboundConnCount();
2312 if (outbound_connection_count >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
2313 LogInfo("P2P peers available. Finished fetching data from seed nodes.\n");
2314 break;
2315 }
2316 }
2317 }
2318
2320 std::vector<std::string> seeds = m_params.DNSSeeds();
2321 std::shuffle(seeds.begin(), seeds.end(), rng);
2322 int seeds_right_now = 0; // Number of seeds left before testing if we have enough connections
2323
2324 if (gArgs.GetBoolArg("-forcednsseed", DEFAULT_FORCEDNSSEED)) {
2325 // When -forcednsseed is provided, query all.
2326 seeds_right_now = seeds.size();
2327 } else if (addrman.get().Size() == 0) {
2328 // If we have no known peers, query all.
2329 // This will occur on the first run, or if peers.dat has been
2330 // deleted.
2331 seeds_right_now = seeds.size();
2332 }
2333
2334 // Proceed with dnsseeds if seednodes hasn't reached the target or if forcednsseed is set
2335 if (outbound_connection_count < SEED_OUTBOUND_CONNECTION_THRESHOLD || seeds_right_now) {
2336 // goal: only query DNS seed if address need is acute
2337 // * If we have a reasonable number of peers in addrman, spend
2338 // some time trying them first. This improves user privacy by
2339 // creating fewer identifying DNS requests, reduces trust by
2340 // giving seeds less influence on the network topology, and
2341 // reduces traffic to the seeds.
2342 // * When querying DNS seeds query a few at once, this ensures
2343 // that we don't give DNS seeds the ability to eclipse nodes
2344 // that query them.
2345 // * If we continue having problems, eventually query all the
2346 // DNS seeds, and if that fails too, also try the fixed seeds.
2347 // (done in ThreadOpenConnections)
2348 int found = 0;
2349 const std::chrono::seconds seeds_wait_time = (addrman.get().Size() >= DNSSEEDS_DELAY_PEER_THRESHOLD ? DNSSEEDS_DELAY_MANY_PEERS : DNSSEEDS_DELAY_FEW_PEERS);
2350
2351 for (const std::string& seed : seeds) {
2352 if (seeds_right_now == 0) {
2353 seeds_right_now += DNSSEEDS_TO_QUERY_AT_ONCE;
2354
2355 if (addrman.get().Size() > 0) {
2356 LogInfo("Waiting %d seconds before querying DNS seeds.\n", seeds_wait_time.count());
2357 std::chrono::seconds to_wait = seeds_wait_time;
2358 while (to_wait.count() > 0) {
2359 // if sleeping for the MANY_PEERS interval, wake up
2360 // early to see if we have enough peers and can stop
2361 // this thread entirely freeing up its resources
2362 std::chrono::seconds w = std::min(DNSSEEDS_DELAY_FEW_PEERS, to_wait);
2363 if (!m_interrupt_net->sleep_for(w)) return;
2364 to_wait -= w;
2365
2367 if (found > 0) {
2368 LogInfo("%d addresses found from DNS seeds\n", found);
2369 LogInfo("P2P peers available. Finished DNS seeding.\n");
2370 } else {
2371 LogInfo("P2P peers available. Skipped DNS seeding.\n");
2372 }
2373 return;
2374 }
2375 }
2376 }
2377 }
2378
2379 if (m_interrupt_net->interrupted()) return;
2380
2381 // hold off on querying seeds if P2P network deactivated
2382 if (!fNetworkActive) {
2383 LogInfo("Waiting for network to be reactivated before querying DNS seeds.\n");
2384 do {
2385 if (!m_interrupt_net->sleep_for(1s)) return;
2386 } while (!fNetworkActive);
2387 }
2388
2389 LogInfo("Loading addresses from DNS seed %s\n", seed);
2390 // If -proxy is in use, we make an ADDR_FETCH connection to the DNS resolved peer address
2391 // for the base dns seed domain in chainparams
2392 if (HaveNameProxy()) {
2393 AddAddrFetch(seed);
2394 } else {
2395 std::vector<CAddress> vAdd;
2396 constexpr ServiceFlags requiredServiceBits{SeedsServiceFlags()};
2397 std::string host = strprintf("x%x.%s", requiredServiceBits, seed);
2398 CNetAddr resolveSource;
2399 if (!resolveSource.SetInternal(host)) {
2400 continue;
2401 }
2402 // Limit number of IPs learned from a single DNS seed. This limit exists to prevent the results from
2403 // one DNS seed from dominating AddrMan. Note that the number of results from a UDP DNS query is
2404 // bounded to 33 already, but it is possible for it to use TCP where a larger number of results can be
2405 // returned.
2406 unsigned int nMaxIPs = 32;
2407 const auto addresses{LookupHost(host, nMaxIPs, true)};
2408 if (!addresses.empty()) {
2409 for (const CNetAddr& ip : addresses) {
2411 addr.nTime = rng.rand_uniform_delay(Now<NodeSeconds>() - 3 * 24h, -4 * 24h); // use a random age between 3 and 7 days old
2412 vAdd.push_back(addr);
2413 found++;
2414 }
2415 addrman.get().Add(vAdd, resolveSource);
2416 } else {
2417 // If the seed does not support a subdomain with our desired service bits,
2418 // we make an ADDR_FETCH connection to the DNS resolved peer address for the
2419 // base dns seed domain in chainparams
2420 AddAddrFetch(seed);
2421 }
2422 }
2423 --seeds_right_now;
2424 }
2425 LogInfo("%d addresses found from DNS seeds\n", found);
2426 } else {
2427 LogInfo("Skipping DNS seeds. Enough peers have been found\n");
2428 }
2429}
2430
2432{
2433 const auto start{SteadyClock::now()};
2434
2436
2437 LogDebug(BCLog::NET, "Flushed %d addresses to peers.dat %dms",
2438 addrman.get().Size(), Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
2439}
2440
2442{
2445 std::string strDest;
2446 {
2448 if (m_addr_fetches.empty())
2449 return;
2450 strDest = m_addr_fetches.front();
2451 m_addr_fetches.pop_front();
2452 }
2453 // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
2454 // peer doesn't support it or immediately disconnects us for another reason.
2456 CAddress addr;
2457 CountingSemaphoreGrant<> grant(*semOutbound, /*fTry=*/true);
2458 if (grant) {
2459 OpenNetworkConnection(/*addrConnect=*/addr,
2460 /*fCountFailure=*/false,
2461 /*grant_outbound=*/std::move(grant),
2462 /*pszDest=*/strDest.c_str(),
2463 /*conn_type=*/ConnectionType::ADDR_FETCH,
2464 /*use_v2transport=*/use_v2transport,
2465 /*proxy_override=*/std::nullopt);
2466 }
2467}
2468
2470{
2472}
2473
2475{
2477 LogDebug(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
2478}
2479
2481{
2482 LogDebug(BCLog::NET, "enabling extra block-relay-only peers\n");
2484}
2485
2486// Return the number of outbound connections that are full relay (not blocks only)
2488{
2490
2491 int nRelevant = 0;
2492 {
2494 for (const CNode* pnode : m_nodes) {
2495 if (pnode->fSuccessfullyConnected && pnode->IsFullOutboundConn()) ++nRelevant;
2496 }
2497 }
2498 return nRelevant;
2499}
2500
2501// Return the number of peers we have over our outbound connection limit
2502// Exclude peers that are marked for disconnect, or are going to be
2503// disconnected soon (eg ADDR_FETCH and FEELER)
2504// Also exclude peers that haven't finished initial connection handshake yet
2505// (so that we don't decide we're over our desired connection limit, and then
2506// evict some peer that has finished the handshake)
2508{
2510
2511 int full_outbound_peers = 0;
2512 {
2514 for (const CNode* pnode : m_nodes) {
2515 if (pnode->fSuccessfullyConnected && !pnode->fDisconnect && pnode->IsFullOutboundConn()) {
2516 ++full_outbound_peers;
2517 }
2518 }
2519 }
2520 return std::max(full_outbound_peers - m_max_outbound_full_relay, 0);
2521}
2522
2524{
2526
2527 int block_relay_peers = 0;
2528 {
2530 for (const CNode* pnode : m_nodes) {
2531 if (pnode->fSuccessfullyConnected && !pnode->fDisconnect && pnode->IsBlockOnlyConn()) {
2532 ++block_relay_peers;
2533 }
2534 }
2535 }
2536 return std::max(block_relay_peers - m_max_outbound_block_relay, 0);
2537}
2538
2539bool CConnman::EvictTxPeerIfFull(std::optional<NodeId> protect_peer)
2540{
2541 int tx_inbound_peers{0};
2542 {
2544 for (const CNode* pnode : m_nodes) {
2545 if (!pnode->fDisconnect && pnode->IsInboundConn() && pnode->m_relays_txs) {
2546 ++tx_inbound_peers;
2547 }
2548 }
2549 }
2550 if (tx_inbound_peers > m_max_inbound_full_relay) {
2551 return AttemptToEvictConnection(/*evict_tx_relay_peer_only=*/true, protect_peer);
2552 }
2553 return true;
2554}
2555
2556std::unordered_set<Network> CConnman::GetReachableEmptyNetworks() const
2557{
2558 std::unordered_set<Network> networks{};
2559 for (int n = 0; n < NET_MAX; n++) {
2560 enum Network net = (enum Network)n;
2561 if (net == NET_UNROUTABLE || net == NET_INTERNAL) continue;
2562 if (g_reachable_nets.Contains(net) && addrman.get().Size(net, std::nullopt) == 0) {
2563 networks.insert(net);
2564 }
2565 }
2566 return networks;
2567}
2568
2570{
2572 return m_network_conn_counts[net] > 1;
2573}
2574
2575bool CConnman::MaybePickPreferredNetwork(std::optional<Network>& network)
2576{
2578
2579 std::array<Network, 5> nets{NET_IPV4, NET_IPV6, NET_ONION, NET_I2P, NET_CJDNS};
2580 std::shuffle(nets.begin(), nets.end(), FastRandomContext());
2581
2583 for (const auto net : nets) {
2584 if (g_reachable_nets.Contains(net) && m_network_conn_counts[net] == 0 && addrman.get().Size(net) != 0) {
2585 network = net;
2586 return true;
2587 }
2588 }
2589
2590 return false;
2591}
2592
2593void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, std::span<const std::string> seed_nodes)
2594{
2598
2600 // Connect to specific addresses
2601 if (!connect.empty())
2602 {
2603 // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
2604 // peer doesn't support it or immediately disconnects us for another reason.
2606 for (int64_t nLoop = 0;; nLoop++)
2607 {
2608 for (const std::string& strAddr : connect)
2609 {
2611 /*fCountFailure=*/false,
2612 /*grant_outbound=*/{},
2613 /*pszDest=*/strAddr.c_str(),
2614 /*conn_type=*/ConnectionType::MANUAL,
2615 /*use_v2transport=*/use_v2transport,
2616 /*proxy_override=*/std::nullopt);
2617 for (int i = 0; i < 10 && i < nLoop; i++)
2618 {
2619 if (!m_interrupt_net->sleep_for(500ms)) {
2620 return;
2621 }
2622 }
2623 }
2624 if (!m_interrupt_net->sleep_for(500ms)) {
2625 return;
2626 }
2628 }
2629 }
2630
2631 // Initiate network connections
2632 auto start = GetTime<std::chrono::microseconds>();
2633
2634 // Minimum time before next feeler connection (in microseconds).
2635 auto next_feeler = start + rng.rand_exp_duration(FEELER_INTERVAL);
2636 auto next_extra_block_relay = start + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
2637 auto next_extra_network_peer{start + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL)};
2638 const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
2639 bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
2640 const bool use_seednodes{!gArgs.GetArgs("-seednode").empty()};
2641
2642 auto seed_node_timer = NodeClock::now();
2643 bool add_addr_fetch{addrman.get().Size() == 0 && !seed_nodes.empty()};
2644 constexpr std::chrono::seconds ADD_NEXT_SEEDNODE = 10s;
2645
2646 if (!add_fixed_seeds) {
2647 LogInfo("Fixed seeds are disabled\n");
2648 }
2649
2650 while (!m_interrupt_net->interrupted()) {
2651 if (add_addr_fetch) {
2652 add_addr_fetch = false;
2653 const auto& seed{SpanPopBack(seed_nodes)};
2654 AddAddrFetch(seed);
2655
2656 if (addrman.get().Size() == 0) {
2657 LogInfo("Empty addrman, adding seednode (%s) to addrfetch\n", seed);
2658 } else {
2659 LogInfo("Couldn't connect to peers from addrman after %d seconds. Adding seednode (%s) to addrfetch\n", ADD_NEXT_SEEDNODE.count(), seed);
2660 }
2661 }
2662
2664
2665 if (!m_interrupt_net->sleep_for(500ms)) {
2666 return;
2667 }
2668
2670
2672 if (m_interrupt_net->interrupted()) {
2673 return;
2674 }
2675
2676 const std::unordered_set<Network> fixed_seed_networks{GetReachableEmptyNetworks()};
2677 if (add_fixed_seeds && !fixed_seed_networks.empty()) {
2678 // When the node starts with an empty peers.dat, there are a few other sources of peers before
2679 // we fallback on to fixed seeds: -dnsseed, -seednode, -addnode
2680 // If none of those are available, we fallback on to fixed seeds immediately, else we allow
2681 // 60 seconds for any of those sources to populate addrman.
2682 bool add_fixed_seeds_now = false;
2683 // It is cheapest to check if enough time has passed first.
2684 if (GetTime<std::chrono::seconds>() > start + std::chrono::minutes{1}) {
2685 add_fixed_seeds_now = true;
2686 LogInfo("Adding fixed seeds as 60 seconds have passed and addrman is empty for at least one reachable network\n");
2687 }
2688
2689 // Perform cheap checks before locking a mutex.
2690 else if (!dnsseed && !use_seednodes) {
2692 if (m_added_node_params.empty()) {
2693 add_fixed_seeds_now = true;
2694 LogInfo("Adding fixed seeds as -dnsseed=0 (or IPv4/IPv6 connections are disabled via -onlynet) and neither -addnode nor -seednode are provided\n");
2695 }
2696 }
2697
2698 if (add_fixed_seeds_now) {
2699 std::vector<CAddress> seed_addrs{ConvertSeeds(m_params.FixedSeeds())};
2700 // We will not make outgoing connections to peers that are unreachable
2701 // (e.g. because of -onlynet configuration).
2702 // Therefore, we do not add them to addrman in the first place.
2703 // In case previously unreachable networks become reachable
2704 // (e.g. in case of -onlynet changes by the user), fixed seeds will
2705 // be loaded only for networks for which we have no addresses.
2706 seed_addrs.erase(std::remove_if(seed_addrs.begin(), seed_addrs.end(),
2707 [&fixed_seed_networks](const CAddress& addr) { return !fixed_seed_networks.contains(addr.GetNetwork()); }),
2708 seed_addrs.end());
2709 CNetAddr local;
2710 local.SetInternal("fixedseeds");
2711 addrman.get().Add(seed_addrs, local);
2712 add_fixed_seeds = false;
2713 LogInfo("Added %d fixed seeds from reachable networks.\n", seed_addrs.size());
2714 }
2715 }
2716
2717 //
2718 // Choose an address to connect to based on most recently seen
2719 //
2720 CAddress addrConnect;
2721
2722 // Only connect out to one peer per ipv4/ipv6 network group (/16 for IPv4).
2723 int nOutboundFullRelay = 0;
2724 int nOutboundBlockRelay = 0;
2725 int outbound_privacy_network_peers = 0;
2726 std::set<std::vector<unsigned char>> outbound_ipv46_peer_netgroups;
2727
2728 {
2730 for (const CNode* pnode : m_nodes) {
2731 if (pnode->IsFullOutboundConn()) nOutboundFullRelay++;
2732 if (pnode->IsBlockOnlyConn()) nOutboundBlockRelay++;
2733
2734 // Make sure our persistent outbound slots to ipv4/ipv6 peers belong to different netgroups.
2735 switch (pnode->m_conn_type) {
2736 // We currently don't take inbound connections into account. Since they are
2737 // free to make, an attacker could make them to prevent us from connecting to
2738 // certain peers.
2740 // Short-lived outbound connections should not affect how we select outbound
2741 // peers from addrman.
2745 break;
2749 const CAddress address{pnode->addr};
2750 if (address.IsTor() || address.IsI2P() || address.IsCJDNS()) {
2751 // Since our addrman-groups for these networks are
2752 // random, without relation to the route we
2753 // take to connect to these peers or to the
2754 // difficulty in obtaining addresses with diverse
2755 // groups, we don't worry about diversity with
2756 // respect to our addrman groups when connecting to
2757 // these networks.
2758 ++outbound_privacy_network_peers;
2759 } else {
2760 outbound_ipv46_peer_netgroups.insert(m_netgroupman.GetGroup(address));
2761 }
2762 } // no default case, so the compiler can warn about missing cases
2763 }
2764 }
2765
2766 if (!seed_nodes.empty() && nOutboundFullRelay < SEED_OUTBOUND_CONNECTION_THRESHOLD) {
2767 if (NodeClock::now() > seed_node_timer + ADD_NEXT_SEEDNODE) {
2768 seed_node_timer = NodeClock::now();
2769 add_addr_fetch = true;
2770 }
2771 }
2772
2774 auto now = GetTime<std::chrono::microseconds>();
2775 bool anchor = false;
2776 bool fFeeler = false;
2777 std::optional<Network> preferred_net;
2778
2779 // Determine what type of connection to open. Opening
2780 // BLOCK_RELAY connections to addresses from anchors.dat gets the highest
2781 // priority. Then we open OUTBOUND_FULL_RELAY priority until we
2782 // meet our full-relay capacity. Then we open BLOCK_RELAY connection
2783 // until we hit our block-relay-only peer limit.
2784 // GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
2785 // try opening an additional OUTBOUND_FULL_RELAY connection. If none of
2786 // these conditions are met, check to see if it's time to try an extra
2787 // block-relay-only peer (to confirm our tip is current, see below) or the next_feeler
2788 // timer to decide if we should open a FEELER.
2789
2790 if (!m_anchors.empty() && (nOutboundBlockRelay < m_max_outbound_block_relay)) {
2791 conn_type = ConnectionType::BLOCK_RELAY;
2792 anchor = true;
2793 } else if (nOutboundFullRelay < m_max_outbound_full_relay) {
2794 // OUTBOUND_FULL_RELAY
2795 } else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
2796 conn_type = ConnectionType::BLOCK_RELAY;
2797 } else if (GetTryNewOutboundPeer()) {
2798 // OUTBOUND_FULL_RELAY
2799 } else if (now > next_extra_block_relay && m_start_extra_block_relay_peers) {
2800 // Periodically connect to a peer (using regular outbound selection
2801 // methodology from addrman) and stay connected long enough to sync
2802 // headers, but not much else.
2803 //
2804 // Then disconnect the peer, if we haven't learned anything new.
2805 //
2806 // The idea is to make eclipse attacks very difficult to pull off,
2807 // because every few minutes we're finding a new peer to learn headers
2808 // from.
2809 //
2810 // This is similar to the logic for trying extra outbound (full-relay)
2811 // peers, except:
2812 // - we do this all the time on an exponential timer, rather than just when
2813 // our tip is stale
2814 // - we potentially disconnect our next-youngest block-relay-only peer, if our
2815 // newest block-relay-only peer delivers a block more recently.
2816 // See the eviction logic in net_processing.cpp.
2817 //
2818 // Because we can promote these connections to block-relay-only
2819 // connections, they do not get their own ConnectionType enum
2820 // (similar to how we deal with extra outbound peers).
2821 next_extra_block_relay = now + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
2822 conn_type = ConnectionType::BLOCK_RELAY;
2823 } else if (now > next_feeler) {
2824 next_feeler = now + rng.rand_exp_duration(FEELER_INTERVAL);
2825 conn_type = ConnectionType::FEELER;
2826 fFeeler = true;
2827 } else if (nOutboundFullRelay == m_max_outbound_full_relay &&
2829 now > next_extra_network_peer &&
2830 MaybePickPreferredNetwork(preferred_net)) {
2831 // Full outbound connection management: Attempt to get at least one
2832 // outbound peer from each reachable network by making extra connections
2833 // and then protecting "only" peers from a network during outbound eviction.
2834 // This is not attempted if the user changed -maxconnections to a value
2835 // so low that less than MAX_OUTBOUND_FULL_RELAY_CONNECTIONS are made,
2836 // to prevent interactions with otherwise protected outbound peers.
2837 next_extra_network_peer = now + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL);
2838 } else {
2839 // skip to next iteration of while loop
2840 continue;
2841 }
2842
2843 addrman.get().ResolveCollisions();
2844
2845 const auto current_time{NodeClock::now()};
2846 int nTries = 0;
2847 const auto reachable_nets{g_reachable_nets.All()};
2848
2849 while (!m_interrupt_net->interrupted()) {
2850 if (anchor && !m_anchors.empty()) {
2851 const CAddress addr = m_anchors.back();
2852 m_anchors.pop_back();
2853 if (!addr.IsValid() || IsLocal(addr) || !g_reachable_nets.Contains(addr) ||
2854 !m_msgproc->HasAllDesirableServiceFlags(addr.nServices) ||
2855 outbound_ipv46_peer_netgroups.contains(m_netgroupman.GetGroup(addr))) continue;
2856 addrConnect = addr;
2857 LogDebug(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
2858 break;
2859 }
2860
2861 // If we didn't find an appropriate destination after trying 100 addresses fetched from addrman,
2862 // stop this loop, and let the outer loop run again (which sleeps, adds seed nodes, recalculates
2863 // already-connected network ranges, ...) before trying new addrman addresses.
2864 nTries++;
2865 if (nTries > 100)
2866 break;
2867
2868 CAddress addr;
2869 NodeSeconds addr_last_try{0s};
2870
2871 if (fFeeler) {
2872 // First, try to get a tried table collision address. This returns
2873 // an empty (invalid) address if there are no collisions to try.
2874 std::tie(addr, addr_last_try) = addrman.get().SelectTriedCollision();
2875
2876 if (!addr.IsValid()) {
2877 // No tried table collisions. Select a new table address
2878 // for our feeler.
2879 std::tie(addr, addr_last_try) = addrman.get().Select(true, reachable_nets);
2880 } else if (AlreadyConnectedToAddress(addr)) {
2881 // If test-before-evict logic would have us connect to a
2882 // peer that we're already connected to, just mark that
2883 // address as Good(). We won't be able to initiate the
2884 // connection anyway, so this avoids inadvertently evicting
2885 // a currently-connected peer.
2886 addrman.get().Good(addr);
2887 // Select a new table address for our feeler instead.
2888 std::tie(addr, addr_last_try) = addrman.get().Select(true, reachable_nets);
2889 }
2890 } else {
2891 // Not a feeler
2892 // If preferred_net has a value set, pick an extra outbound
2893 // peer from that network. The eviction logic in net_processing
2894 // ensures that a peer from another network will be evicted.
2895 std::tie(addr, addr_last_try) = preferred_net.has_value()
2896 ? addrman.get().Select(false, {*preferred_net})
2897 : addrman.get().Select(false, reachable_nets);
2898 }
2899
2900 // Require outbound IPv4/IPv6 connections, other than feelers, to be to distinct network groups
2901 if (!fFeeler && outbound_ipv46_peer_netgroups.contains(m_netgroupman.GetGroup(addr))) {
2902 continue;
2903 }
2904
2905 // if we selected an invalid or local address, restart
2906 if (!addr.IsValid() || IsLocal(addr)) {
2907 break;
2908 }
2909
2910 if (!g_reachable_nets.Contains(addr)) {
2911 continue;
2912 }
2913
2914 // only consider very recently tried nodes after 30 failed attempts
2915 if (current_time - addr_last_try < 10min && nTries < 30) {
2916 continue;
2917 }
2918
2919 // for non-feelers, require all the services we'll want,
2920 // for feelers, only require they be a full node (only because most
2921 // SPV clients don't have a good address DB available)
2922 if (!fFeeler && !m_msgproc->HasAllDesirableServiceFlags(addr.nServices)) {
2923 continue;
2924 } else if (fFeeler && !MayHaveUsefulAddressDB(addr.nServices)) {
2925 continue;
2926 }
2927
2928 // Do not connect to bad ports, unless 50 invalid addresses have been selected already.
2929 if (nTries < 50 && (addr.IsIPv4() || addr.IsIPv6()) && IsBadPort(addr.GetPort())) {
2930 continue;
2931 }
2932
2933 // Do not make automatic outbound connections to addnode peers, to
2934 // not use our limited outbound slots for them and to ensure
2935 // addnode connections benefit from their intended protections.
2936 if (AddedNodesContain(addr)) {
2937 LogDebug(BCLog::NET, "Not making automatic %s%s connection to %s peer selected for manual (addnode) connection%s\n",
2938 preferred_net.has_value() ? "network-specific " : "",
2940 fLogIPs ? strprintf(": %s", addr.ToStringAddrPort()) : "");
2941 continue;
2942 }
2943
2944 addrConnect = addr;
2945 break;
2946 }
2947
2948 if (addrConnect.IsValid()) {
2949 if (fFeeler) {
2950 // Add small amount of random noise before connection to avoid synchronization.
2952 return;
2953 }
2954 LogDebug(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
2955 }
2956
2957 if (preferred_net != std::nullopt) LogDebug(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
2958
2959 // Record addrman failure attempts when node has at least 2 persistent outbound connections to peers with
2960 // different netgroups in ipv4/ipv6 networks + all peers in Tor/I2P/CJDNS networks.
2961 // Don't record addrman failure attempts when node is offline. This can be identified since all local
2962 // network connections (if any) belong in the same netgroup, and the size of `outbound_ipv46_peer_netgroups` would only be 1.
2963 const bool count_failures{((int)outbound_ipv46_peer_netgroups.size() + outbound_privacy_network_peers) >= std::min(m_max_automatic_connections - 1, 2)};
2964 // Use BIP324 transport when both us and them have NODE_V2_P2P set.
2965 const bool use_v2transport(addrConnect.nServices & GetLocalServices() & NODE_P2P_V2);
2966 OpenNetworkConnection(/*addrConnect=*/addrConnect,
2967 /*fCountFailure=*/count_failures,
2968 /*grant_outbound=*/std::move(grant),
2969 /*pszDest=*/nullptr,
2970 /*conn_type=*/conn_type,
2971 /*use_v2transport=*/use_v2transport,
2972 /*proxy_override=*/std::nullopt);
2973 }
2974 }
2975}
2976
2977std::vector<CAddress> CConnman::GetCurrentBlockRelayOnlyConns() const
2978{
2980 std::vector<CAddress> ret;
2982 for (const CNode* pnode : m_nodes) {
2983 if (pnode->IsBlockOnlyConn()) {
2984 ret.push_back(pnode->addr);
2985 }
2986 }
2987
2988 return ret;
2989}
2990
2991std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo(bool include_connected) const
2992{
2994
2995 std::vector<AddedNodeInfo> ret;
2996
2997 std::list<AddedNodeParams> lAddresses(0);
2998 {
3000 ret.reserve(m_added_node_params.size());
3001 std::copy(m_added_node_params.cbegin(), m_added_node_params.cend(), std::back_inserter(lAddresses));
3002 }
3003
3004
3005 // Build a map of all already connected addresses (by IP:port and by name) to inbound/outbound and resolved CService
3006 std::map<CService, bool> mapConnected;
3007 std::map<std::string, std::pair<bool, CService>> mapConnectedByName;
3008 {
3010 for (const CNode* pnode : m_nodes) {
3011 if (pnode->addr.IsValid()) {
3012 mapConnected[pnode->addr] = pnode->IsInboundConn();
3013 }
3014 std::string addrName{pnode->m_addr_name};
3015 if (!addrName.empty()) {
3016 mapConnectedByName[std::move(addrName)] = std::make_pair(pnode->IsInboundConn(), static_cast<const CService&>(pnode->addr));
3017 }
3018 }
3019 }
3020
3021 for (const auto& addr : lAddresses) {
3022 CService service{MaybeFlipIPv6toCJDNS(LookupNumeric(addr.m_added_node, GetDefaultPort(addr.m_added_node)))};
3023 AddedNodeInfo addedNode{addr, CService(), false, false};
3024 if (service.IsValid()) {
3025 // strAddNode is an IP:port
3026 auto it = mapConnected.find(service);
3027 if (it != mapConnected.end()) {
3028 if (!include_connected) {
3029 continue;
3030 }
3031 addedNode.resolvedAddress = service;
3032 addedNode.fConnected = true;
3033 addedNode.fInbound = it->second;
3034 }
3035 } else {
3036 // strAddNode is a name
3037 auto it = mapConnectedByName.find(addr.m_added_node);
3038 if (it != mapConnectedByName.end()) {
3039 if (!include_connected) {
3040 continue;
3041 }
3042 addedNode.resolvedAddress = it->second.second;
3043 addedNode.fConnected = true;
3044 addedNode.fInbound = it->second.first;
3045 }
3046 }
3047 ret.emplace_back(std::move(addedNode));
3048 }
3049
3050 return ret;
3051}
3052
3054{
3058
3059 while (true)
3060 {
3062 std::vector<AddedNodeInfo> vInfo = GetAddedNodeInfo(/*include_connected=*/false);
3063 bool tried = false;
3064 for (const AddedNodeInfo& info : vInfo) {
3065 if (!grant) {
3066 // If we've used up our semaphore and need a new one, let's not wait here since while we are waiting
3067 // the addednodeinfo state might change.
3068 break;
3069 }
3070 tried = true;
3072 /*fCountFailure=*/false,
3073 /*grant_outbound=*/std::move(grant),
3074 /*pszDest=*/info.m_params.m_added_node.c_str(),
3075 /*conn_type=*/ConnectionType::MANUAL,
3076 /*use_v2transport=*/info.m_params.m_use_v2transport,
3077 /*proxy_override=*/std::nullopt);
3078 if (!m_interrupt_net->sleep_for(500ms)) return;
3079 grant = CountingSemaphoreGrant<>(*semAddnode, /*fTry=*/true);
3080 }
3081 // See if any reconnections are desired.
3083 // Retry every 60 seconds if a connection was attempted, otherwise two seconds
3084 if (!m_interrupt_net->sleep_for(tried ? 60s : 2s)) {
3085 return;
3086 }
3087 }
3088}
3089
3090// if successful, this moves the passed grant to the constructed node
3092 bool fCountFailure,
3093 CountingSemaphoreGrant<>&& grant_outbound,
3094 const char* pszDest,
3095 ConnectionType conn_type,
3096 bool use_v2transport,
3097 const std::optional<Proxy>& proxy_override)
3098{
3101 assert(conn_type != ConnectionType::INBOUND);
3102
3103 //
3104 // Initiate outbound network connection
3105 //
3106 if (m_interrupt_net->interrupted()) {
3107 return false;
3108 }
3109 if (!fNetworkActive) {
3110 return false;
3111 }
3112 if (!pszDest) {
3113 bool banned_or_discouraged = m_banman && (m_banman->IsDiscouraged(addrConnect) || m_banman->IsBanned(addrConnect));
3114 if (IsLocal(addrConnect) || banned_or_discouraged || AlreadyConnectedToAddress(addrConnect)) {
3115 return false;
3116 }
3117 } else if (AlreadyConnectedToHost(pszDest)) {
3118 return false;
3119 }
3120
3121 CNode* pnode = ConnectNode(addrConnect, pszDest, fCountFailure, conn_type, use_v2transport, proxy_override);
3122
3123 if (!pnode)
3124 return false;
3125 pnode->grantOutbound = std::move(grant_outbound);
3126
3127 m_msgproc->InitializeNode(*pnode, m_local_services);
3128 {
3130 m_nodes.push_back(pnode);
3131
3132 // update connection count by network
3133 if (pnode->IsManualOrFullOutboundConn()) ++m_network_conn_counts[pnode->addr.GetNetwork()];
3134 }
3135
3136 TRACEPOINT(net, outbound_connection,
3137 pnode->GetId(),
3138 pnode->m_addr_name.c_str(),
3139 pnode->ConnectionTypeAsString().c_str(),
3140 pnode->ConnectedThroughNetwork(),
3142
3143 return true;
3144}
3145
3146std::optional<Network> CConnman::PrivateBroadcast::PickNetwork(std::optional<Proxy>& proxy) const
3147{
3149 std::optional<Proxy> clearnet_proxy;
3150 proxy.reset();
3152 nets.push_back(NET_ONION);
3153
3154 clearnet_proxy = ProxyForIPv4or6();
3155 if (clearnet_proxy.has_value()) {
3157 nets.push_back(NET_IPV4);
3158 }
3160 nets.push_back(NET_IPV6);
3161 }
3162 }
3163 }
3165 nets.push_back(NET_I2P);
3166 }
3167
3168 if (nets.empty()) {
3169 return std::nullopt;
3170 }
3171
3172 const Network net{nets[FastRandomContext{}.randrange(nets.size())]};
3173 if (net == NET_IPV4 || net == NET_IPV6) {
3174 proxy = clearnet_proxy;
3175 }
3176 return net;
3177}
3178
3180{
3181 return m_num_to_open;
3182}
3183
3185{
3186 m_num_to_open += n;
3187 m_num_to_open.notify_all();
3188}
3189
3191{
3192 size_t current_value{m_num_to_open.load()};
3193 size_t new_value;
3194 do {
3195 new_value = current_value > n ? current_value - n : 0;
3196 } while (!m_num_to_open.compare_exchange_strong(current_value, new_value));
3197 return new_value;
3198}
3199
3201{
3202 m_num_to_open.wait(0);
3203}
3204
3206{
3207 if (m_outbound_tor_ok_at_least_once.load()) {
3208 if (const auto tor_proxy = GetProxy(NET_ONION)) {
3209 return tor_proxy;
3210 }
3211 }
3212 return std::nullopt;
3213}
3214
3216
3218{
3220
3222
3223 while (!flagInterruptMsgProc)
3224 {
3225 bool fMoreWork = false;
3226
3227 {
3228 // Randomize the order in which we process messages from/to our peers.
3229 // This prevents attacks in which an attacker exploits having multiple
3230 // consecutive connections in the m_nodes list.
3231 const NodesSnapshot snap{*this, /*shuffle=*/true};
3232
3233 for (CNode* pnode : snap.Nodes()) {
3234 if (pnode->fDisconnect)
3235 continue;
3236
3237 // Receive messages
3238 bool fMoreNodeWork{m_msgproc->ProcessMessages(*pnode, flagInterruptMsgProc)};
3239 fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend);
3241 return;
3242 // Send messages
3243 m_msgproc->SendMessages(*pnode);
3244
3246 return;
3247 }
3248 }
3249
3250 WAIT_LOCK(mutexMsgProc, lock);
3251 if (!fMoreWork) {
3252 condMsgProc.wait_until(lock, std::chrono::steady_clock::now() + std::chrono::milliseconds(100), [this]() EXCLUSIVE_LOCKS_REQUIRED(mutexMsgProc) { return fMsgProcWake; });
3253 }
3254 fMsgProcWake = false;
3255 }
3256}
3257
3259{
3261
3262 static constexpr auto err_wait_begin = 1s;
3263 static constexpr auto err_wait_cap = 5min;
3264 auto err_wait = err_wait_begin;
3265
3266 bool advertising_listen_addr = false;
3267 i2p::Connection conn;
3268
3269 auto SleepOnFailure = [&]() {
3270 m_interrupt_net->sleep_for(err_wait);
3271 if (err_wait < err_wait_cap) {
3272 err_wait += 1s;
3273 }
3274 };
3275
3276 while (!m_interrupt_net->interrupted()) {
3277
3278 if (!m_i2p_sam_session->Listen(conn)) {
3279 if (advertising_listen_addr && conn.me.IsValid()) {
3280 RemoveLocal(conn.me);
3281 advertising_listen_addr = false;
3282 }
3283 SleepOnFailure();
3284 continue;
3285 }
3286
3287 if (!advertising_listen_addr) {
3288 AddLocal(conn.me, LOCAL_MANUAL);
3289 advertising_listen_addr = true;
3290 }
3291
3292 if (!m_i2p_sam_session->Accept(conn)) {
3293 SleepOnFailure();
3294 continue;
3295 }
3296
3298
3299 err_wait = err_wait_begin;
3300 }
3301}
3302
3304{
3307
3308 size_t addrman_num_bad_addresses{0};
3309 while (!m_interrupt_net->interrupted()) {
3310
3311 if (!fNetworkActive) {
3312 m_interrupt_net->sleep_for(5s);
3313 continue;
3314 }
3315
3316 CountingSemaphoreGrant<> conn_max_grant{m_private_broadcast.m_sem_conn_max}; // Would block if too many are opened.
3317
3319
3320 if (m_interrupt_net->interrupted()) {
3321 break;
3322 }
3323
3324 std::optional<Proxy> proxy;
3325 const std::optional<Network> net{m_private_broadcast.PickNetwork(proxy)};
3326 if (!net.has_value()) {
3327 LogWarning("Unable to open -privatebroadcast connections: neither Tor nor I2P is reachable");
3328 m_interrupt_net->sleep_for(5s);
3329 continue;
3330 }
3331
3332 const auto [addr, _] = addrman.get().Select(/*new_only=*/false, {net.value()});
3333
3334 if (!addr.IsValid() || IsLocal(addr)) {
3335 ++addrman_num_bad_addresses;
3336 if (addrman_num_bad_addresses > 100) {
3337 LogDebug(BCLog::PRIVBROADCAST, "Connections needed but addrman keeps returning bad addresses, will retry");
3338 m_interrupt_net->sleep_for(500ms);
3339 }
3340 continue;
3341 }
3342 addrman_num_bad_addresses = 0;
3343
3344 auto target_str{addr.ToStringAddrPort()};
3345 if (proxy.has_value()) {
3346 target_str += " through the proxy at " + proxy->ToString();
3347 }
3348
3349 const bool use_v2transport(addr.nServices & GetLocalServices() & NODE_P2P_V2);
3350
3351 if (OpenNetworkConnection(addr,
3352 /*fCountFailure=*/true,
3353 std::move(conn_max_grant),
3354 /*pszDest=*/nullptr,
3357 proxy)) {
3358 const size_t remaining{m_private_broadcast.NumToOpenSub(1)};
3359 LogDebug(BCLog::PRIVBROADCAST, "Socket connected to %s; remaining connections to open: %d", target_str, remaining);
3360 } else {
3361 const size_t remaining{m_private_broadcast.NumToOpen()};
3362 if (remaining == 0) {
3363 LogDebug(BCLog::PRIVBROADCAST, "Failed to connect to %s, will not retry, no more connections needed", target_str);
3364 } else {
3365 LogDebug(BCLog::PRIVBROADCAST, "Failed to connect to %s, will retry to a different address; remaining connections to open: %d", target_str, remaining);
3366 m_interrupt_net->sleep_for(100ms); // Prevent busy loop if OpenNetworkConnection() fails fast repeatedly.
3367 }
3368 }
3369 }
3370}
3371
3372bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError, NetPermissionFlags permissions)
3373{
3374 int nOne = 1;
3375
3376 // Create socket for listening for incoming connections
3377 struct sockaddr_storage sockaddr;
3378 socklen_t len = sizeof(sockaddr);
3379 if (!addrBind.GetSockAddr((struct sockaddr*)&sockaddr, &len))
3380 {
3381 strError = Untranslated(strprintf("Bind address family for %s not supported", addrBind.ToStringAddrPort()));
3382 LogError("%s\n", strError.original);
3383 return false;
3384 }
3385
3386 std::unique_ptr<Sock> sock = CreateSock(addrBind.GetSAFamily(), SOCK_STREAM, IPPROTO_TCP);
3387 if (!sock) {
3388 strError = Untranslated(strprintf("Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError())));
3389 LogError("%s\n", strError.original);
3390 return false;
3391 }
3392
3393 // Allow binding if the port is still in TIME_WAIT state after
3394 // the program was closed and restarted.
3395 if (sock->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, &nOne, sizeof(int)) == SOCKET_ERROR) {
3396 strError = Untranslated(strprintf("Error setting SO_REUSEADDR on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3397 LogInfo("%s\n", strError.original);
3398 }
3399
3400 // some systems don't have IPV6_V6ONLY but are always v6only; others do have the option
3401 // and enable it by default or not. Try to enable it, if possible.
3402 if (addrBind.IsIPv6()) {
3403#ifdef IPV6_V6ONLY
3404 if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_V6ONLY, &nOne, sizeof(int)) == SOCKET_ERROR) {
3405 strError = Untranslated(strprintf("Error setting IPV6_V6ONLY on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3406 LogInfo("%s\n", strError.original);
3407 }
3408#endif
3409#ifdef WIN32
3410 int nProtLevel = PROTECTION_LEVEL_UNRESTRICTED;
3411 if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_PROTECTION_LEVEL, &nProtLevel, sizeof(int)) == SOCKET_ERROR) {
3412 strError = Untranslated(strprintf("Error setting IPV6_PROTECTION_LEVEL on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3413 LogInfo("%s\n", strError.original);
3414 }
3415#endif
3416 }
3417
3418 if (sock->Bind(reinterpret_cast<struct sockaddr*>(&sockaddr), len) == SOCKET_ERROR) {
3419 int nErr = WSAGetLastError();
3420 if (nErr == WSAEADDRINUSE)
3421 strError = strprintf(_("Unable to bind to %s on this computer. %s is probably already running."), addrBind.ToStringAddrPort(), CLIENT_NAME);
3422 else
3423 strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToStringAddrPort(), NetworkErrorString(nErr));
3424 LogError("%s\n", strError.original);
3425 return false;
3426 }
3427 LogInfo("Bound to %s\n", addrBind.ToStringAddrPort());
3428
3429 // Listen for incoming connections
3430 if (sock->Listen(SOMAXCONN) == SOCKET_ERROR)
3431 {
3432 strError = strprintf(_("Listening for incoming connections failed (listen returned error %s)"), NetworkErrorString(WSAGetLastError()));
3433 LogError("%s\n", strError.original);
3434 return false;
3435 }
3436
3437 vhListenSocket.emplace_back(std::move(sock), permissions);
3438 return true;
3439}
3440
3442{
3443 if (!fDiscover)
3444 return;
3445
3446 for (const CNetAddr &addr: GetLocalAddresses()) {
3447 if (AddLocal(addr, LOCAL_IF) && fLogIPs) {
3448 LogInfo("%s: %s\n", __func__, addr.ToStringAddr());
3449 }
3450 }
3451}
3452
3454{
3455 LogInfo("%s: %s\n", __func__, active);
3456
3457 if (fNetworkActive == active) {
3458 return;
3459 }
3460
3461 fNetworkActive = active;
3462
3463 if (m_client_interface) {
3464 m_client_interface->NotifyNetworkActiveChanged(fNetworkActive);
3465 }
3466}
3467
3468CConnman::CConnman(uint64_t nSeed0In,
3469 uint64_t nSeed1In,
3470 AddrMan& addrman_in,
3471 const NetGroupManager& netgroupman,
3472 const CChainParams& params,
3473 bool network_active,
3474 std::shared_ptr<CThreadInterrupt> interrupt_net)
3475 : addrman(addrman_in)
3476 , m_netgroupman{netgroupman}
3477 , nSeed0(nSeed0In)
3478 , nSeed1(nSeed1In)
3479 , m_interrupt_net{interrupt_net}
3480 , m_params(params)
3481{
3482 SetTryNewOutboundPeer(false);
3483
3484 Options connOptions;
3485 Init(connOptions);
3486 SetNetworkActive(network_active);
3487}
3488
3490{
3491 return nLastNodeId.fetch_add(1, std::memory_order_relaxed);
3492}
3493
3495{
3496 return net == NET_I2P ? I2P_SAM31_PORT : m_params.GetDefaultPort();
3497}
3498
3499uint16_t CConnman::GetDefaultPort(const std::string& addr) const
3500{
3501 CNetAddr a;
3503}
3504
3505bool CConnman::Bind(const CService& addr_, unsigned int flags, NetPermissionFlags permissions)
3506{
3507 const CService addr{MaybeFlipIPv6toCJDNS(addr_)};
3508
3509 bilingual_str strError;
3510 if (!BindListenPort(addr, strError, permissions)) {
3512 m_client_interface->ThreadSafeMessageBox(strError, CClientUIInterface::MSG_ERROR);
3513 }
3514 return false;
3515 }
3516
3517 if (addr.IsRoutable() && fDiscover && !(flags & BF_DONT_ADVERTISE) && !NetPermissions::HasFlag(permissions, NetPermissionFlags::NoBan)) {
3518 AddLocal(addr, LOCAL_BIND);
3519 }
3520
3521 return true;
3522}
3523
3524bool CConnman::InitBinds(const Options& options)
3525{
3526 for (const auto& addrBind : options.vBinds) {
3528 return false;
3529 }
3530 }
3531 for (const auto& addrBind : options.vWhiteBinds) {
3532 if (!Bind(addrBind.m_service, BF_REPORT_ERROR, addrBind.m_flags)) {
3533 return false;
3534 }
3535 }
3536 for (const auto& addr_bind : options.onion_binds) {
3538 return false;
3539 }
3540 }
3541 if (options.bind_on_any) {
3542 // Don't consider errors to bind on IPv6 "::" fatal because the host OS
3543 // may not have IPv6 support and the user did not explicitly ask us to
3544 // bind on that.
3545 const CService ipv6_any{in6_addr(COMPAT_IN6ADDR_ANY_INIT), GetListenPort()}; // ::
3547
3548 struct in_addr inaddr_any;
3549 inaddr_any.s_addr = htonl(INADDR_ANY);
3550 const CService ipv4_any{inaddr_any, GetListenPort()}; // 0.0.0.0
3552 return false;
3553 }
3554 }
3555 return true;
3556}
3557
3558bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
3559{
3561 Init(connOptions);
3562
3563 if (fListen && !InitBinds(connOptions)) {
3564 if (m_client_interface) {
3565 m_client_interface->ThreadSafeMessageBox(
3566 _("Failed to listen on any port. Use -listen=0 if you want this."),
3568 }
3569 return false;
3570 }
3571
3572 if (connOptions.m_i2p_accept_incoming) {
3573 if (const auto i2p_sam = GetProxy(NET_I2P)) {
3574 m_i2p_sam_session = std::make_unique<i2p::sam::Session>(gArgs.GetDataDirNet() / "i2p_private_key",
3575 *i2p_sam, m_interrupt_net);
3576 }
3577 }
3578
3579 // Randomize the order in which we may query seednode to potentially prevent connecting to the same one every restart (and signal that we have restarted)
3580 std::vector<std::string> seed_nodes = connOptions.vSeedNodes;
3581 if (!seed_nodes.empty()) {
3582 std::shuffle(seed_nodes.begin(), seed_nodes.end(), FastRandomContext{});
3583 }
3584
3586 // Load addresses from anchors.dat
3590 }
3591 LogInfo("%i block-relay-only anchors will be tried for connections.\n", m_anchors.size());
3592 }
3593
3594 if (m_client_interface) {
3595 m_client_interface->InitMessage(_("Starting network threads…"));
3596 }
3597
3598 fAddressesInitialized = true;
3599
3600 if (semOutbound == nullptr) {
3601 // initialize semaphore
3602 semOutbound = std::make_unique<std::counting_semaphore<>>(std::min(m_max_automatic_outbound, m_max_automatic_connections));
3603 }
3604 if (semAddnode == nullptr) {
3605 // initialize semaphore
3606 semAddnode = std::make_unique<std::counting_semaphore<>>(m_max_addnode);
3607 }
3608
3609 //
3610 // Start threads
3611 //
3613 m_interrupt_net->reset();
3614 flagInterruptMsgProc = false;
3615
3616 {
3618 fMsgProcWake = false;
3619 }
3620
3621 // Send and receive from sockets, accept connections
3623
3624 if (!gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED))
3625 LogInfo("DNS seeding disabled\n");
3626 else
3628
3629 // Initiate manual connections
3631
3632 if (connOptions.m_use_addrman_outgoing && !connOptions.m_specified_outgoing.empty()) {
3633 if (m_client_interface) {
3634 m_client_interface->ThreadSafeMessageBox(
3635 _("Cannot provide specific connections and have addrman find outgoing connections at the same time."),
3637 }
3638 return false;
3639 }
3640 if (connOptions.m_use_addrman_outgoing || !connOptions.m_specified_outgoing.empty()) {
3642 &util::TraceThread, "opencon",
3643 [this, connect = connOptions.m_specified_outgoing, seed_nodes = std::move(seed_nodes)] { ThreadOpenConnections(connect, seed_nodes); });
3644 }
3645
3646 // Process messages
3648
3649 if (m_i2p_sam_session) {
3651 std::thread(&util::TraceThread, "i2paccept", [this] { ThreadI2PAcceptIncoming(); });
3652 }
3653
3654 if (gArgs.GetBoolArg("-privatebroadcast", DEFAULT_PRIVATE_BROADCAST)) {
3656 std::thread(&util::TraceThread, "privbcast", [this] { ThreadPrivateBroadcast(); });
3657 }
3658
3659 // Dump network addresses
3660 scheduler.scheduleEvery([this] { DumpAddresses(); }, DUMP_PEERS_INTERVAL);
3661
3662 // Run the ASMap Health check once and then schedule it to run every 24h.
3663 if (m_netgroupman.UsingASMap()) {
3666 }
3667
3668 return true;
3669}
3670
3672{
3673public:
3674 CNetCleanup() = default;
3675
3677 {
3678#ifdef WIN32
3679 // Shutdown Windows Sockets
3680 WSACleanup();
3681#endif
3682 }
3683};
3685
3687{
3688 {
3690 flagInterruptMsgProc = true;
3691 }
3692 condMsgProc.notify_all();
3693
3694 (*m_interrupt_net)();
3696
3697 if (semOutbound) {
3698 for (int i=0; i<m_max_automatic_outbound; i++) {
3699 semOutbound->release();
3700 }
3701 }
3702
3703 if (semAddnode) {
3704 for (int i=0; i<m_max_addnode; i++) {
3705 semAddnode->release();
3706 }
3707 }
3708
3710 m_private_broadcast.NumToOpenAdd(1); // Just unblock NumToOpenWait() to be able to continue with shutdown.
3711}
3712
3714{
3715 if (threadPrivateBroadcast.joinable()) {
3717 }
3718 if (threadI2PAcceptIncoming.joinable()) {
3720 }
3721 if (threadMessageHandler.joinable())
3722 threadMessageHandler.join();
3723 if (threadOpenConnections.joinable())
3724 threadOpenConnections.join();
3725 if (threadOpenAddedConnections.joinable())
3727 if (threadDNSAddressSeed.joinable())
3728 threadDNSAddressSeed.join();
3729 if (threadSocketHandler.joinable())
3730 threadSocketHandler.join();
3731}
3732
3734{
3737
3739 DumpAddresses();
3740 fAddressesInitialized = false;
3741
3743 // Anchor connections are only dumped during clean shutdown.
3744 std::vector<CAddress> anchors_to_dump = GetCurrentBlockRelayOnlyConns();
3745 if (anchors_to_dump.size() > MAX_BLOCK_RELAY_ONLY_ANCHORS) {
3746 anchors_to_dump.resize(MAX_BLOCK_RELAY_ONLY_ANCHORS);
3747 }
3749 }
3750 }
3751
3752 // Delete peer connections.
3753 std::vector<CNode*> nodes;
3754 WITH_LOCK(m_nodes_mutex, nodes.swap(m_nodes));
3755 for (CNode* pnode : nodes) {
3756 LogDebug(BCLog::NET, "Stopping node, %s", pnode->DisconnectMsg());
3757 pnode->CloseSocketDisconnect();
3758 DeleteNode(pnode);
3759 }
3760
3761 for (CNode* pnode : m_nodes_disconnected) {
3762 DeleteNode(pnode);
3763 }
3764 m_nodes_disconnected.clear();
3765 WITH_LOCK(m_reconnections_mutex, m_reconnections.clear());
3766 vhListenSocket.clear();
3767 semOutbound.reset();
3768 semAddnode.reset();
3769}
3770
3772{
3773 assert(pnode);
3774 m_msgproc->FinalizeNode(*pnode);
3775 delete pnode;
3776}
3777
3779{
3780 Interrupt();
3781 Stop();
3782}
3783
3784std::vector<CAddress> CConnman::GetAddressesUnsafe(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered) const
3785{
3786 std::vector<CAddress> addresses = addrman.get().GetAddr(max_addresses, max_pct, network, filtered);
3787 if (m_banman) {
3788 addresses.erase(std::remove_if(addresses.begin(), addresses.end(),
3789 [this](const CAddress& addr){return m_banman->IsDiscouraged(addr) || m_banman->IsBanned(addr);}),
3790 addresses.end());
3791 }
3792 return addresses;
3793}
3794
3795std::vector<CAddress> CConnman::GetAddresses(CNode& requestor, size_t max_addresses, size_t max_pct)
3796{
3797 uint64_t network_id = requestor.m_network_key;
3798 const auto current_time = GetTime<std::chrono::microseconds>();
3799 auto r = m_addr_response_caches.emplace(network_id, CachedAddrResponse{});
3800 CachedAddrResponse& cache_entry = r.first->second;
3801 if (cache_entry.m_cache_entry_expiration < current_time) { // If emplace() added new one it has expiration 0.
3802 cache_entry.m_addrs_response_cache = GetAddressesUnsafe(max_addresses, max_pct, /*network=*/std::nullopt);
3803 // Choosing a proper cache lifetime is a trade-off between the privacy leak minimization
3804 // and the usefulness of ADDR responses to honest users.
3805 //
3806 // Longer cache lifetime makes it more difficult for an attacker to scrape
3807 // enough AddrMan data to maliciously infer something useful.
3808 // By the time an attacker scraped enough AddrMan records, most of
3809 // the records should be old enough to not leak topology info by
3810 // e.g. analyzing real-time changes in timestamps.
3811 //
3812 // It takes only several hundred requests to scrape everything from an AddrMan containing 100,000 nodes,
3813 // so ~24 hours of cache lifetime indeed makes the data less inferable by the time
3814 // most of it could be scraped (considering that timestamps are updated via
3815 // ADDR self-announcements and when nodes communicate).
3816 // We also should be robust to those attacks which may not require scraping *full* victim's AddrMan
3817 // (because even several timestamps of the same handful of nodes may leak privacy).
3818 //
3819 // On the other hand, longer cache lifetime makes ADDR responses
3820 // outdated and less useful for an honest requestor, e.g. if most nodes
3821 // in the ADDR response are no longer active.
3822 //
3823 // However, the churn in the network is known to be rather low. Since we consider
3824 // nodes to be "terrible" (see IsTerrible()) if the timestamps are older than 30 days,
3825 // max. 24 hours of "penalty" due to cache shouldn't make any meaningful difference
3826 // in terms of the freshness of the response.
3827 cache_entry.m_cache_entry_expiration = current_time +
3828 21h + FastRandomContext().randrange<std::chrono::microseconds>(6h);
3829 }
3830 return cache_entry.m_addrs_response_cache;
3831}
3832
3834{
3836 const bool resolved_is_valid{resolved.IsValid()};
3837
3839 for (const auto& it : m_added_node_params) {
3840 if (add.m_added_node == it.m_added_node || (resolved_is_valid && resolved == LookupNumeric(it.m_added_node, GetDefaultPort(it.m_added_node)))) return false;
3841 }
3842
3843 m_added_node_params.push_back(add);
3844 return true;
3845}
3846
3847bool CConnman::RemoveAddedNode(std::string_view node)
3848{
3850 for (auto it = m_added_node_params.begin(); it != m_added_node_params.end(); ++it) {
3851 if (node == it->m_added_node) {
3852 m_added_node_params.erase(it);
3853 return true;
3854 }
3855 }
3856 return false;
3857}
3858
3860{
3862 const std::string addr_str{addr.ToStringAddr()};
3863 const std::string addr_port_str{addr.ToStringAddrPort()};
3865 return (m_added_node_params.size() < 24 // bound the query to a reasonable limit
3866 && std::any_of(m_added_node_params.cbegin(), m_added_node_params.cend(),
3867 [&](const auto& p) { return p.m_added_node == addr_str || p.m_added_node == addr_port_str; }));
3868}
3869
3871{
3873 if (flags == ConnectionDirection::Both) // Shortcut if we want total
3874 return m_nodes.size();
3875
3876 int nNum = 0;
3877 for (const auto& pnode : m_nodes) {
3878 if (flags & (pnode->IsInboundConn() ? ConnectionDirection::In : ConnectionDirection::Out)) {
3879 nNum++;
3880 }
3881 }
3882
3883 return nNum;
3884}
3885
3886
3887std::map<CNetAddr, LocalServiceInfo> CConnman::getNetLocalAddresses() const
3888{
3890 return mapLocalHost;
3891}
3892
3893uint32_t CConnman::GetMappedAS(const CNetAddr& addr) const
3894{
3895 return m_netgroupman.GetMappedAS(addr);
3896}
3897
3898void CConnman::GetNodeStats(std::vector<CNodeStats>& vstats) const
3899{
3901
3902 vstats.clear();
3904 vstats.reserve(m_nodes.size());
3905 for (CNode* pnode : m_nodes) {
3906 vstats.emplace_back();
3907 pnode->CopyStats(vstats.back());
3908 vstats.back().m_mapped_as = GetMappedAS(pnode->addr);
3909 }
3910}
3911
3912bool CConnman::DisconnectNode(std::string_view strNode)
3913{
3915 auto it = std::ranges::find_if(m_nodes, [&strNode](CNode* node) { return node->m_addr_name == strNode; });
3916 if (it != m_nodes.end()) {
3917 CNode* node{*it};
3918 LogDebug(BCLog::NET, "disconnect by address%s match, %s", (fLogIPs ? strprintf("=%s", strNode) : ""), node->DisconnectMsg());
3919 node->fDisconnect = true;
3920 return true;
3921 }
3922 return false;
3923}
3924
3926{
3928 bool disconnected = false;
3930 for (CNode* pnode : m_nodes) {
3931 if (subnet.Match(pnode->addr)) {
3932 LogDebug(BCLog::NET, "disconnect by subnet%s match, %s", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->DisconnectMsg());
3933 pnode->fDisconnect = true;
3934 disconnected = true;
3935 }
3936 }
3937 return disconnected;
3938}
3939
3941{
3943 return DisconnectNode(CSubNet(addr));
3944}
3945
3947{
3949 for(CNode* pnode : m_nodes) {
3950 if (id == pnode->GetId()) {
3951 LogDebug(BCLog::NET, "disconnect by id, %s", pnode->DisconnectMsg());
3952 pnode->fDisconnect = true;
3953 return true;
3954 }
3955 }
3956 return false;
3957}
3958
3959void CConnman::RecordBytesRecv(uint64_t bytes)
3960{
3961 nTotalBytesRecv += bytes;
3962}
3963
3964void CConnman::RecordBytesSent(uint64_t bytes)
3965{
3968
3969 nTotalBytesSent += bytes;
3970
3971 const auto now = GetTime<std::chrono::seconds>();
3972 if (nMaxOutboundCycleStartTime + MAX_UPLOAD_TIMEFRAME < now)
3973 {
3974 // timeframe expired, reset cycle
3975 nMaxOutboundCycleStartTime = now;
3976 nMaxOutboundTotalBytesSentInCycle = 0;
3977 }
3978
3979 nMaxOutboundTotalBytesSentInCycle += bytes;
3980}
3981
3983{
3986 return nMaxOutboundLimit;
3987}
3988
3989std::chrono::seconds CConnman::GetMaxOutboundTimeframe() const
3990{
3991 return MAX_UPLOAD_TIMEFRAME;
3992}
3993
3995{
3999}
4000
4002{
4004
4005 if (nMaxOutboundLimit == 0)
4006 return 0s;
4007
4008 if (nMaxOutboundCycleStartTime.count() == 0)
4009 return MAX_UPLOAD_TIMEFRAME;
4010
4011 const std::chrono::seconds cycleEndTime = nMaxOutboundCycleStartTime + MAX_UPLOAD_TIMEFRAME;
4012 const auto now = GetTime<std::chrono::seconds>();
4013 return (cycleEndTime < now) ? 0s : cycleEndTime - now;
4014}
4015
4016bool CConnman::OutboundTargetReached(bool historicalBlockServingLimit) const
4017{
4020 if (nMaxOutboundLimit == 0)
4021 return false;
4022
4023 if (historicalBlockServingLimit)
4024 {
4025 // keep a large enough buffer to at least relay each block once
4026 const std::chrono::seconds timeLeftInCycle = GetMaxOutboundTimeLeftInCycle_();
4027 const uint64_t buffer = timeLeftInCycle / std::chrono::minutes{10} * MAX_BLOCK_SERIALIZED_SIZE;
4028 if (buffer >= nMaxOutboundLimit || nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit - buffer)
4029 return true;
4030 }
4031 else if (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit)
4032 return true;
4033
4034 return false;
4035}
4036
4038{
4041 if (nMaxOutboundLimit == 0)
4042 return 0;
4043
4044 return (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit) ? 0 : nMaxOutboundLimit - nMaxOutboundTotalBytesSentInCycle;
4045}
4046
4048{
4049 return nTotalBytesRecv;
4050}
4051
4053{
4056 return nTotalBytesSent;
4057}
4058
4060{
4061 return m_local_services;
4062}
4063
4064static std::unique_ptr<Transport> MakeTransport(NodeId id, bool use_v2transport, bool inbound) noexcept
4065{
4066 if (use_v2transport) {
4067 return std::make_unique<V2Transport>(id, /*initiating=*/!inbound);
4068 } else {
4069 return std::make_unique<V1Transport>(id);
4070 }
4071}
4072
4074 std::shared_ptr<Sock> sock,
4075 const CAddress& addrIn,
4076 uint64_t nKeyedNetGroupIn,
4077 uint64_t nLocalHostNonceIn,
4078 const CService& addrBindIn,
4079 const std::string& addrNameIn,
4080 ConnectionType conn_type_in,
4081 bool inbound_onion,
4082 uint64_t network_key,
4083 CNodeOptions&& node_opts)
4084 : m_transport{MakeTransport(idIn, node_opts.use_v2transport, conn_type_in == ConnectionType::INBOUND)},
4085 m_permission_flags{node_opts.permission_flags},
4086 m_sock{sock},
4087 m_connected{NodeClock::now()},
4088 m_proxy_override{std::move(node_opts.proxy_override)},
4089 addr{addrIn},
4090 addrBind{addrBindIn},
4091 m_addr_name{addrNameIn.empty() ? addr.ToStringAddrPort() : addrNameIn},
4092 m_dest(addrNameIn),
4093 m_inbound_onion{inbound_onion},
4094 m_prefer_evict{node_opts.prefer_evict},
4095 nKeyedNetGroup{nKeyedNetGroupIn},
4096 m_network_key{network_key},
4097 m_conn_type{conn_type_in},
4098 id{idIn},
4099 nLocalHostNonce{nLocalHostNonceIn},
4100 m_recv_flood_size{node_opts.recv_flood_size},
4101 m_i2p_sam_session{std::move(node_opts.i2p_sam_session)}
4102{
4103 if (inbound_onion) assert(conn_type_in == ConnectionType::INBOUND);
4104
4105 for (const auto& msg : ALL_NET_MESSAGE_TYPES) {
4106 mapRecvBytesPerMsgType[msg] = 0;
4107 }
4108 mapRecvBytesPerMsgType[NET_MESSAGE_TYPE_OTHER] = 0;
4109
4110 if (fLogIPs) {
4111 LogDebug(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
4112 } else {
4113 LogDebug(BCLog::NET, "Added connection peer=%d\n", id);
4114 }
4115}
4116
4118{
4120
4121 size_t nSizeAdded = 0;
4122 for (const auto& msg : vRecvMsg) {
4123 // vRecvMsg contains only completed CNetMessage
4124 // the single possible partially deserialized message are held by TransportDeserializer
4125 nSizeAdded += msg.GetMemoryUsage();
4126 }
4127
4129 m_msg_process_queue.splice(m_msg_process_queue.end(), vRecvMsg);
4130 m_msg_process_queue_size += nSizeAdded;
4131 fPauseRecv = m_msg_process_queue_size > m_recv_flood_size;
4132}
4133
4134std::optional<std::pair<CNetMessage, bool>> CNode::PollMessage()
4135{
4137 if (m_msg_process_queue.empty()) return std::nullopt;
4138
4139 std::list<CNetMessage> msgs;
4140 // Just take one message
4141 msgs.splice(msgs.begin(), m_msg_process_queue, m_msg_process_queue.begin());
4142 m_msg_process_queue_size -= msgs.front().GetMemoryUsage();
4143 fPauseRecv = m_msg_process_queue_size > m_recv_flood_size;
4144
4145 return std::make_pair(std::move(msgs.front()), !m_msg_process_queue.empty());
4146}
4147
4149{
4150 return pnode && pnode->fSuccessfullyConnected && !pnode->fDisconnect;
4151}
4152
4155static bool IsOutboundMessageAllowedInPrivateBroadcast(std::string_view type) noexcept
4156{
4157 return type == NetMsgType::VERSION ||
4158 type == NetMsgType::VERACK ||
4159 type == NetMsgType::INV ||
4160 type == NetMsgType::TX ||
4161 type == NetMsgType::PING;
4162}
4163
4165{
4167
4169 LogDebug(BCLog::PRIVBROADCAST, "Omitting send of message '%s', %s", msg.m_type, pnode->LogPeer());
4170 return;
4171 }
4172
4174 pnode->addr.IsTor() && msg.m_type == NetMsgType::VERACK) {
4175 // If we are sending the peer VERACK that means we successfully sent
4176 // and received another message to/from that peer (VERSION).
4178 }
4179
4180 size_t nMessageSize = msg.data.size();
4181 LogDebug(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
4182 if (m_capture_messages) {
4183 CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false);
4184 }
4185
4186 TRACEPOINT(net, outbound_message,
4187 pnode->GetId(),
4188 pnode->m_addr_name.c_str(),
4189 pnode->ConnectionTypeAsString().c_str(),
4190 msg.m_type.c_str(),
4191 msg.data.size(),
4192 msg.data.data()
4193 );
4194
4195 size_t nBytesSent = 0;
4196 {
4197 LOCK(pnode->cs_vSend);
4198 // Check if the transport still has unsent bytes, and indicate to it that we're about to
4199 // give it a message to send.
4200 const auto& [to_send, more, _msg_type] =
4201 pnode->m_transport->GetBytesToSend(/*have_next_message=*/true);
4202 const bool queue_was_empty{to_send.empty() && pnode->vSendMsg.empty()};
4203
4204 // Update memory usage of send buffer.
4205 pnode->m_send_memusage += msg.GetMemoryUsage();
4206 if (pnode->m_send_memusage + pnode->m_transport->GetSendMemoryUsage() > nSendBufferMaxSize) pnode->fPauseSend = true;
4207 // Move message to vSendMsg queue.
4208 pnode->vSendMsg.push_back(std::move(msg));
4209
4210 // If there was nothing to send before, and there is now (predicted by the "more" value
4211 // returned by the GetBytesToSend call above), attempt "optimistic write":
4212 // because the poll/select loop may pause for SELECT_TIMEOUT_MILLISECONDS before actually
4213 // doing a send, try sending from the calling thread if the queue was empty before.
4214 // With a V1Transport, more will always be true here, because adding a message always
4215 // results in sendable bytes there, but with V2Transport this is not the case (it may
4216 // still be in the handshake).
4217 if (queue_was_empty && more) {
4218 std::tie(nBytesSent, std::ignore) = SocketSendData(*pnode);
4219 }
4220 }
4221 if (nBytesSent) RecordBytesSent(nBytesSent);
4222}
4223
4224bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
4225{
4227
4228 CNode* found = nullptr;
4230 for (auto&& pnode : m_nodes) {
4231 if(pnode->GetId() == id) {
4232 found = pnode;
4233 break;
4234 }
4235 }
4236 return found != nullptr && NodeFullyConnected(found) && func(found);
4237}
4238
4240{
4241 return CSipHasher(nSeed0, nSeed1).Write(id);
4242}
4243
4244uint64_t CConnman::CalculateKeyedNetGroup(const CNetAddr& address) const
4245{
4246 std::vector<unsigned char> vchNetGroup(m_netgroupman.GetGroup(address));
4247
4249}
4250
4252{
4256 while (true) {
4257 // Move first element of m_reconnections to todo (avoiding an allocation inside the lock).
4258 decltype(m_reconnections) todo;
4259 {
4261 if (m_reconnections.empty()) break;
4262 todo.splice(todo.end(), m_reconnections, m_reconnections.begin());
4263 }
4264
4265 auto& item = *todo.begin();
4266 OpenNetworkConnection(item.addr_connect,
4267 // We only reconnect if the first attempt to connect succeeded at
4268 // connection time, but then failed after the CNode object was
4269 // created. Since we already know connecting is possible, do not
4270 // count failure to reconnect.
4271 /*fCountFailure=*/false,
4272 std::move(item.grant),
4273 item.destination.empty() ? nullptr : item.destination.c_str(),
4274 item.conn_type,
4275 item.use_v2transport,
4276 item.proxy_override);
4277 }
4278}
4279
4281{
4282 const std::vector<CAddress> v4_addrs{GetAddressesUnsafe(/*max_addresses=*/0, /*max_pct=*/0, Network::NET_IPV4, /*filtered=*/false)};
4283 const std::vector<CAddress> v6_addrs{GetAddressesUnsafe(/*max_addresses=*/0, /*max_pct=*/0, Network::NET_IPV6, /*filtered=*/false)};
4284 std::vector<CNetAddr> clearnet_addrs;
4285 clearnet_addrs.reserve(v4_addrs.size() + v6_addrs.size());
4286 std::transform(v4_addrs.begin(), v4_addrs.end(), std::back_inserter(clearnet_addrs),
4287 [](const CAddress& addr) { return static_cast<CNetAddr>(addr); });
4288 std::transform(v6_addrs.begin(), v6_addrs.end(), std::back_inserter(clearnet_addrs),
4289 [](const CAddress& addr) { return static_cast<CNetAddr>(addr); });
4290 m_netgroupman.ASMapHealthCheck(clearnet_addrs);
4291}
4292
4293// Dump binary message to file, with timestamp.
4294static void CaptureMessageToFile(const CAddress& addr,
4295 const std::string& msg_type,
4296 std::span<const unsigned char> data,
4297 bool is_incoming)
4298{
4299 // Note: This function captures the message at the time of processing,
4300 // not at socket receive/send time.
4301 // This ensures that the messages are always in order from an application
4302 // layer (processing) perspective.
4303 auto now = GetTime<std::chrono::microseconds>();
4304
4305 // Windows folder names cannot include a colon
4306 std::string clean_addr = addr.ToStringAddrPort();
4307 std::replace(clean_addr.begin(), clean_addr.end(), ':', '_');
4308
4309 fs::path base_path = gArgs.GetDataDirNet() / "message_capture" / fs::u8path(clean_addr);
4310 fs::create_directories(base_path);
4311
4312 fs::path path = base_path / (is_incoming ? "msgs_recv.dat" : "msgs_sent.dat");
4313 AutoFile f{fsbridge::fopen(path, "ab")};
4314
4315 ser_writedata64(f, now.count());
4316 f << std::span{msg_type};
4317 for (auto i = msg_type.length(); i < CMessageHeader::MESSAGE_TYPE_SIZE; ++i) {
4318 f << uint8_t{'\0'};
4319 }
4320 uint32_t size = data.size();
4321 ser_writedata32(f, size);
4322 f << data;
4323
4324 if (f.fclose() != 0) {
4325 throw std::ios_base::failure(
4326 strprintf("Error closing %s after write, file contents are likely incomplete", fs::PathToString(path)));
4327 }
4328}
4329
4330std::function<void(const CAddress& addr,
4331 const std::string& msg_type,
4332 std::span<const unsigned char> data,
4333 bool is_incoming)>
bool DumpPeerAddresses(const ArgsManager &args, const AddrMan &addr)
Definition: addrdb.cpp:185
std::vector< CAddress > ReadAnchors(const fs::path &anchors_db_path)
Read the anchor IP address database (anchors.dat)
Definition: addrdb.cpp:234
void DumpAnchors(const fs::path &anchors_db_path, const std::vector< CAddress > &anchors)
Dump the anchor IP address database (anchors.dat)
Definition: addrdb.cpp:228
ArgsManager gArgs
Definition: args.cpp:38
int ret
int flags
Definition: bitcoin-tx.cpp:530
const CChainParams & Params()
Return the currently selected parameters.
#define Assume(val)
Assume is the identity function.
Definition: check.h:128
Stochastic address manager.
Definition: addrman.h:110
std::vector< std::string > GetArgs(const std::string &strArg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return a vector of strings of the given argument.
Definition: args.cpp:422
fs::path GetDataDirNet() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get data directory path with appended network identifier.
Definition: args.cpp:328
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Definition: args.h:323
bool GetBoolArg(const std::string &strArg, bool fDefault) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return boolean argument or default value.
Definition: args.cpp:571
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:395
bool Decrypt(std::span< const std::byte > input, std::span< const std::byte > aad, bool &ignore, std::span< std::byte > contents) noexcept
Decrypt a packet.
Definition: bip324.cpp:100
std::span< const std::byte > GetSendGarbageTerminator() const noexcept
Get the Garbage Terminator to send.
Definition: bip324.h:92
static constexpr unsigned GARBAGE_TERMINATOR_LEN
Definition: bip324.h:25
unsigned DecryptLength(std::span< const std::byte > input) noexcept
Decrypt the length of a packet.
Definition: bip324.cpp:89
std::span< const std::byte > GetSessionID() const noexcept
Get the Session ID.
Definition: bip324.h:89
const EllSwiftPubKey & GetOurPubKey() const noexcept
Retrieve our public key.
Definition: bip324.h:56
std::span< const std::byte > GetReceiveGarbageTerminator() const noexcept
Get the expected Garbage Terminator to receive.
Definition: bip324.h:95
static constexpr unsigned LENGTH_LEN
Definition: bip324.h:27
static constexpr unsigned EXPANSION
Definition: bip324.h:29
void Initialize(const EllSwiftPubKey &their_pubkey, bool initiator, bool self_decrypt=false) noexcept
Initialize when the other side's public key is received.
Definition: bip324.cpp:34
void Encrypt(std::span< const std::byte > contents, std::span< const std::byte > aad, bool ignore, std::span< std::byte > output) noexcept
Encrypt a packet.
Definition: bip324.cpp:73
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
static constexpr SerParams V2_NETWORK
Definition: protocol.h:429
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition: chainparams.h:77
const MessageStartChars & MessageStart() const
Definition: chainparams.h:90
uint16_t GetDefaultPort() const
Definition: chainparams.h:91
const std::vector< std::string > & DNSSeeds() const
Return the list of hostnames to look up for DNS seeds.
Definition: chainparams.h:113
const std::vector< uint8_t > & FixedSeeds() const
Definition: chainparams.h:116
RAII helper to atomically create a copy of m_nodes and add a reference to each of the nodes.
Definition: net.h:1866
std::atomic_bool m_outbound_tor_ok_at_least_once
Remember if we ever established at least one outbound connection to a Tor peer, including sending and...
Definition: net.h:1220
void NumToOpenAdd(size_t n)
Increment the number of new connections of type ConnectionType::PRIVATE_BROADCAST to be opened by CCo...
Definition: net.cpp:3184
std::optional< Proxy > ProxyForIPv4or6() const
Check if private broadcast can be done to IPv4 or IPv6 peers and if so via which proxy.
Definition: net.cpp:3205
size_t NumToOpenSub(size_t n)
Decrement the number of new connections of type ConnectionType::PRIVATE_BROADCAST to be opened by CCo...
Definition: net.cpp:3190
void NumToOpenWait() const
Wait for the number of needed connections to become greater than 0.
Definition: net.cpp:3200
size_t NumToOpen() const
Get the pending number of connections to open.
Definition: net.cpp:3179
std::optional< Network > PickNetwork(std::optional< Proxy > &proxy) const
Choose a network to open a connection to.
Definition: net.cpp:3146
std::counting_semaphore m_sem_conn_max
Semaphore used to guard against opening too many connections.
Definition: net.h:1226
void AcceptConnection(const ListenSocket &hListenSocket) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:1752
std::unordered_set< Network > GetReachableEmptyNetworks() const
Return reachable networks for which we have no addresses in addrman and therefore may require loading...
Definition: net.cpp:2556
std::condition_variable condMsgProc
Definition: net.h:1757
std::thread threadMessageHandler
Definition: net.h:1778
nSendBufferMaxSize
Definition: net.h:1133
void PerformReconnections() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Attempt reconnections, if m_reconnections non-empty.
Definition: net.cpp:4251
bool MaybePickPreferredNetwork(std::optional< Network > &network) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Search for a "preferred" network, a reachable network to which we currently don't have any OUTBOUND_F...
Definition: net.cpp:2575
std::reference_wrapper< AddrMan > addrman
Definition: net.h:1653
void StopNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3733
void DisconnectNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex
Definition: net.cpp:1939
m_max_outbound_full_relay
Definition: net.h:1124
void DeleteNode(CNode *pnode)
Definition: net.cpp:3771
void ThreadI2PAcceptIncoming() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3258
void Stop() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
whitelist_relay
Definition: net.h:1153
static constexpr size_t MAX_UNUSED_I2P_SESSIONS_SIZE
Cap on the size of m_unused_i2p_sessions, to ensure it does not unexpectedly use too much memory.
Definition: net.h:1859
bool GetTryNewOutboundPeer() const
Definition: net.cpp:2469
const bool use_v2transport(GetLocalServices() &NODE_P2P_V2)
class CConnman::PrivateBroadcast m_private_broadcast
uint16_t GetDefaultPort(Network net) const
Definition: net.cpp:3494
bool AlreadyConnectedToAddress(const CNetAddr &addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given address.
Definition: net.cpp:353
bool ShouldRunInactivityChecks(const CNode &node, NodeClock::time_point now) const
Return true if we should disconnect the peer for failing an inactivity check.
Definition: net.cpp:2036
std::thread threadI2PAcceptIncoming
Definition: net.h:1779
std::vector< CAddress > GetAddresses(CNode &requestor, size_t max_addresses, size_t max_pct)
Return addresses from the per-requestor cache.
Definition: net.cpp:3795
void SetTryNewOutboundPeer(bool flag)
Definition: net.cpp:2474
std::atomic< bool > flagInterruptMsgProc
Definition: net.h:1759
void Interrupt() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc)
Definition: net.cpp:3686
std::map< CNetAddr, LocalServiceInfo > getNetLocalAddresses() const
Definition: net.cpp:3887
void ThreadDNSAddressSeed() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
Definition: net.cpp:2291
std::vector< CAddress > GetCurrentBlockRelayOnlyConns() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Return vector of current BLOCK_RELAY peers.
Definition: net.cpp:2977
m_onion_binds
Definition: net.h:1151
bool AlreadyConnectedToAddressPort(const CService &addr_port) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given address:port.
Definition: net.cpp:347
NodeId GetNewNodeId()
Definition: net.cpp:3489
m_capture_messages
Definition: net.h:1154
std::atomic< NodeId > nLastNodeId
Definition: net.h:1665
bool AlreadyConnectedToHost(std::string_view host) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given "host:port".
Definition: net.cpp:341
m_max_automatic_outbound
Definition: net.h:1126
void WakeMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc)
Definition: net.cpp:2282
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:4016
void SocketHandlerListening(const Sock::EventsPerSock &events_per_sock) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Accept incoming connections, one from each read-ready listening socket.
Definition: net.cpp:2256
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3982
std::thread threadDNSAddressSeed
Definition: net.h:1774
void ASMapHealthCheck()
Definition: net.cpp:4280
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:1894
void SocketHandlerConnected(const std::vector< CNode * > &nodes, const Sock::EventsPerSock &events_per_sock) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
Do the read/write for connected sockets that are ready for IO.
Definition: net.cpp:2154
const uint64_t nSeed1
Definition: net.h:1752
void StartExtraBlockRelayPeers()
Definition: net.cpp:2480
const NetGroupManager & m_netgroupman
Definition: net.h:1654
m_banman
Definition: net.h:1131
std::vector< CAddress > m_anchors
Addresses that were saved during the previous clean shutdown.
Definition: net.h:1749
std::chrono::seconds GetMaxOutboundTimeframe() const
Definition: net.cpp:3989
uint64_t CalculateKeyedNetGroup(const CNetAddr &ad) const
Definition: net.cpp:4244
unsigned int nPrevNodeCount
Definition: net.h:1666
void AddWhitelistPermissionFlags(NetPermissionFlags &flags, std::optional< CNetAddr > addr, const std::vector< NetWhitelistPermissions > &ranges) const
Definition: net.cpp:580
ServiceFlags GetLocalServices() const
Used to convey which local services we are offering peers during node connection.
Definition: net.cpp:4059
bool AddNode(const AddedNodeParams &add) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3833
std::vector< AddedNodeInfo > GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:2991
CNode * ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport, const std::optional< Proxy > &proxy_override) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Open a new P2P connection.
Definition: net.cpp:378
std::atomic_bool m_try_another_outbound_peer
flag for deciding to connect to an extra outbound peer, in excess of m_max_outbound_full_relay This t...
Definition: net.h:1785
bool InitBinds(const Options &options)
Definition: net.cpp:3524
vWhitelistedRangeOutgoing
Definition: net.h:1141
void AddAddrFetch(const std::string &strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex)
Definition: net.cpp:133
std::vector< ListenSocket > vhListenSocket
Definition: net.h:1650
CSipHasher GetDeterministicRandomizer(uint64_t id) const
Get a unique deterministic randomizer.
Definition: net.cpp:4239
Mutex m_total_bytes_sent_mutex
Definition: net.h:1629
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:3053
bool Bind(const CService &addr, unsigned int flags, NetPermissionFlags permissions)
Definition: net.cpp:3505
bool EvictTxPeerIfFull(std::optional< NodeId > protect_peer=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
If we are at capacity for inbound tx-relay peers, attempt to evict one.
Definition: net.cpp:2539
std::thread threadOpenConnections
Definition: net.h:1777
void ThreadPrivateBroadcast() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3303
uint32_t GetMappedAS(const CNetAddr &addr) const
Definition: net.cpp:3893
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
Definition: net.cpp:2441
Mutex m_addr_fetches_mutex
Definition: net.h:1656
m_peer_connect_timeout
Definition: net.h:1135
Mutex m_reconnections_mutex
Mutex protecting m_reconnections.
Definition: net.h:1833
bool Start(CScheduler &scheduler, const Options &options) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
Definition: net.cpp:3558
const uint64_t nSeed0
SipHasher seeds for deterministic randomness.
Definition: net.h:1752
m_local_services
Definition: net.h:1122
std::chrono::seconds GetMaxOutboundTimeLeftInCycle_() const EXCLUSIVE_LOCKS_REQUIRED(m_total_bytes_sent_mutex)
returns the time left in the current max outbound cycle in case of no limit, it will always return 0
Definition: net.cpp:4001
uint64_t GetTotalBytesRecv() const
Definition: net.cpp:4047
std::pair< size_t, bool > SocketSendData(CNode &node) const EXCLUSIVE_LOCKS_REQUIRED(node.cs_vSend)
(Try to) send data from node's vSendMsg.
Definition: net.cpp:1608
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:3091
m_max_outbound_block_relay
Definition: net.h:1125
static bool NodeFullyConnected(const CNode *pnode)
Definition: net.cpp:4148
std::unique_ptr< std::counting_semaphore<> > semOutbound
Definition: net.h:1711
m_client_interface
Definition: net.h:1130
nReceiveFloodSize
Definition: net.h:1134
const CChainParams & m_params
Definition: net.h:1899
void SetNetworkActive(bool active)
Definition: net.cpp:3453
bool MultipleManualOrFullOutboundConns(Network net) const EXCLUSIVE_LOCKS_REQUIRED(m_nodes_mutex)
Definition: net.cpp:2569
bool AddedNodesContain(const CAddress &addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3859
whitelist_forcerelay
Definition: net.h:1152
bool InactivityCheck(const CNode &node, NodeClock::time_point now) const
Return true if the peer is inactive and should be disconnected.
Definition: net.cpp:2041
std::chrono::seconds GetMaxOutboundTimeLeftInCycle() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3994
const std::shared_ptr< CThreadInterrupt > m_interrupt_net
This is signaled when network activity should cease.
Definition: net.h:1765
void CreateNodeFromAcceptedSocket(std::unique_ptr< Sock > &&sock, NetPermissionFlags permission_flags, const CService &addr_bind, const CService &addr) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Create a CNode object from a socket that has just been accepted and add the node to the m_nodes membe...
Definition: net.cpp:1782
void ThreadOpenConnections(std::vector< std::string > connect, std::span< const std::string > seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:2593
bool AttemptToEvictConnection(bool evict_tx_relay_peer_only, std::optional< NodeId > protect_peer=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Try to find an inbound connection to evict.
Definition: net.cpp:1695
void GetNodeStats(std::vector< CNodeStats > &vstats) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3898
bool ForNode(NodeId id, std::function< bool(CNode *pnode)> func) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:4224
m_max_automatic_connections
Definition: net.h:1123
std::thread threadPrivateBroadcast
Definition: net.h:1780
m_msgproc
Definition: net.h:1132
Mutex mutexMsgProc
Definition: net.h:1758
m_max_inbound
Definition: net.h:1127
bool RemoveAddedNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3847
bool fAddressesInitialized
Definition: net.h:1652
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:3784
void NotifyNumConnectionsChanged() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2019
~CConnman()
Definition: net.cpp:3778
void StopThreads()
Definition: net.cpp:3713
int GetExtraBlockRelayCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2523
std::thread threadOpenAddedConnections
Definition: net.h:1776
bool DisconnectNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3912
Mutex m_added_nodes_mutex
Definition: net.h:1661
vWhitelistedRangeIncoming
Definition: net.h:1140
void ThreadSocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
Definition: net.cpp:2271
void RecordBytesSent(uint64_t bytes) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3964
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3217
void Init(const Options &connOptions) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Mutex m_unused_i2p_sessions_mutex
Mutex protecting m_i2p_sam_sessions.
Definition: net.h:1819
uint64_t GetTotalBytesSent() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:4052
std::unique_ptr< std::counting_semaphore<> > semAddnode
Definition: net.h:1712
size_t GetNodeCount(ConnectionDirection) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3870
void RecordBytesRecv(uint64_t bytes)
Definition: net.cpp:3959
int GetExtraFullOutboundCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2507
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:4037
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Check connected and listening sockets for IO readiness and process them accordingly.
Definition: net.cpp:2125
void PushMessage(CNode *pnode, CSerializedNetMsg &&msg) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:4164
int m_max_addnode
Definition: net.h:1733
std::list< CNode * > m_nodes_disconnected
Definition: net.h:1663
std::unique_ptr< i2p::sam::Session > m_i2p_sam_session
I2P SAM session.
Definition: net.h:1772
std::map< uint64_t, CachedAddrResponse > m_addr_response_caches
Addr responses stored in different caches per (network, local socket) prevent cross-network node iden...
Definition: net.h:1696
bool CheckIncomingNonce(uint64_t nonce) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:359
Sock::EventsPerSock GenerateWaitSockets(std::span< CNode *const > nodes)
Generate a collection of sockets to check for IO readiness.
Definition: net.cpp:2094
std::atomic< uint64_t > nTotalBytesRecv
Definition: net.h:1630
std::atomic< bool > fNetworkActive
Definition: net.h:1651
AssertLockNotHeld(m_reconnections_mutex)
std::atomic_bool m_start_extra_block_relay_peers
flag for initiating extra block-relay-only peer connections.
Definition: net.h:1791
m_use_addrman_outgoing
Definition: net.h:1129
CConnman(uint64_t seed0, uint64_t seed1, AddrMan &addrman, const NetGroupManager &netgroupman, const CChainParams &params, bool network_active=true, std::shared_ptr< CThreadInterrupt > interrupt_net=std::make_shared< CThreadInterrupt >())
Definition: net.cpp:3468
void DumpAddresses()
Definition: net.cpp:2431
Mutex m_nodes_mutex
Definition: net.h:1664
std::thread threadSocketHandler
Definition: net.h:1775
m_max_inbound_full_relay
Definition: net.h:1128
nMaxOutboundLimit
Definition: net.h:1138
int GetFullOutboundConnCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2487
bool BindListenPort(const CService &bindAddr, bilingual_str &strError, NetPermissionFlags permissions)
Definition: net.cpp:3372
An encapsulated private key.
Definition: key.h:40
Message header.
Definition: protocol.h:29
static constexpr size_t MESSAGE_TYPE_SIZE
Definition: protocol.h:31
static constexpr size_t CHECKSUM_SIZE
Definition: protocol.h:33
static constexpr size_t HEADER_SIZE
Definition: protocol.h:36
uint8_t pchChecksum[CHECKSUM_SIZE]
Definition: protocol.h:53
Network address.
Definition: netaddress.h:113
Network GetNetClass() const
Definition: netaddress.cpp:680
std::string ToStringAddr() const
Definition: netaddress.cpp:586
std::vector< unsigned char > GetAddrBytes() const
Definition: netaddress.cpp:698
bool IsTor() const
Definition: netaddress.h:176
bool IsRoutable() const
Definition: netaddress.cpp:468
bool IsPrivacyNet() const
Whether this object is a privacy network.
Definition: netaddress.h:190
bool SetSpecial(std::string_view addr)
Parse a Tor or I2P address and set this object to it.
Definition: netaddress.cpp:212
bool IsValid() const
Definition: netaddress.cpp:430
bool IsIPv4() const
Definition: netaddress.h:158
bool IsIPv6() const
Definition: netaddress.h:159
bool SetInternal(const std::string &name)
Create an "internal" address that represents a name or FQDN.
Definition: netaddress.cpp:173
enum Network GetNetwork() const
Definition: netaddress.cpp:502
~CNetCleanup()
Definition: net.cpp:3676
CNetCleanup()=default
Transport protocol agnostic message container.
Definition: net.h:239
size_t GetMemoryUsage() const noexcept
Compute total memory usage of this object (own memory + any dynamic memory).
Definition: net.cpp:128
std::string m_type
Definition: net.h:246
DataStream m_recv
received message data
Definition: net.h:241
Information about a peer.
Definition: net.h:683
std::atomic< int > nVersion
Definition: net.h:730
bool IsInboundConn() const
Definition: net.h:843
CountingSemaphoreGrant grantOutbound
Definition: net.h:746
std::atomic_bool fPauseRecv
Definition: net.h:750
std::string LogPeer() const
Helper function to log the peer id, optionally including IP address.
Definition: net.cpp:712
NodeId GetId() const
Definition: net.h:928
std::atomic< NodeClock::duration > m_last_ping_time
Last measured round-trip duration. Used only for stats.
Definition: net.h:908
const std::string m_addr_name
Definition: net.h:725
bool IsConnectedThroughPrivacyNet() const
Whether this peer connected through a privacy network.
Definition: net.cpp:615
void CopyStats(CNodeStats &stats) EXCLUSIVE_LOCKS_REQUIRED(!m_subver_mutex
Definition: net.cpp:622
std::string ConnectionTypeAsString() const
Definition: net.h:982
const CService addrBind
Definition: net.h:724
std::atomic< bool > m_bip152_highbandwidth_to
Definition: net.h:879
std::list< CNetMessage > vRecvMsg
Definition: net.h:1011
std::atomic< bool > m_bip152_highbandwidth_from
Definition: net.h:881
std::atomic_bool fSuccessfullyConnected
fSuccessfullyConnected is set to true on receiving VERACK from the peer.
Definition: net.h:742
const CAddress addr
Definition: net.h:722
bool ReceiveMsgBytes(std::span< const uint8_t > msg_bytes, bool &complete) EXCLUSIVE_LOCKS_REQUIRED(!cs_vRecv)
Receive bytes from the buffer and deserialize them into messages.
Definition: net.cpp:668
void SetAddrLocal(const CService &addrLocalIn) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex)
May not be called more than once.
Definition: net.cpp:602
const NodeClock::time_point m_connected
Unix epoch time at peer connection.
Definition: net.h:716
std::atomic< NodeClock::time_point > m_last_recv
Definition: net.h:714
CNode(NodeId id, std::shared_ptr< Sock > sock, const CAddress &addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CService &addrBindIn, const std::string &addrNameIn, ConnectionType conn_type_in, bool inbound_onion, uint64_t network_key, CNodeOptions &&node_opts={})
Definition: net.cpp:4073
void MarkReceivedMsgsForProcessing() EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex)
Move all messages from the received queue to the processing queue.
Definition: net.cpp:4117
Mutex m_subver_mutex
Definition: net.h:731
Mutex cs_vSend
Definition: net.h:707
CNode * AddRef()
Definition: net.h:967
const uint64_t m_network_key
Network key used to prevent fingerprinting our node across networks.
Definition: net.h:755
std::atomic_bool fPauseSend
Definition: net.h:751
std::string DisconnectMsg() const
Helper function to log disconnects.
Definition: net.cpp:722
std::atomic< NodeClock::duration > m_min_ping_time
Lowest measured round-trip duration.
Definition: net.h:912
std::optional< std::pair< CNetMessage, bool > > PollMessage() EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex)
Poll the next message from the processing queue of this connection.
Definition: net.cpp:4134
Mutex m_msg_process_queue_mutex
Definition: net.h:1013
std::atomic< NodeClock::time_point > m_last_send
Definition: net.h:713
const ConnectionType m_conn_type
Definition: net.h:757
Network ConnectedThroughNetwork() const
Get network the peer connected through.
Definition: net.cpp:610
const size_t m_recv_flood_size
Definition: net.h:1010
bool IsManualOrFullOutboundConn() const
Definition: net.h:802
bool IsPrivateBroadcastConn() const
Definition: net.h:831
const std::unique_ptr< Transport > m_transport
Transport serializer/deserializer.
Definition: net.h:687
const NetPermissionFlags m_permission_flags
Definition: net.h:689
Mutex m_addr_local_mutex
Definition: net.h:1019
const bool m_inbound_onion
Whether this peer is an inbound onion, i.e. connected via our Tor onion service.
Definition: net.h:729
Mutex cs_vRecv
Definition: net.h:709
std::atomic< std::chrono::seconds > m_last_block_time
UNIX epoch time of the last block received from this peer that we had not yet seen (e....
Definition: net.h:899
Mutex m_sock_mutex
Definition: net.h:708
std::atomic_bool fDisconnect
Definition: net.h:745
std::atomic< std::chrono::seconds > m_last_tx_time
UNIX epoch time of the last transaction received from this peer that we had not yet seen (e....
Definition: net.h:905
CService GetAddrLocal() const EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex)
Definition: net.cpp:595
void CloseSocketDisconnect() EXCLUSIVE_LOCKS_REQUIRED(!m_sock_mutex)
Definition: net.cpp:562
std::string m_session_id
BIP324 session id string in hex, if any.
Definition: net.h:230
std::string addrLocal
Definition: net.h:218
bool fInbound
Definition: net.h:205
TransportProtocolType m_transport_type
Transport protocol type.
Definition: net.h:228
Network m_network
Definition: net.h:224
NodeId nodeid
Definition: net.h:196
Simple class for background tasks that should be run periodically or once "after a while".
Definition: scheduler.h:39
void scheduleEvery(Function f, std::chrono::milliseconds delta) EXCLUSIVE_LOCKS_REQUIRED(!newTaskMutex)
Repeat f until the scheduler is stopped.
Definition: scheduler.cpp:108
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:531
bool SetSockAddr(const struct sockaddr *paddr, socklen_t addrlen)
Set CService from a network sockaddr.
Definition: netaddress.cpp:812
uint16_t GetPort() const
Definition: netaddress.cpp:841
sa_family_t GetSAFamily() const
Get the address family.
Definition: netaddress.cpp:828
bool GetSockAddr(struct sockaddr *paddr, socklen_t *addrlen) const
Obtain the IPv4/6 socket address this represents.
Definition: netaddress.cpp:868
std::string ToStringAddrPort() const
Definition: netaddress.cpp:909
General SipHash-2-4 implementation.
Definition: siphash.h:99
uint64_t Finalize() const
Compute the 64-bit SipHash-2-4 of the data written so far.
Definition: siphash.cpp:45
CSipHasher & Write(uint64_t data)
Hash a 64-bit integer worth of data.
Definition: siphash.cpp:14
std::string ToString() const
bool Match(const CNetAddr &addr) const
std::chrono::steady_clock Clock
RAII-style semaphore lock.
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:165
size_t GetMemoryUsage() const noexcept
Compute total memory usage of this object (own memory + any dynamic memory).
Definition: streams.cpp:140
Fast randomness source.
Definition: random.h:386
void fillrand(std::span< std::byte > output) noexcept
Fill a byte span with random bytes.
Definition: random.cpp:626
Different type to mark Mutex at global scope.
Definition: sync.h:142
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
Definition: net.h:1044
Netgroup manager.
Definition: netgroup.h:17
bool UsingASMap() const
Indicates whether ASMap is being used for clearnet bucketing.
Definition: netgroup.cpp:125
void ASMapHealthCheck(const std::vector< CNetAddr > &clearnet_addrs) const
Analyze and log current health of ASMap based buckets.
Definition: netgroup.cpp:109
std::vector< unsigned char > GetGroup(const CNetAddr &address) const
Get the canonical identifier of the network group for address.
Definition: netgroup.cpp:19
uint32_t GetMappedAS(const CNetAddr &address) const
Get the autonomous system on the BGP path to address.
Definition: netgroup.cpp:82
NetPermissionFlags m_flags
static void AddFlag(NetPermissionFlags &flags, NetPermissionFlags f)
static void ClearFlag(NetPermissionFlags &flags, NetPermissionFlags f)
ClearFlag is only called with f == NetPermissionFlags::Implicit.
static bool HasFlag(NetPermissionFlags flags, NetPermissionFlags f)
static bool TryParse(const std::string &str, NetWhitebindPermissions &output, bilingual_str &error)
Wrapper that overrides the GetParams() function of a stream.
Definition: serialize.h:1169
Tp rand_uniform_delay(const Tp &time, typename Tp::duration range) noexcept
Return the time point advanced by a uniform random duration.
Definition: random.h:329
Chrono::duration rand_uniform_duration(typename Chrono::duration range) noexcept
Generate a uniform random duration in the range from 0 (inclusive) to range (exclusive).
Definition: random.h:336
I randrange(I range) noexcept
Generate a random integer in the range [0..range), with range > 0.
Definition: random.h:254
std::chrono::microseconds rand_exp_duration(std::chrono::microseconds mean) noexcept
Return a duration sampled from an exponential distribution (https://en.wikipedia.org/wiki/Exponential...
Definition: random.h:365
uint64_t randbits(int bits) noexcept
Generate a random (bits)-bit integer.
Definition: random.h:204
std::unordered_set< Network > All() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:147
bool Contains(Network net) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:134
static constexpr Event RecvEvent
If passed to Wait(), then it will wait for readiness to read from the socket.
Definition: sock.h:151
uint8_t Event
Definition: sock.h:146
static constexpr Event SendEvent
If passed to Wait(), then it will wait for readiness to send to the socket.
Definition: sock.h:156
static constexpr Event ErrorEvent
Ignored if passed to Wait(), but could be set in the occurred events if an exceptional condition has ...
Definition: sock.h:162
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
Definition: sock.h:216
Minimal stream for reading from an existing byte array by std::span.
Definition: streams.h:83
std::tuple< std::span< const uint8_t >, bool, const std::string & > BytesToSend
Return type for GetBytesToSend, consisting of:
Definition: net.h:320
CNetMessage GetReceivedMessage(NodeClock::time_point time, bool &reject_message) override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Retrieve a completed message from transport.
Definition: net.cpp:809
bool SetMessageToSend(CSerializedNetMsg &msg) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Set the next message to send.
Definition: net.cpp:848
Info GetInfo() const noexcept override
Retrieve information about this transport.
Definition: net.cpp:734
int readData(std::span< const uint8_t > msg_bytes) EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Definition: net.cpp:782
const NodeId m_node_id
Definition: net.h:380
Mutex m_send_mutex
Lock for sending state.
Definition: net.h:415
const MessageStartChars m_magic_bytes
Definition: net.h:379
size_t GetSendMemoryUsage() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Return the memory usage of this transport attributable to buffered data to send.
Definition: net.cpp:910
const uint256 & GetMessageHash() const EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Definition: net.cpp:800
void MarkBytesSent(size_t bytes_sent) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Report how many bytes returned by the last GetBytesToSend() have been sent.
Definition: net.cpp:894
int readHeader(std::span< const uint8_t > msg_bytes) EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Definition: net.cpp:739
bool CompleteInternal() const noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Definition: net.h:407
bool ReceivedBytes(std::span< const uint8_t > &msg_bytes) override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Feed wire bytes to the transport.
Definition: net.h:436
V1Transport(NodeId node_id) noexcept
Definition: net.cpp:727
BytesToSend GetBytesToSend(bool have_next_message) const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Get bytes to send on the wire, if any, along with other information about it.
Definition: net.cpp:873
void Reset() EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Definition: net.h:395
Mutex m_recv_mutex
Lock for receive state.
Definition: net.h:381
bool ReceivedMessageComplete() const override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Returns true if the current message is complete (so GetReceivedMessage can be called).
Definition: net.h:428
void MarkBytesSent(size_t bytes_sent) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Report how many bytes returned by the last GetBytesToSend() have been sent.
Definition: net.cpp:1539
static constexpr uint32_t MAX_GARBAGE_LEN
Definition: net.h:643
const NodeId m_nodeid
NodeId (for debug logging).
Definition: net.h:589
size_t GetMaxBytesToProcess() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Determine how many received bytes can be processed in one go (not allowed in V1 state).
Definition: net.cpp:1281
BIP324Cipher m_cipher
Cipher state.
Definition: net.h:585
size_t GetSendMemoryUsage() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Return the memory usage of this transport attributable to buffered data to send.
Definition: net.cpp:1578
void ProcessReceivedMaybeV1Bytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex
Process bytes in m_recv_buffer, while in KEY_MAYBE_V1 state.
Definition: net.cpp:1087
SendState
State type that controls the sender side.
Definition: net.h:554
@ READY
Normal sending state.
@ AWAITING_KEY
Waiting for the other side's public key.
@ V1
This transport is using v1 fallback.
V1Transport m_v1_fallback
Encapsulate a V1Transport to fall back to.
Definition: net.h:591
static constexpr size_t V1_PREFIX_LEN
The length of the V1 prefix to match bytes initially received by responders with to determine if thei...
Definition: net.h:468
void StartSendingHandshake() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_send_mutex)
Put our public key + garbage in the send buffer.
Definition: net.cpp:994
bool ProcessReceivedPacketBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Process bytes in m_recv_buffer, while in VERSION/APP state.
Definition: net.cpp:1212
CNetMessage GetReceivedMessage(NodeClock::time_point time, bool &reject_message) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Retrieve a completed message from transport.
Definition: net.cpp:1461
bool ProcessReceivedKeyBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex
Process bytes in m_recv_buffer, while in KEY state.
Definition: net.cpp:1125
const bool m_initiating
Whether we are the initiator side.
Definition: net.h:587
Info GetInfo() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Retrieve information about this transport.
Definition: net.cpp:1587
BytesToSend GetBytesToSend(bool have_next_message) const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Get bytes to send on the wire, if any, along with other information about it.
Definition: net.cpp:1522
void SetReceiveState(RecvState recv_state) noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Change the receive state.
Definition: net.cpp:1027
bool ProcessReceivedGarbageBytes() noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
Process bytes in m_recv_buffer, while in GARB_GARBTERM state.
Definition: net.cpp:1185
bool ReceivedMessageComplete() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Returns true if the current message is complete (so GetReceivedMessage can be called).
Definition: net.cpp:1078
static constexpr std::array< std::byte, 0 > VERSION_CONTENTS
Contents of the version packet to send.
Definition: net.h:464
static std::optional< std::string > GetMessageType(std::span< const uint8_t > &contents) noexcept
Given a packet's contents, find the message type (if valid), and strip it from contents.
Definition: net.cpp:1420
bool ReceivedBytes(std::span< const uint8_t > &msg_bytes) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex
Feed wire bytes to the transport.
Definition: net.cpp:1330
bool ShouldReconnectV1() const noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex
Whether upon disconnections, a reconnect with V1 is warranted.
Definition: net.cpp:1561
bool SetMessageToSend(CSerializedNetMsg &msg) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Set the next message to send.
Definition: net.cpp:1490
V2Transport(NodeId nodeid, bool initiating) noexcept
Construct a V2 transport with securely generated random keys.
Definition: net.cpp:1023
RecvState
State type that defines the current contents of the receive buffer and/or how the next received bytes...
Definition: net.h:489
@ VERSION
Version packet.
@ APP
Application packet.
@ GARB_GARBTERM
Garbage and garbage terminator.
@ V1
Nothing (this transport is using v1 fallback).
@ KEY_MAYBE_V1
(Responder only) either v2 public key or v1 header.
@ APP_READY
Nothing (an application packet is available for GetMessage()).
void SetSendState(SendState send_state) noexcept EXCLUSIVE_LOCKS_REQUIRED(m_send_mutex)
Change the send state.
Definition: net.cpp:1058
constexpr unsigned char * begin()
Definition: uint256.h:101
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition: prevector.h:37
bool empty() const
Definition: prevector.h:251
size_type size() const
Definition: prevector.h:247
void push_back(const T &value)
Definition: prevector.h:392
256-bit opaque blob.
Definition: uint256.h:196
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
#define WSAEWOULDBLOCK
Definition: compat.h:61
#define SOCKET_ERROR
Definition: compat.h:68
#define WSAGetLastError()
Definition: compat.h:59
#define WSAEMSGSIZE
Definition: compat.h:63
#define COMPAT_IN6ADDR_ANY_INIT
Definition: compat.h:45
#define MSG_NOSIGNAL
Definition: compat.h:110
#define MSG_DONTWAIT
Definition: compat.h:115
#define WSAEINPROGRESS
Definition: compat.h:65
#define WSAEADDRINUSE
Definition: compat.h:66
#define WSAEINTR
Definition: compat.h:64
std::string ConnectionTypeAsString(ConnectionType conn_type)
Convert ConnectionType enum to a string value.
ConnectionType
Different types of connections to a peer.
@ PRIVATE_BROADCAST
Private broadcast connections are short-lived and only opened to privacy networks (Tor,...
@ 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.
@ INBOUND
Inbound connections are those initiated by a peer.
@ ADDR_FETCH
AddrFetch connections are short lived connections used to solicit addresses from peers.
@ V1
Unencrypted, plaintext protocol.
@ V2
BIP324 protocol.
@ DETECTING
Peer could be v1 or v2.
constexpr unsigned int MAX_BLOCK_SERIALIZED_SIZE
The maximum allowed size for a serialized block, in bytes (only for buffer size limits)
Definition: consensus.h:13
uint32_t ReadLE32(const B *ptr)
Definition: common.h:27
static CService ip(uint32_t i)
std::optional< NodeId > SelectNodeToEvict(std::vector< NodeEvictionCandidate > &&vEvictionCandidates)
Select an inbound peer to evict after filtering out (protecting) peers having distinct,...
Definition: eviction.cpp:178
static path u8path(std::string_view utf8_str)
Definition: fs.h:80
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition: fs.h:160
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
Definition: hash.h:83
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
CKey GenerateRandomKey(bool compressed) noexcept
Definition: key.cpp:354
std::thread thread
Thread variable should be after other struct members so the thread does not start until the other mem...
#define LogWarning(...)
Definition: log.h:126
#define LogInfo(...)
Definition: log.h:125
#define LogError(...)
Definition: log.h:127
#define LogDebug(category,...)
Definition: log.h:143
bool fLogIPs
Definition: logging.cpp:47
unsigned int nonce
@ PRIVBROADCAST
Definition: categories.h:47
@ PROXY
Definition: categories.h:31
@ NET
Definition: categories.h:16
constexpr const char * FILTERCLEAR
The filterclear message tells the receiving peer to remove a previously-set bloom filter.
Definition: protocol.h:180
constexpr const char * FEEFILTER
The feefilter message tells the receiving peer not to inv us any txs which do not meet the specified ...
Definition: protocol.h:192
constexpr const char * GETBLOCKS
The getblocks message requests an inv message that provides block header hashes starting from a parti...
Definition: protocol.h:107
constexpr const char * HEADERS
The headers message sends one or more block headers to a node which previously requested certain head...
Definition: protocol.h:123
constexpr const char * ADDR
The addr (IP address) message relays connection information for peers on the network.
Definition: protocol.h:75
constexpr const char * GETBLOCKTXN
Contains a BlockTransactionsRequest Peer should respond with "blocktxn" message.
Definition: protocol.h:212
constexpr const char * CMPCTBLOCK
Contains a CBlockHeaderAndShortTxIDs object - providing a header and list of "short txids".
Definition: protocol.h:206
constexpr const char * CFCHECKPT
cfcheckpt is a response to a getcfcheckpt request containing a vector of evenly spaced filter headers...
Definition: protocol.h:254
constexpr const char * GETCFILTERS
getcfilters requests compact filters for a range of blocks.
Definition: protocol.h:224
constexpr const char * PONG
The pong message replies to a ping message, proving to the pinging node that the ponging node is stil...
Definition: protocol.h:150
constexpr const char * BLOCKTXN
Contains a BlockTransactions.
Definition: protocol.h:218
constexpr const char * CFHEADERS
cfheaders is a response to a getcfheaders request containing a filter header and a vector of filter h...
Definition: protocol.h:242
constexpr const char * PING
The ping message is sent periodically to help confirm that the receiving peer is still connected.
Definition: protocol.h:144
constexpr const char * FILTERLOAD
The filterload message tells the receiving peer to filter all relayed transactions and requested merk...
Definition: protocol.h:164
constexpr const char * ADDRV2
The addrv2 message relays connection information for peers on the network just like the addr message,...
Definition: protocol.h:81
constexpr const char * VERACK
The verack message acknowledges a previously-received version message, informing the connecting node ...
Definition: protocol.h:70
constexpr const char * GETHEADERS
The getheaders message requests a headers message that provides block headers starting from a particu...
Definition: protocol.h:113
constexpr const char * FILTERADD
The filteradd message tells the receiving peer to add a single element to a previously-set bloom filt...
Definition: protocol.h:172
constexpr const char * CFILTER
cfilter is a response to a getcfilters request containing a single compact filter.
Definition: protocol.h:229
constexpr const char * FEATURE
BIP 434 Peer feature negotiation.
Definition: protocol.h:270
constexpr const char * GETDATA
The getdata message requests one or more data objects from another node.
Definition: protocol.h:96
constexpr const char * SENDCMPCT
Contains a 1-byte bool and 8-byte LE version number.
Definition: protocol.h:200
constexpr const char * GETCFCHECKPT
getcfcheckpt requests evenly spaced compact filter headers, enabling parallelized download and valida...
Definition: protocol.h:249
constexpr const char * INV
The inv message (inventory message) transmits one or more inventories of objects known to the transmi...
Definition: protocol.h:92
constexpr const char * TX
The tx message transmits a single transaction.
Definition: protocol.h:117
constexpr const char * MEMPOOL
The mempool message requests the TXIDs of transactions that the receiving node has verified as valid ...
Definition: protocol.h:139
constexpr const char * NOTFOUND
The notfound message is a reply to a getdata message which requested an object the receiving node doe...
Definition: protocol.h:156
constexpr const char * MERKLEBLOCK
The merkleblock message is a reply to a getdata message which requested a block using the inventory t...
Definition: protocol.h:102
constexpr const char * BLOCK
The block message transmits a single serialized block.
Definition: protocol.h:127
constexpr const char * GETCFHEADERS
getcfheaders requests a compact filter header and the filter hashes for a range of blocks,...
Definition: protocol.h:237
constexpr const char * VERSION
The version message provides information about the transmitting node to the receiving node at the beg...
Definition: protocol.h:65
FILE * fopen(const fs::path &p, const char *mode)
Definition: fs.cpp:23
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
Definition: memusage.h:31
Definition: messages.h:21
static const unsigned char VERSION[]
Definition: netaddress.cpp:188
void TraceThread(std::string_view thread_name, std::function< void()> thread_func)
A wrapper for do-something-once thread functions.
Definition: thread.cpp:15
const std::string KEY
Definition: walletdb.cpp:44
uint16_t GetListenPort()
Definition: net.cpp:139
static constexpr int DNSSEEDS_TO_QUERY_AT_ONCE
Number of DNS seeds to query when the number of connections is low.
Definition: net.cpp:67
bool IsLocal(const CService &addr)
check whether a given address is potentially local
Definition: net.cpp:335
static const uint64_t RANDOMIZER_ID_NETGROUP
Definition: net.cpp:111
static const uint64_t SELECT_TIMEOUT_MILLISECONDS
Definition: net.cpp:107
static const uint64_t RANDOMIZER_ID_NETWORKKEY
Definition: net.cpp:113
void RemoveLocal(const CService &addr)
Definition: net.cpp:313
BindFlags
Used to pass flags to the Bind() function.
Definition: net.cpp:95
@ BF_REPORT_ERROR
Definition: net.cpp:97
@ BF_NONE
Definition: net.cpp:96
@ BF_DONT_ADVERTISE
Do not call AddLocal() for our special addresses, e.g., for incoming Tor connections,...
Definition: net.cpp:102
bool fDiscover
Definition: net.cpp:117
static const uint64_t RANDOMIZER_ID_LOCALHOSTNONCE
Definition: net.cpp:112
static constexpr std::chrono::minutes DUMP_PEERS_INTERVAL
Definition: net.cpp:64
static constexpr auto EXTRA_NETWORK_PEER_INTERVAL
Frequency to attempt extra connections to reachable networks we're not connected to yet.
Definition: net.cpp:92
static constexpr int SEED_OUTBOUND_CONNECTION_THRESHOLD
Minimum number of outbound connections under which we will keep fetching our address seeds.
Definition: net.cpp:70
void ClearLocal()
Definition: net.cpp:271
static constexpr auto FEELER_SLEEP_WINDOW
Definition: net.cpp:89
static constexpr int DNSSEEDS_DELAY_PEER_THRESHOLD
Definition: net.cpp:83
bool fListen
Definition: net.cpp:118
static constexpr size_t MAX_BLOCK_RELAY_ONLY_ANCHORS
Maximum number of block-relay-only anchor connections.
Definition: net.cpp:58
static bool IsPeerAddrLocalGood(CNode *pnode)
Definition: net.cpp:234
static constexpr std::chrono::seconds DNSSEEDS_DELAY_FEW_PEERS
How long to delay before querying DNS seeds.
Definition: net.cpp:81
std::string strSubVersion
Subversion as sent to the P2P network in version messages.
Definition: net.cpp:121
std::optional< CService > GetLocalAddrForPeer(CNode &node)
Returns a local address that we should advertise to this peer.
Definition: net.cpp:241
const std::string NET_MESSAGE_TYPE_OTHER
Definition: net.cpp:109
TRACEPOINT_SEMAPHORE(net, closed_connection)
#define X(name)
Definition: net.cpp:621
static std::unique_ptr< Transport > MakeTransport(NodeId id, bool use_v2transport, bool inbound) noexcept
Definition: net.cpp:4064
const char *const ANCHORS_DATABASE_FILENAME
Anchor IP address database file name.
Definition: net.cpp:61
static std::vector< CAddress > ConvertSeeds(const std::vector< uint8_t > &vSeedsIn)
Convert the serialized seeds into usable address objects.
Definition: net.cpp:196
static void CaptureMessageToFile(const CAddress &addr, const std::string &msg_type, std::span< const unsigned char > data, bool is_incoming)
Definition: net.cpp:4294
CService GetLocalAddress(const CNode &peer)
Definition: net.cpp:221
GlobalMutex g_maplocalhost_mutex
Definition: net.cpp:119
std::map< CNetAddr, LocalServiceInfo > mapLocalHost GUARDED_BY(g_maplocalhost_mutex)
static std::optional< CService > GetLocal(const CNode &peer)
Definition: net.cpp:166
std::function< void(const CAddress &addr, const std::string &msg_type, std::span< const unsigned char > data, bool is_incoming)> CaptureMessage
Defaults to CaptureMessageToFile(), but can be overridden by unit tests.
Definition: net.cpp:4334
static constexpr std::chrono::minutes DNSSEEDS_DELAY_MANY_PEERS
Definition: net.cpp:82
bool AddLocal(const CService &addr_, int nScore, bool add_even_if_unreachable)
Definition: net.cpp:278
static int GetnScore(const CService &addr)
Definition: net.cpp:226
static bool IsOutboundMessageAllowedInPrivateBroadcast(std::string_view type) noexcept
Private broadcast connections only need to send certain message types.
Definition: net.cpp:4155
static CNetCleanup instance_of_cnetcleanup
Definition: net.cpp:3684
static constexpr std::chrono::seconds MAX_UPLOAD_TIMEFRAME
The default timeframe for -maxuploadtarget.
Definition: net.cpp:86
void Discover()
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses t...
Definition: net.cpp:3441
bool SeenLocal(const CService &addr)
vote for a local address
Definition: net.cpp:324
constexpr bool DEFAULT_PRIVATE_BROADCAST
Default for -privatebroadcast.
Definition: net.h:91
constexpr std::chrono::minutes TIMEOUT_INTERVAL
Time after which to disconnect, after waiting for a ping response (or inactivity).
Definition: net.h:59
constexpr bool DEFAULT_FIXEDSEEDS
Definition: net.h:99
constexpr unsigned int MAX_PROTOCOL_MESSAGE_LENGTH
Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable).
Definition: net.h:65
constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL
Run the extra block-relay-only connection loop once every 5 minutes.
Definition: net.h:63
constexpr bool DEFAULT_FORCEDNSSEED
Definition: net.h:97
constexpr bool DEFAULT_DNSSEED
Definition: net.h:98
int64_t NodeId
Definition: net.h:105
constexpr int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
Definition: net.h:73
constexpr std::chrono::hours ASMAP_HEALTH_CHECK_INTERVAL
Interval for ASMap Health Check.
Definition: net.h:95
constexpr auto FEELER_INTERVAL
Run the feeler connection loop once every 2 minutes.
Definition: net.h:61
@ LOCAL_MANUAL
Definition: net.h:160
@ LOCAL_BIND
Definition: net.h:158
@ LOCAL_IF
Definition: net.h:157
constexpr int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
Definition: net.h:69
NetPermissionFlags
constexpr uint16_t I2P_SAM31_PORT
SAM 3.1 and earlier do not support specifying ports and force the port to 0.
Definition: netaddress.h:105
Network
A network type.
Definition: netaddress.h:33
@ NET_I2P
I2P.
Definition: netaddress.h:47
@ NET_CJDNS
CJDNS.
Definition: netaddress.h:50
@ NET_MAX
Dummy value to indicate the number of NET_* constants.
Definition: netaddress.h:57
@ NET_ONION
TOR (v2 or v3)
Definition: netaddress.h:44
@ NET_IPV6
IPv6.
Definition: netaddress.h:41
@ NET_IPV4
IPv4.
Definition: netaddress.h:38
@ 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
std::optional< Proxy > GetNameProxy()
Definition: netbase.cpp:744
std::unique_ptr< Sock > ConnectDirectly(const CService &dest, bool manual_connection)
Create a socket and try to connect to the specified service.
Definition: netbase.cpp:650
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
CThreadInterrupt g_socks5_interrupt
Interrupt SOCKS5 reads or writes.
Definition: netbase.cpp:41
bool HaveNameProxy()
Definition: netbase.cpp:753
CService GetBindAddress(const Sock &sock)
Get the bind address for a socket as CService.
Definition: netbase.cpp:970
std::vector< CService > Lookup(const std::string &name, uint16_t portDefault, bool fAllowLookup, unsigned int nMaxSolutions, DNSLookupFn dns_lookup_function)
Resolve a service string to its corresponding service.
Definition: netbase.cpp:191
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
bool fNameLookup
Definition: netbase.cpp:37
std::unique_ptr< Sock > ConnectThroughProxy(const Proxy &proxy, const std::string &dest, uint16_t port, bool &proxy_connection_failed)
Connect to a specified destination service through a SOCKS5 proxy by first connecting to the SOCKS5 p...
Definition: netbase.cpp:804
std::function< std::unique_ptr< Sock >(int, int, int)> CreateSock
Socket factory.
Definition: netbase.cpp:577
CService LookupNumeric(const std::string &name, uint16_t portDefault, DNSLookupFn dns_lookup_function)
Resolve a service string with a numeric IP to its first corresponding service.
Definition: netbase.cpp:216
bool IsBadPort(uint16_t port)
Determine if a port is "bad" from the perspective of attempting to connect to a node on that port.
Definition: netbase.cpp:866
std::optional< Proxy > GetProxy(enum Network net)
Definition: netbase.cpp:726
ConnectionDirection
Definition: netbase.h:35
std::vector< CNetAddr > GetLocalAddresses()
Return all local non-loopback IPv4 and IPv6 network addresses.
Definition: netif.cpp:321
T SaturatingAdd(const T i, const T j) noexcept
Definition: overflow.h:44
const std::array ALL_NET_MESSAGE_TYPES
All known message types (see above).
Definition: protocol.h:274
constexpr ServiceFlags SeedsServiceFlags()
State independent service flags.
Definition: protocol.h:366
ServiceFlags
nServices flags
Definition: protocol.h:321
@ NODE_NONE
Definition: protocol.h:324
@ NODE_P2P_V2
Definition: protocol.h:342
constexpr ServiceFlags SeedsAssumedServiceFlags()
Service flags we assume for addresses obtained from the DNS seeds and the fixed seeds,...
Definition: protocol.h:374
static bool MayHaveUsefulAddressDB(ServiceFlags services)
Checks if a peer with the given service flags may be capable of having a robust address-storage DB.
Definition: protocol.h:380
void RandAddEvent(const uint32_t event_info) noexcept
Gathers entropy from the low bits of the time at which events occur.
Definition: random.cpp:617
uint256 GetRandHash() noexcept
Generate a random uint256.
Definition: random.h:463
void ser_writedata32(Stream &s, uint32_t obj)
Definition: serialize.h:66
constexpr uint64_t MAX_SIZE
The maximum size of a serialized object in bytes or number of elements (for eg vectors) when the size...
Definition: serialize.h:35
void ser_writedata64(Stream &s, uint64_t obj)
Definition: serialize.h:76
std::string NetworkErrorString(int err)
Return readable error string for a network error code.
Definition: sock.cpp:426
auto MakeByteSpan(const V &v) noexcept
Definition: span.h:84
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span{v}))
Like the std::span constructor, but for (const) unsigned char member types only.
Definition: span.h:111
T & SpanPopBack(std::span< T > &span)
A span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:75
auto MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:89
unsigned char * UCharCast(char *c)
Definition: span.h:95
std::string m_added_node
Definition: net.h:108
Cache responses to addr requests to minimize privacy leak.
Definition: net.h:1677
std::chrono::microseconds m_cache_entry_expiration
Definition: net.h:1679
std::vector< CAddress > m_addrs_response_cache
Definition: net.h:1678
void AddSocketPermissionFlags(NetPermissionFlags &flags) const
Definition: net.h:1436
std::shared_ptr< Sock > sock
Definition: net.h:1435
std::vector< NetWhitebindPermissions > vWhiteBinds
Definition: net.h:1103
std::vector< CService > onion_binds
Definition: net.h:1105
std::vector< std::string > m_specified_outgoing
Definition: net.h:1110
std::vector< CService > vBinds
Definition: net.h:1104
bool m_i2p_accept_incoming
Definition: net.h:1112
std::vector< std::string > vSeedNodes
Definition: net.h:1100
bool m_use_addrman_outgoing
Definition: net.h:1109
bool bind_on_any
True if the user did not specify -bind= or -whitebind= and thus we should bind on 0....
Definition: net.h:1108
NetPermissionFlags permission_flags
Definition: net.h:673
std::string m_type
Definition: net.h:139
std::vector< unsigned char > data
Definition: net.h:138
size_t GetMemoryUsage() const noexcept
Compute total memory usage of this object (own memory + any dynamic memory).
Definition: net.cpp:123
An ElligatorSwift-encoded public key.
Definition: pubkey.h:315
static constexpr size_t size()
Definition: pubkey.h:332
uint16_t nPort
Definition: net.h:184
int nScore
Definition: net.h:183
Version of the system clock that is mockable in the context of tests (via FakeNodeClock or SetMockTim...
Definition: time.h:27
static time_point now() noexcept
Return current system time or mocked time, if set.
Definition: time.cpp:38
std::chrono::time_point< NodeClock > time_point
Definition: time.h:28
static constexpr time_point epoch
Definition: time.h:33
Auxiliary requested/occurred events to wait for in WaitMany().
Definition: sock.h:181
std::optional< uint256 > session_id
Definition: net.h:270
TransportProtocolType transport_type
Definition: net.h:269
Bilingual messages:
Definition: translation.h:24
std::string original
Definition: translation.h:25
An established connection with another peer.
Definition: i2p.h:32
std::unique_ptr< Sock > sock
Connected socket.
Definition: i2p.h:34
CService me
Our I2P address.
Definition: i2p.h:37
CService peer
The peer's I2P address.
Definition: i2p.h:40
#define WAIT_LOCK(cs, name)
Definition: sync.h:274
#define AssertLockNotHeld(cs)
Definition: sync.h:149
#define LOCK(cs)
Definition: sync.h:268
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:299
FastRandomContext rng
Definition: dbwrapper.cpp:413
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172
#define TRACEPOINT(context,...)
Definition: trace.h:56
consteval auto _(util::TranslatedLiteral str)
Definition: translation.h:79
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
bool SplitHostPort(std::string_view in, uint16_t &portOut, std::string &hostOut)
Splits socket address string into host string and port value.
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
constexpr int64_t count_seconds(std::chrono::seconds t)
Definition: time.h:97
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:35
AssertLockHeld(pool.cs)
assert(!tx.IsCoinBase())
void ClearShrink(V &v) noexcept
Clear a vector (or std::deque) and release its allocated memory.
Definition: vector.h:56