Bitcoin Core 31.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.
1444 if (contents[msg_type_len] < ' ' || contents[msg_type_len] > 0x7F) {
1445 return {};
1446 }
1447 ++msg_type_len;
1448 }
1449 std::string ret{reinterpret_cast<const char*>(contents.data()), msg_type_len};
1450 while (msg_type_len < CMessageHeader::MESSAGE_TYPE_SIZE) {
1451 // Verify that message type bytes after the first 0x00 are also 0x00.
1452 if (contents[msg_type_len] != 0) return {};
1453 ++msg_type_len;
1454 }
1455 // Strip message type bytes of contents.
1456 contents = contents.subspan(CMessageHeader::MESSAGE_TYPE_SIZE);
1457 return ret;
1458}
1459
1461{
1462 AssertLockNotHeld(m_recv_mutex);
1463 LOCK(m_recv_mutex);
1464 if (m_recv_state == RecvState::V1) return m_v1_fallback.GetReceivedMessage(time, reject_message);
1465
1466 Assume(m_recv_state == RecvState::APP_READY);
1467 std::span<const uint8_t> contents{m_recv_decode_buffer};
1468 auto msg_type = GetMessageType(contents);
1470 // Note that BIP324Cipher::EXPANSION also includes the length descriptor size.
1471 msg.m_raw_message_size = m_recv_decode_buffer.size() + BIP324Cipher::EXPANSION;
1472 if (msg_type) {
1473 reject_message = false;
1474 msg.m_type = std::move(*msg_type);
1475 msg.m_time = time;
1476 msg.m_message_size = contents.size();
1477 msg.m_recv.resize(contents.size());
1478 std::copy(contents.begin(), contents.end(), UCharCast(msg.m_recv.data()));
1479 } else {
1480 LogDebug(BCLog::NET, "V2 transport error: invalid message type (%u bytes contents), peer=%d\n", m_recv_decode_buffer.size(), m_nodeid);
1481 reject_message = true;
1482 }
1483 ClearShrink(m_recv_decode_buffer);
1484 SetReceiveState(RecvState::APP);
1485
1486 return msg;
1487}
1488
1490{
1491 AssertLockNotHeld(m_send_mutex);
1492 LOCK(m_send_mutex);
1493 if (m_send_state == SendState::V1) return m_v1_fallback.SetMessageToSend(msg);
1494 // We only allow adding a new message to be sent when in the READY state (so the packet cipher
1495 // is available) and the send buffer is empty. This limits the number of messages in the send
1496 // buffer to just one, and leaves the responsibility for queueing them up to the caller.
1497 if (!(m_send_state == SendState::READY && m_send_buffer.empty())) return false;
1498 // Construct contents (encoding message type + payload).
1499 std::vector<uint8_t> contents;
1500 auto short_message_id = V2_MESSAGE_MAP(msg.m_type);
1501 if (short_message_id) {
1502 contents.resize(1 + msg.data.size());
1503 contents[0] = *short_message_id;
1504 std::copy(msg.data.begin(), msg.data.end(), contents.begin() + 1);
1505 } else {
1506 // Initialize with zeroes, and then write the message type string starting at offset 1.
1507 // This means contents[0] and the unused positions in contents[1..13] remain 0x00.
1508 contents.resize(1 + CMessageHeader::MESSAGE_TYPE_SIZE + msg.data.size(), 0);
1509 std::copy(msg.m_type.begin(), msg.m_type.end(), contents.data() + 1);
1510 std::copy(msg.data.begin(), msg.data.end(), contents.begin() + 1 + CMessageHeader::MESSAGE_TYPE_SIZE);
1511 }
1512 // Construct ciphertext in send buffer.
1513 m_send_buffer.resize(contents.size() + BIP324Cipher::EXPANSION);
1514 m_cipher.Encrypt(MakeByteSpan(contents), {}, false, MakeWritableByteSpan(m_send_buffer));
1515 m_send_type = msg.m_type;
1516 // Release memory
1517 ClearShrink(msg.data);
1518 return true;
1519}
1520
1521Transport::BytesToSend V2Transport::GetBytesToSend(bool have_next_message) const noexcept
1522{
1523 AssertLockNotHeld(m_send_mutex);
1524 LOCK(m_send_mutex);
1525 if (m_send_state == SendState::V1) return m_v1_fallback.GetBytesToSend(have_next_message);
1526
1527 if (m_send_state == SendState::MAYBE_V1) Assume(m_send_buffer.empty());
1528 Assume(m_send_pos <= m_send_buffer.size());
1529 return {
1530 std::span{m_send_buffer}.subspan(m_send_pos),
1531 // We only have more to send after the current m_send_buffer if there is a (next)
1532 // message to be sent, and we're capable of sending packets. */
1533 have_next_message && m_send_state == SendState::READY,
1534 m_send_type
1535 };
1536}
1537
1538void V2Transport::MarkBytesSent(size_t bytes_sent) noexcept
1539{
1540 AssertLockNotHeld(m_send_mutex);
1541 LOCK(m_send_mutex);
1542 if (m_send_state == SendState::V1) return m_v1_fallback.MarkBytesSent(bytes_sent);
1543
1544 if (m_send_state == SendState::AWAITING_KEY && m_send_pos == 0 && bytes_sent > 0) {
1545 LogDebug(BCLog::NET, "start sending v2 handshake to peer=%d\n", m_nodeid);
1546 }
1547
1548 m_send_pos += bytes_sent;
1549 Assume(m_send_pos <= m_send_buffer.size());
1550 if (m_send_pos >= CMessageHeader::HEADER_SIZE) {
1551 m_sent_v1_header_worth = true;
1552 }
1553 // Wipe the buffer when everything is sent.
1554 if (m_send_pos == m_send_buffer.size()) {
1555 m_send_pos = 0;
1556 ClearShrink(m_send_buffer);
1557 }
1558}
1559
1561{
1562 AssertLockNotHeld(m_send_mutex);
1563 AssertLockNotHeld(m_recv_mutex);
1564 // Only outgoing connections need reconnection.
1565 if (!m_initiating) return false;
1566
1567 LOCK(m_recv_mutex);
1568 // We only reconnect in the very first state and when the receive buffer is empty. Together
1569 // these conditions imply nothing has been received so far.
1570 if (m_recv_state != RecvState::KEY) return false;
1571 if (!m_recv_buffer.empty()) return false;
1572 // Check if we've sent enough for the other side to disconnect us (if it was V1).
1573 LOCK(m_send_mutex);
1574 return m_sent_v1_header_worth;
1575}
1576
1577size_t V2Transport::GetSendMemoryUsage() const noexcept
1578{
1579 AssertLockNotHeld(m_send_mutex);
1580 LOCK(m_send_mutex);
1581 if (m_send_state == SendState::V1) return m_v1_fallback.GetSendMemoryUsage();
1582
1583 return sizeof(m_send_buffer) + memusage::DynamicUsage(m_send_buffer);
1584}
1585
1587{
1588 AssertLockNotHeld(m_recv_mutex);
1589 LOCK(m_recv_mutex);
1590 if (m_recv_state == RecvState::V1) return m_v1_fallback.GetInfo();
1591
1592 Transport::Info info;
1593
1594 // Do not report v2 and session ID until the version packet has been received
1595 // and verified (confirming that the other side very likely has the same keys as us).
1596 if (m_recv_state != RecvState::KEY_MAYBE_V1 && m_recv_state != RecvState::KEY &&
1597 m_recv_state != RecvState::GARB_GARBTERM && m_recv_state != RecvState::VERSION) {
1600 } else {
1602 }
1603
1604 return info;
1605}
1606
1607std::pair<size_t, bool> CConnman::SocketSendData(CNode& node) const
1608{
1609 auto it = node.vSendMsg.begin();
1610 size_t nSentSize = 0;
1611 bool data_left{false};
1612 std::optional<bool> expected_more;
1613
1614 while (true) {
1615 if (it != node.vSendMsg.end()) {
1616 // If possible, move one message from the send queue to the transport. This fails when
1617 // there is an existing message still being sent, or (for v2 transports) when the
1618 // handshake has not yet completed.
1619 size_t memusage = it->GetMemoryUsage();
1620 if (node.m_transport->SetMessageToSend(*it)) {
1621 // Update memory usage of send buffer (as *it will be deleted).
1622 node.m_send_memusage -= memusage;
1623 ++it;
1624 }
1625 }
1626 const auto& [data, more, msg_type] = node.m_transport->GetBytesToSend(it != node.vSendMsg.end());
1627 // We rely on the 'more' value returned by GetBytesToSend to correctly predict whether more
1628 // bytes are still to be sent, to correctly set the MSG_MORE flag. As a sanity check,
1629 // verify that the previously returned 'more' was correct.
1630 if (expected_more.has_value()) Assume(!data.empty() == *expected_more);
1631 expected_more = more;
1632 data_left = !data.empty(); // will be overwritten on next loop if all of data gets sent
1633 int nBytes = 0;
1634 if (!data.empty()) {
1635 LOCK(node.m_sock_mutex);
1636 // There is no socket in case we've already disconnected, or in test cases without
1637 // real connections. In these cases, we bail out immediately and just leave things
1638 // in the send queue and transport.
1639 if (!node.m_sock) {
1640 break;
1641 }
1643#ifdef MSG_MORE
1644 if (more) {
1645 flags |= MSG_MORE;
1646 }
1647#endif
1648 nBytes = node.m_sock->Send(data.data(), data.size(), flags);
1649 }
1650 if (nBytes > 0) {
1651 node.m_last_send = NodeClock::now();
1652 node.nSendBytes += nBytes;
1653 // Notify transport that bytes have been processed.
1654 node.m_transport->MarkBytesSent(nBytes);
1655 // Update statistics per message type.
1656 if (!msg_type.empty()) { // don't report v2 handshake bytes for now
1657 node.AccountForSentBytes(msg_type, nBytes);
1658 }
1659 nSentSize += nBytes;
1660 if ((size_t)nBytes != data.size()) {
1661 // could not send full message; stop sending more
1662 break;
1663 }
1664 } else {
1665 if (nBytes < 0) {
1666 // error
1667 int nErr = WSAGetLastError();
1668 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) {
1669 LogDebug(BCLog::NET, "socket send error, %s: %s", node.DisconnectMsg(), NetworkErrorString(nErr));
1670 node.CloseSocketDisconnect();
1671 }
1672 }
1673 break;
1674 }
1675 }
1676
1677 node.fPauseSend = node.m_send_memusage + node.m_transport->GetSendMemoryUsage() > nSendBufferMaxSize;
1678
1679 if (it == node.vSendMsg.end()) {
1680 assert(node.m_send_memusage == 0);
1681 }
1682 node.vSendMsg.erase(node.vSendMsg.begin(), it);
1683 return {nSentSize, data_left};
1684}
1685
1694bool CConnman::AttemptToEvictConnection(bool evict_tx_relay_peer_only, std::optional<NodeId> protect_peer)
1695{
1697
1698 std::vector<NodeEvictionCandidate> vEvictionCandidates;
1699 {
1700
1702 for (const CNode* node : m_nodes) {
1703 if (node->fDisconnect)
1704 continue;
1705 if (protect_peer.has_value() && node->GetId() == protect_peer) {
1706 continue;
1707 }
1708 if (evict_tx_relay_peer_only && !node->m_relays_txs) {
1709 continue;
1710 }
1711 NodeEvictionCandidate candidate{
1712 .id = node->GetId(),
1713 .m_connected = node->m_connected,
1714 .m_min_ping_time = node->m_min_ping_time,
1715 .m_last_block_time = node->m_last_block_time,
1716 .m_last_tx_time = node->m_last_tx_time,
1717 .fRelevantServices = node->m_has_all_wanted_services,
1718 .m_relay_txs = node->m_relays_txs.load(),
1719 .fBloomFilter = node->m_bloom_filter_loaded.load(),
1720 .nKeyedNetGroup = node->nKeyedNetGroup,
1721 .prefer_evict = node->m_prefer_evict,
1722 .m_is_local = node->addr.IsLocal(),
1723 .m_network = node->ConnectedThroughNetwork(),
1724 .m_noban = node->HasPermission(NetPermissionFlags::NoBan),
1725 .m_conn_type = node->m_conn_type,
1726 };
1727 vEvictionCandidates.push_back(candidate);
1728 }
1729 }
1730 const std::optional<NodeId> node_id_to_evict = SelectNodeToEvict(std::move(vEvictionCandidates));
1731 if (!node_id_to_evict) {
1732 return false;
1733 }
1735 for (CNode* pnode : m_nodes) {
1736 if (pnode->GetId() == *node_id_to_evict) {
1737 LogDebug(BCLog::NET, "selected %s connection for eviction, %s", pnode->ConnectionTypeAsString(), pnode->DisconnectMsg());
1738 TRACEPOINT(net, evicted_inbound_connection,
1739 pnode->GetId(),
1740 pnode->m_addr_name.c_str(),
1741 pnode->ConnectionTypeAsString().c_str(),
1742 pnode->ConnectedThroughNetwork(),
1743 TicksSinceEpoch<std::chrono::seconds>(pnode->m_connected));
1744 pnode->fDisconnect = true;
1745 return true;
1746 }
1747 }
1748 return false;
1749}
1750
1751void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
1753
1754 struct sockaddr_storage sockaddr;
1755 socklen_t len = sizeof(sockaddr);
1756 auto sock = hListenSocket.sock->Accept((struct sockaddr*)&sockaddr, &len);
1757
1758 if (!sock) {
1759 const int nErr = WSAGetLastError();
1760 if (nErr != WSAEWOULDBLOCK) {
1761 LogInfo("socket error accept failed: %s\n", NetworkErrorString(nErr));
1762 }
1763 return;
1764 }
1765
1766 CService addr;
1767 if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr, len)) {
1768 LogWarning("Unknown socket family\n");
1769 } else {
1770 addr = MaybeFlipIPv6toCJDNS(addr);
1771 }
1772
1773 const CService addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(*sock))};
1774
1776 hListenSocket.AddSocketPermissionFlags(permission_flags);
1777
1778 CreateNodeFromAcceptedSocket(std::move(sock), permission_flags, addr_bind, addr);
1779}
1780
1781void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
1782 NetPermissionFlags permission_flags,
1783 const CService& addr_bind,
1784 const CService& addr)
1785{
1787
1788 int nInbound = 0;
1789
1790 const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
1791
1792 // Tor inbound connections do not reveal the peer's actual network address.
1793 // Therefore do not apply address-based whitelist permissions to them.
1794 AddWhitelistPermissionFlags(permission_flags, inbound_onion ? std::optional<CNetAddr>{} : addr, vWhitelistedRangeIncoming);
1795
1796 {
1798 for (const CNode* pnode : m_nodes) {
1799 if (pnode->IsInboundConn()) nInbound++;
1800 }
1801 }
1802
1803 if (!fNetworkActive) {
1804 LogDebug(BCLog::NET, "connection from %s dropped: not accepting new connections\n", addr.ToStringAddrPort());
1805 return;
1806 }
1807
1808 if (!sock->IsSelectable()) {
1809 LogInfo("connection from %s dropped: non-selectable socket\n", addr.ToStringAddrPort());
1810 return;
1811 }
1812
1813 // According to the internet TCP_NODELAY is not carried into accepted sockets
1814 // on all platforms. Set it again here just to be sure.
1815 const int on{1};
1816 if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
1817 LogDebug(BCLog::NET, "connection from %s: unable to set TCP_NODELAY, continuing anyway\n",
1818 addr.ToStringAddrPort());
1819 }
1820
1821 // Don't accept connections from banned peers.
1822 bool banned = m_banman && m_banman->IsBanned(addr);
1823 if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && banned)
1824 {
1825 LogDebug(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToStringAddrPort());
1826 return;
1827 }
1828
1829 // Only accept connections from discouraged peers if our inbound slots aren't (almost) full.
1830 bool discouraged = m_banman && m_banman->IsDiscouraged(addr);
1831 if (!NetPermissions::HasFlag(permission_flags, NetPermissionFlags::NoBan) && nInbound + 1 >= m_max_inbound && discouraged)
1832 {
1833 LogDebug(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToStringAddrPort());
1834 return;
1835 }
1836
1837 if (nInbound >= m_max_inbound)
1838 {
1839 if (!AttemptToEvictConnection(/*evict_tx_relay_peer_only=*/false)) {
1840 // No connection to evict, disconnect the new connection
1841 LogDebug(BCLog::NET, "failed to find an eviction candidate - connection dropped (full)\n");
1842 return;
1843 }
1844 }
1845
1846 NodeId id = GetNewNodeId();
1848
1849 // The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
1850 // detected, so use it whenever we signal NODE_P2P_V2.
1851 ServiceFlags local_services = GetLocalServices();
1852 const bool use_v2transport(local_services & NODE_P2P_V2);
1853
1855 .Write(inbound_onion ? NET_ONION : addr.GetNetClass())
1856 .Write(addr_bind.GetAddrBytes())
1857 .Write(addr_bind.GetPort()) // inbound connections use bind port
1858 .Finalize();
1859 CNode* pnode = new CNode(id,
1860 std::move(sock),
1861 CAddress{addr, NODE_NONE},
1863 nonce,
1864 addr_bind,
1865 /*addrNameIn=*/"",
1867 inbound_onion,
1868 network_id,
1870 .permission_flags = permission_flags,
1871 .prefer_evict = discouraged,
1872 .recv_flood_size = nReceiveFloodSize,
1873 .use_v2transport = use_v2transport,
1874 });
1875 pnode->AddRef();
1876 m_msgproc->InitializeNode(*pnode, local_services);
1877 {
1879 m_nodes.push_back(pnode);
1880 }
1881 LogDebug(BCLog::NET, "connection from %s accepted\n", addr.ToStringAddrPort());
1882 TRACEPOINT(net, inbound_connection,
1883 pnode->GetId(),
1884 pnode->m_addr_name.c_str(),
1885 pnode->ConnectionTypeAsString().c_str(),
1886 pnode->ConnectedThroughNetwork(),
1888
1889 // We received a new connection, harvest entropy from the time (and our peer count)
1890 RandAddEvent((uint32_t)id);
1891}
1892
1893bool CConnman::AddConnection(const std::string& address, ConnectionType conn_type, bool use_v2transport = false)
1894{
1897 std::optional<int> max_connections;
1898 switch (conn_type) {
1902 return false;
1904 max_connections = m_max_outbound_full_relay;
1905 break;
1907 max_connections = m_max_outbound_block_relay;
1908 break;
1909 // no limit for ADDR_FETCH because -seednode has no limit either
1911 break;
1912 // no limit for FEELER connections since they're short-lived
1914 break;
1915 } // no default case, so the compiler can warn about missing cases
1916
1917 // Count existing connections
1918 int existing_connections = WITH_LOCK(m_nodes_mutex,
1919 return std::count_if(m_nodes.begin(), m_nodes.end(), [conn_type](CNode* node) { return node->m_conn_type == conn_type; }););
1920
1921 // Max connections of specified type already exist
1922 if (max_connections != std::nullopt && existing_connections >= max_connections) return false;
1923
1924 // Max total outbound connections already exist
1926 if (!grant) return false;
1927
1928 OpenNetworkConnection(/*addrConnect=*/CAddress{},
1929 /*fCountFailure=*/false,
1930 /*grant_outbound=*/std::move(grant),
1931 /*pszDest=*/address.c_str(),
1932 /*conn_type=*/conn_type,
1933 /*use_v2transport=*/use_v2transport,
1934 /*proxy_override=*/std::nullopt);
1935 return true;
1936}
1937
1939{
1942
1943 // Use a temporary variable to accumulate desired reconnections, so we don't need
1944 // m_reconnections_mutex while holding m_nodes_mutex.
1945 decltype(m_reconnections) reconnections_to_add;
1946
1947 {
1949
1950 const bool network_active{fNetworkActive};
1951 if (!network_active) {
1952 // Disconnect any connected nodes
1953 for (CNode* pnode : m_nodes) {
1954 if (!pnode->fDisconnect) {
1955 LogDebug(BCLog::NET, "Network not active, %s", pnode->DisconnectMsg());
1956 pnode->fDisconnect = true;
1957 }
1958 }
1959 }
1960
1961 // Disconnect unused nodes
1962 std::vector<CNode*> nodes_copy = m_nodes;
1963 for (CNode* pnode : nodes_copy)
1964 {
1965 if (pnode->fDisconnect)
1966 {
1967 // remove from m_nodes
1968 m_nodes.erase(remove(m_nodes.begin(), m_nodes.end(), pnode), m_nodes.end());
1969
1970 // Add to reconnection list if appropriate. We don't reconnect right here, because
1971 // the creation of a connection is a blocking operation (up to several seconds),
1972 // and we don't want to hold up the socket handler thread for that long.
1973 if (network_active && pnode->m_transport->ShouldReconnectV1()) {
1974 reconnections_to_add.push_back({
1975 .proxy_override = pnode->m_proxy_override,
1976 .addr_connect = pnode->addr,
1977 .grant = std::move(pnode->grantOutbound),
1978 .destination = pnode->m_dest,
1979 .conn_type = pnode->m_conn_type,
1980 .use_v2transport = false});
1981 LogDebug(BCLog::NET, "retrying with v1 transport protocol for peer=%d\n", pnode->GetId());
1982 }
1983
1984 // release outbound grant (if any)
1985 pnode->grantOutbound.Release();
1986
1987 // close socket and cleanup
1988 pnode->CloseSocketDisconnect();
1989
1990 // update connection count by network
1991 if (pnode->IsManualOrFullOutboundConn()) --m_network_conn_counts[pnode->addr.GetNetwork()];
1992
1993 // hold in disconnected pool until all refs are released
1994 pnode->Release();
1995 m_nodes_disconnected.push_back(pnode);
1996 }
1997 }
1998 }
1999 {
2000 // Delete disconnected nodes
2001 std::list<CNode*> nodes_disconnected_copy = m_nodes_disconnected;
2002 for (CNode* pnode : nodes_disconnected_copy)
2003 {
2004 // Destroy the object only after other threads have stopped using it.
2005 if (pnode->GetRefCount() <= 0) {
2006 m_nodes_disconnected.remove(pnode);
2007 DeleteNode(pnode);
2008 }
2009 }
2010 }
2011 {
2012 // Move entries from reconnections_to_add to m_reconnections.
2014 m_reconnections.splice(m_reconnections.end(), std::move(reconnections_to_add));
2015 }
2016}
2017
2019{
2021
2022 size_t nodes_size;
2023 {
2025 nodes_size = m_nodes.size();
2026 }
2027 if(nodes_size != nPrevNodeCount) {
2028 nPrevNodeCount = nodes_size;
2029 if (m_client_interface) {
2030 m_client_interface->NotifyNumConnectionsChanged(nodes_size);
2031 }
2032 }
2033}
2034
2036{
2037 return node.m_connected + m_peer_connect_timeout < now;
2038}
2039
2041{
2042 // Tests that see disconnects after using mocktime can start nodes with a
2043 // large timeout. For example, -peertimeout=999999999.
2044 const auto last_send{node.m_last_send.load()};
2045 const auto last_recv{node.m_last_recv.load()};
2046
2047 if (!ShouldRunInactivityChecks(node, now)) return false;
2048
2049 bool has_received{last_recv > NodeClock::epoch};
2050 bool has_sent{last_send > NodeClock::epoch};
2051
2052 if (!has_received || !has_sent) {
2053 std::string has_never;
2054 if (!has_received) has_never += ", never received from peer";
2055 if (!has_sent) has_never += ", never sent to peer";
2057 "socket no message in first %i seconds%s, %s",
2059 has_never,
2060 node.DisconnectMsg()
2061 );
2062 return true;
2063 }
2064
2065 if (now > last_send + TIMEOUT_INTERVAL) {
2067 "socket sending timeout: %is, %s", Ticks<std::chrono::seconds>(now - last_send),
2068 node.DisconnectMsg()
2069 );
2070 return true;
2071 }
2072
2073 if (now > last_recv + TIMEOUT_INTERVAL) {
2075 "socket receive timeout: %is, %s", Ticks<std::chrono::seconds>(now - last_recv),
2076 node.DisconnectMsg()
2077 );
2078 return true;
2079 }
2080
2081 if (!node.fSuccessfullyConnected) {
2082 if (node.m_transport->GetInfo().transport_type == TransportProtocolType::DETECTING) {
2083 LogDebug(BCLog::NET, "V2 handshake timeout, %s", node.DisconnectMsg());
2084 } else {
2085 LogDebug(BCLog::NET, "version handshake timeout, %s", node.DisconnectMsg());
2086 }
2087 return true;
2088 }
2089
2090 return false;
2091}
2092
2094{
2095 Sock::EventsPerSock events_per_sock;
2096
2097 for (const ListenSocket& hListenSocket : vhListenSocket) {
2098 events_per_sock.emplace(hListenSocket.sock, Sock::Events{Sock::RecvEvent});
2099 }
2100
2101 for (CNode* pnode : nodes) {
2102 bool select_recv = !pnode->fPauseRecv;
2103 bool select_send;
2104 {
2105 LOCK(pnode->cs_vSend);
2106 // Sending is possible if either there are bytes to send right now, or if there will be
2107 // once a potential message from vSendMsg is handed to the transport. GetBytesToSend
2108 // determines both of these in a single call.
2109 const auto& [to_send, more, _msg_type] = pnode->m_transport->GetBytesToSend(!pnode->vSendMsg.empty());
2110 select_send = !to_send.empty() || more;
2111 }
2112 if (!select_recv && !select_send) continue;
2113
2114 LOCK(pnode->m_sock_mutex);
2115 if (pnode->m_sock) {
2116 Sock::Event event = (select_send ? Sock::SendEvent : 0) | (select_recv ? Sock::RecvEvent : 0);
2117 events_per_sock.emplace(pnode->m_sock, Sock::Events{event});
2118 }
2119 }
2120
2121 return events_per_sock;
2122}
2123
2125{
2128
2129 Sock::EventsPerSock events_per_sock;
2130
2131 {
2132 const NodesSnapshot snap{*this, /*shuffle=*/false};
2133
2134 const auto timeout = std::chrono::milliseconds(SELECT_TIMEOUT_MILLISECONDS);
2135
2136 // Check for the readiness of the already connected sockets and the
2137 // listening sockets in one call ("readiness" as in poll(2) or
2138 // select(2)). If none are ready, wait for a short while and return
2139 // empty sets.
2140 events_per_sock = GenerateWaitSockets(snap.Nodes());
2141 if (events_per_sock.empty() || !events_per_sock.begin()->first->WaitMany(timeout, events_per_sock)) {
2142 m_interrupt_net->sleep_for(timeout);
2143 }
2144
2145 // Service (send/receive) each of the already connected nodes.
2146 SocketHandlerConnected(snap.Nodes(), events_per_sock);
2147 }
2148
2149 // Accept new connections from listening sockets.
2150 SocketHandlerListening(events_per_sock);
2151}
2152
2153void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
2154 const Sock::EventsPerSock& events_per_sock)
2155{
2157
2158 const auto now{NodeClock::now()};
2159
2160 for (CNode* pnode : nodes) {
2161 if (m_interrupt_net->interrupted()) {
2162 return;
2163 }
2164
2165 //
2166 // Receive
2167 //
2168 bool recvSet = false;
2169 bool sendSet = false;
2170 bool errorSet = false;
2171 {
2172 LOCK(pnode->m_sock_mutex);
2173 if (!pnode->m_sock) {
2174 continue;
2175 }
2176 const auto it = events_per_sock.find(pnode->m_sock);
2177 if (it != events_per_sock.end()) {
2178 recvSet = it->second.occurred & Sock::RecvEvent;
2179 sendSet = it->second.occurred & Sock::SendEvent;
2180 errorSet = it->second.occurred & Sock::ErrorEvent;
2181 }
2182 }
2183
2184 if (sendSet) {
2185 // Send data
2186 auto [bytes_sent, data_left] = WITH_LOCK(pnode->cs_vSend, return SocketSendData(*pnode));
2187 if (bytes_sent) {
2188 RecordBytesSent(bytes_sent);
2189
2190 // If both receiving and (non-optimistic) sending were possible, we first attempt
2191 // sending. If that succeeds, but does not fully drain the send queue, do not
2192 // attempt to receive. This avoids needlessly queueing data if the remote peer
2193 // is slow at receiving data, by means of TCP flow control. We only do this when
2194 // sending actually succeeded to make sure progress is always made; otherwise a
2195 // deadlock would be possible when both sides have data to send, but neither is
2196 // receiving.
2197 if (data_left) recvSet = false;
2198 }
2199 }
2200
2201 if (recvSet || errorSet)
2202 {
2203 // typical socket buffer is 8K-64K
2204 uint8_t pchBuf[0x10000];
2205 int nBytes = 0;
2206 {
2207 LOCK(pnode->m_sock_mutex);
2208 if (!pnode->m_sock) {
2209 continue;
2210 }
2211 nBytes = pnode->m_sock->Recv(pchBuf, sizeof(pchBuf), MSG_DONTWAIT);
2212 }
2213 if (nBytes > 0)
2214 {
2215 bool notify = false;
2216 if (!pnode->ReceiveMsgBytes({pchBuf, (size_t)nBytes}, notify)) {
2218 "receiving message bytes failed, %s",
2219 pnode->DisconnectMsg()
2220 );
2221 pnode->CloseSocketDisconnect();
2222 }
2223 RecordBytesRecv(nBytes);
2224 if (notify) {
2225 pnode->MarkReceivedMsgsForProcessing();
2227 }
2228 }
2229 else if (nBytes == 0)
2230 {
2231 // socket closed gracefully
2232 if (!pnode->fDisconnect) {
2233 LogDebug(BCLog::NET, "socket closed, %s", pnode->DisconnectMsg());
2234 }
2235 pnode->CloseSocketDisconnect();
2236 }
2237 else if (nBytes < 0)
2238 {
2239 // error
2240 int nErr = WSAGetLastError();
2241 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
2242 {
2243 if (!pnode->fDisconnect) {
2244 LogDebug(BCLog::NET, "socket recv error, %s: %s", pnode->DisconnectMsg(), NetworkErrorString(nErr));
2245 }
2246 pnode->CloseSocketDisconnect();
2247 }
2248 }
2249 }
2250
2251 if (InactivityCheck(*pnode, now)) pnode->fDisconnect = true;
2252 }
2253}
2254
2256{
2258
2259 for (const ListenSocket& listen_socket : vhListenSocket) {
2260 if (m_interrupt_net->interrupted()) {
2261 return;
2262 }
2263 const auto it = events_per_sock.find(listen_socket.sock);
2264 if (it != events_per_sock.end() && it->second.occurred & Sock::RecvEvent) {
2265 AcceptConnection(listen_socket);
2266 }
2267 }
2268}
2269
2271{
2273
2274 while (!m_interrupt_net->interrupted()) {
2277 SocketHandler();
2278 }
2279}
2280
2282{
2283 {
2285 fMsgProcWake = true;
2286 }
2287 condMsgProc.notify_one();
2288}
2289
2291{
2292 int outbound_connection_count = 0;
2293
2294 if (!gArgs.GetArgs("-seednode").empty()) {
2295 auto start = NodeClock::now();
2296 constexpr std::chrono::seconds SEEDNODE_TIMEOUT = 30s;
2297 LogInfo("-seednode enabled. Trying the provided seeds for %d seconds before defaulting to the dnsseeds.\n", SEEDNODE_TIMEOUT.count());
2298 while (!m_interrupt_net->interrupted()) {
2299 if (!m_interrupt_net->sleep_for(500ms)) {
2300 return;
2301 }
2302
2303 // Abort if we have spent enough time without reaching our target.
2304 // Giving seed nodes 30 seconds so this does not become a race against fixedseeds (which triggers after 1 min)
2305 if (NodeClock::now() > start + SEEDNODE_TIMEOUT) {
2306 LogInfo("Couldn't connect to enough peers via seed nodes. Handing fetch logic to the DNS seeds.\n");
2307 break;
2308 }
2309
2310 outbound_connection_count = GetFullOutboundConnCount();
2311 if (outbound_connection_count >= SEED_OUTBOUND_CONNECTION_THRESHOLD) {
2312 LogInfo("P2P peers available. Finished fetching data from seed nodes.\n");
2313 break;
2314 }
2315 }
2316 }
2317
2319 std::vector<std::string> seeds = m_params.DNSSeeds();
2320 std::shuffle(seeds.begin(), seeds.end(), rng);
2321 int seeds_right_now = 0; // Number of seeds left before testing if we have enough connections
2322
2323 if (gArgs.GetBoolArg("-forcednsseed", DEFAULT_FORCEDNSSEED)) {
2324 // When -forcednsseed is provided, query all.
2325 seeds_right_now = seeds.size();
2326 } else if (addrman.get().Size() == 0) {
2327 // If we have no known peers, query all.
2328 // This will occur on the first run, or if peers.dat has been
2329 // deleted.
2330 seeds_right_now = seeds.size();
2331 }
2332
2333 // Proceed with dnsseeds if seednodes hasn't reached the target or if forcednsseed is set
2334 if (outbound_connection_count < SEED_OUTBOUND_CONNECTION_THRESHOLD || seeds_right_now) {
2335 // goal: only query DNS seed if address need is acute
2336 // * If we have a reasonable number of peers in addrman, spend
2337 // some time trying them first. This improves user privacy by
2338 // creating fewer identifying DNS requests, reduces trust by
2339 // giving seeds less influence on the network topology, and
2340 // reduces traffic to the seeds.
2341 // * When querying DNS seeds query a few at once, this ensures
2342 // that we don't give DNS seeds the ability to eclipse nodes
2343 // that query them.
2344 // * If we continue having problems, eventually query all the
2345 // DNS seeds, and if that fails too, also try the fixed seeds.
2346 // (done in ThreadOpenConnections)
2347 int found = 0;
2348 const std::chrono::seconds seeds_wait_time = (addrman.get().Size() >= DNSSEEDS_DELAY_PEER_THRESHOLD ? DNSSEEDS_DELAY_MANY_PEERS : DNSSEEDS_DELAY_FEW_PEERS);
2349
2350 for (const std::string& seed : seeds) {
2351 if (seeds_right_now == 0) {
2352 seeds_right_now += DNSSEEDS_TO_QUERY_AT_ONCE;
2353
2354 if (addrman.get().Size() > 0) {
2355 LogInfo("Waiting %d seconds before querying DNS seeds.\n", seeds_wait_time.count());
2356 std::chrono::seconds to_wait = seeds_wait_time;
2357 while (to_wait.count() > 0) {
2358 // if sleeping for the MANY_PEERS interval, wake up
2359 // early to see if we have enough peers and can stop
2360 // this thread entirely freeing up its resources
2361 std::chrono::seconds w = std::min(DNSSEEDS_DELAY_FEW_PEERS, to_wait);
2362 if (!m_interrupt_net->sleep_for(w)) return;
2363 to_wait -= w;
2364
2366 if (found > 0) {
2367 LogInfo("%d addresses found from DNS seeds\n", found);
2368 LogInfo("P2P peers available. Finished DNS seeding.\n");
2369 } else {
2370 LogInfo("P2P peers available. Skipped DNS seeding.\n");
2371 }
2372 return;
2373 }
2374 }
2375 }
2376 }
2377
2378 if (m_interrupt_net->interrupted()) return;
2379
2380 // hold off on querying seeds if P2P network deactivated
2381 if (!fNetworkActive) {
2382 LogInfo("Waiting for network to be reactivated before querying DNS seeds.\n");
2383 do {
2384 if (!m_interrupt_net->sleep_for(1s)) return;
2385 } while (!fNetworkActive);
2386 }
2387
2388 LogInfo("Loading addresses from DNS seed %s\n", seed);
2389 // If -proxy is in use, we make an ADDR_FETCH connection to the DNS resolved peer address
2390 // for the base dns seed domain in chainparams
2391 if (HaveNameProxy()) {
2392 AddAddrFetch(seed);
2393 } else {
2394 std::vector<CAddress> vAdd;
2395 constexpr ServiceFlags requiredServiceBits{SeedsServiceFlags()};
2396 std::string host = strprintf("x%x.%s", requiredServiceBits, seed);
2397 CNetAddr resolveSource;
2398 if (!resolveSource.SetInternal(host)) {
2399 continue;
2400 }
2401 // Limit number of IPs learned from a single DNS seed. This limit exists to prevent the results from
2402 // one DNS seed from dominating AddrMan. Note that the number of results from a UDP DNS query is
2403 // bounded to 33 already, but it is possible for it to use TCP where a larger number of results can be
2404 // returned.
2405 unsigned int nMaxIPs = 32;
2406 const auto addresses{LookupHost(host, nMaxIPs, true)};
2407 if (!addresses.empty()) {
2408 for (const CNetAddr& ip : addresses) {
2410 addr.nTime = rng.rand_uniform_delay(Now<NodeSeconds>() - 3 * 24h, -4 * 24h); // use a random age between 3 and 7 days old
2411 vAdd.push_back(addr);
2412 found++;
2413 }
2414 addrman.get().Add(vAdd, resolveSource);
2415 } else {
2416 // If the seed does not support a subdomain with our desired service bits,
2417 // we make an ADDR_FETCH connection to the DNS resolved peer address for the
2418 // base dns seed domain in chainparams
2419 AddAddrFetch(seed);
2420 }
2421 }
2422 --seeds_right_now;
2423 }
2424 LogInfo("%d addresses found from DNS seeds\n", found);
2425 } else {
2426 LogInfo("Skipping DNS seeds. Enough peers have been found\n");
2427 }
2428}
2429
2431{
2432 const auto start{SteadyClock::now()};
2433
2435
2436 LogDebug(BCLog::NET, "Flushed %d addresses to peers.dat %dms",
2437 addrman.get().Size(), Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
2438}
2439
2441{
2444 std::string strDest;
2445 {
2447 if (m_addr_fetches.empty())
2448 return;
2449 strDest = m_addr_fetches.front();
2450 m_addr_fetches.pop_front();
2451 }
2452 // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
2453 // peer doesn't support it or immediately disconnects us for another reason.
2455 CAddress addr;
2456 CountingSemaphoreGrant<> grant(*semOutbound, /*fTry=*/true);
2457 if (grant) {
2458 OpenNetworkConnection(/*addrConnect=*/addr,
2459 /*fCountFailure=*/false,
2460 /*grant_outbound=*/std::move(grant),
2461 /*pszDest=*/strDest.c_str(),
2462 /*conn_type=*/ConnectionType::ADDR_FETCH,
2463 /*use_v2transport=*/use_v2transport,
2464 /*proxy_override=*/std::nullopt);
2465 }
2466}
2467
2469{
2471}
2472
2474{
2476 LogDebug(BCLog::NET, "setting try another outbound peer=%s\n", flag ? "true" : "false");
2477}
2478
2480{
2481 LogDebug(BCLog::NET, "enabling extra block-relay-only peers\n");
2483}
2484
2485// Return the number of outbound connections that are full relay (not blocks only)
2487{
2489
2490 int nRelevant = 0;
2491 {
2493 for (const CNode* pnode : m_nodes) {
2494 if (pnode->fSuccessfullyConnected && pnode->IsFullOutboundConn()) ++nRelevant;
2495 }
2496 }
2497 return nRelevant;
2498}
2499
2500// Return the number of peers we have over our outbound connection limit
2501// Exclude peers that are marked for disconnect, or are going to be
2502// disconnected soon (eg ADDR_FETCH and FEELER)
2503// Also exclude peers that haven't finished initial connection handshake yet
2504// (so that we don't decide we're over our desired connection limit, and then
2505// evict some peer that has finished the handshake)
2507{
2509
2510 int full_outbound_peers = 0;
2511 {
2513 for (const CNode* pnode : m_nodes) {
2514 if (pnode->fSuccessfullyConnected && !pnode->fDisconnect && pnode->IsFullOutboundConn()) {
2515 ++full_outbound_peers;
2516 }
2517 }
2518 }
2519 return std::max(full_outbound_peers - m_max_outbound_full_relay, 0);
2520}
2521
2523{
2525
2526 int block_relay_peers = 0;
2527 {
2529 for (const CNode* pnode : m_nodes) {
2530 if (pnode->fSuccessfullyConnected && !pnode->fDisconnect && pnode->IsBlockOnlyConn()) {
2531 ++block_relay_peers;
2532 }
2533 }
2534 }
2535 return std::max(block_relay_peers - m_max_outbound_block_relay, 0);
2536}
2537
2538bool CConnman::EvictTxPeerIfFull(std::optional<NodeId> protect_peer)
2539{
2540 int tx_inbound_peers{0};
2541 {
2543 for (const CNode* pnode : m_nodes) {
2544 if (!pnode->fDisconnect && pnode->IsInboundConn() && pnode->m_relays_txs) {
2545 ++tx_inbound_peers;
2546 }
2547 }
2548 }
2549 if (tx_inbound_peers > m_max_inbound_full_relay) {
2550 return AttemptToEvictConnection(/*evict_tx_relay_peer_only=*/true, protect_peer);
2551 }
2552 return true;
2553}
2554
2555std::unordered_set<Network> CConnman::GetReachableEmptyNetworks() const
2556{
2557 std::unordered_set<Network> networks{};
2558 for (int n = 0; n < NET_MAX; n++) {
2559 enum Network net = (enum Network)n;
2560 if (net == NET_UNROUTABLE || net == NET_INTERNAL) continue;
2561 if (g_reachable_nets.Contains(net) && addrman.get().Size(net, std::nullopt) == 0) {
2562 networks.insert(net);
2563 }
2564 }
2565 return networks;
2566}
2567
2569{
2571 return m_network_conn_counts[net] > 1;
2572}
2573
2574bool CConnman::MaybePickPreferredNetwork(std::optional<Network>& network)
2575{
2577
2578 std::array<Network, 5> nets{NET_IPV4, NET_IPV6, NET_ONION, NET_I2P, NET_CJDNS};
2579 std::shuffle(nets.begin(), nets.end(), FastRandomContext());
2580
2582 for (const auto net : nets) {
2583 if (g_reachable_nets.Contains(net) && m_network_conn_counts[net] == 0 && addrman.get().Size(net) != 0) {
2584 network = net;
2585 return true;
2586 }
2587 }
2588
2589 return false;
2590}
2591
2592void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, std::span<const std::string> seed_nodes)
2593{
2597
2599 // Connect to specific addresses
2600 if (!connect.empty())
2601 {
2602 // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
2603 // peer doesn't support it or immediately disconnects us for another reason.
2605 for (int64_t nLoop = 0;; nLoop++)
2606 {
2607 for (const std::string& strAddr : connect)
2608 {
2610 /*fCountFailure=*/false,
2611 /*grant_outbound=*/{},
2612 /*pszDest=*/strAddr.c_str(),
2613 /*conn_type=*/ConnectionType::MANUAL,
2614 /*use_v2transport=*/use_v2transport,
2615 /*proxy_override=*/std::nullopt);
2616 for (int i = 0; i < 10 && i < nLoop; i++)
2617 {
2618 if (!m_interrupt_net->sleep_for(500ms)) {
2619 return;
2620 }
2621 }
2622 }
2623 if (!m_interrupt_net->sleep_for(500ms)) {
2624 return;
2625 }
2627 }
2628 }
2629
2630 // Initiate network connections
2631 auto start = GetTime<std::chrono::microseconds>();
2632
2633 // Minimum time before next feeler connection (in microseconds).
2634 auto next_feeler = start + rng.rand_exp_duration(FEELER_INTERVAL);
2635 auto next_extra_block_relay = start + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
2636 auto next_extra_network_peer{start + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL)};
2637 const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
2638 bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
2639 const bool use_seednodes{!gArgs.GetArgs("-seednode").empty()};
2640
2641 auto seed_node_timer = NodeClock::now();
2642 bool add_addr_fetch{addrman.get().Size() == 0 && !seed_nodes.empty()};
2643 constexpr std::chrono::seconds ADD_NEXT_SEEDNODE = 10s;
2644
2645 if (!add_fixed_seeds) {
2646 LogInfo("Fixed seeds are disabled\n");
2647 }
2648
2649 while (!m_interrupt_net->interrupted()) {
2650 if (add_addr_fetch) {
2651 add_addr_fetch = false;
2652 const auto& seed{SpanPopBack(seed_nodes)};
2653 AddAddrFetch(seed);
2654
2655 if (addrman.get().Size() == 0) {
2656 LogInfo("Empty addrman, adding seednode (%s) to addrfetch\n", seed);
2657 } else {
2658 LogInfo("Couldn't connect to peers from addrman after %d seconds. Adding seednode (%s) to addrfetch\n", ADD_NEXT_SEEDNODE.count(), seed);
2659 }
2660 }
2661
2663
2664 if (!m_interrupt_net->sleep_for(500ms)) {
2665 return;
2666 }
2667
2669
2671 if (m_interrupt_net->interrupted()) {
2672 return;
2673 }
2674
2675 const std::unordered_set<Network> fixed_seed_networks{GetReachableEmptyNetworks()};
2676 if (add_fixed_seeds && !fixed_seed_networks.empty()) {
2677 // When the node starts with an empty peers.dat, there are a few other sources of peers before
2678 // we fallback on to fixed seeds: -dnsseed, -seednode, -addnode
2679 // If none of those are available, we fallback on to fixed seeds immediately, else we allow
2680 // 60 seconds for any of those sources to populate addrman.
2681 bool add_fixed_seeds_now = false;
2682 // It is cheapest to check if enough time has passed first.
2683 if (GetTime<std::chrono::seconds>() > start + std::chrono::minutes{1}) {
2684 add_fixed_seeds_now = true;
2685 LogInfo("Adding fixed seeds as 60 seconds have passed and addrman is empty for at least one reachable network\n");
2686 }
2687
2688 // Perform cheap checks before locking a mutex.
2689 else if (!dnsseed && !use_seednodes) {
2691 if (m_added_node_params.empty()) {
2692 add_fixed_seeds_now = true;
2693 LogInfo("Adding fixed seeds as -dnsseed=0 (or IPv4/IPv6 connections are disabled via -onlynet) and neither -addnode nor -seednode are provided\n");
2694 }
2695 }
2696
2697 if (add_fixed_seeds_now) {
2698 std::vector<CAddress> seed_addrs{ConvertSeeds(m_params.FixedSeeds())};
2699 // We will not make outgoing connections to peers that are unreachable
2700 // (e.g. because of -onlynet configuration).
2701 // Therefore, we do not add them to addrman in the first place.
2702 // In case previously unreachable networks become reachable
2703 // (e.g. in case of -onlynet changes by the user), fixed seeds will
2704 // be loaded only for networks for which we have no addresses.
2705 seed_addrs.erase(std::remove_if(seed_addrs.begin(), seed_addrs.end(),
2706 [&fixed_seed_networks](const CAddress& addr) { return !fixed_seed_networks.contains(addr.GetNetwork()); }),
2707 seed_addrs.end());
2708 CNetAddr local;
2709 local.SetInternal("fixedseeds");
2710 addrman.get().Add(seed_addrs, local);
2711 add_fixed_seeds = false;
2712 LogInfo("Added %d fixed seeds from reachable networks.\n", seed_addrs.size());
2713 }
2714 }
2715
2716 //
2717 // Choose an address to connect to based on most recently seen
2718 //
2719 CAddress addrConnect;
2720
2721 // Only connect out to one peer per ipv4/ipv6 network group (/16 for IPv4).
2722 int nOutboundFullRelay = 0;
2723 int nOutboundBlockRelay = 0;
2724 int outbound_privacy_network_peers = 0;
2725 std::set<std::vector<unsigned char>> outbound_ipv46_peer_netgroups;
2726
2727 {
2729 for (const CNode* pnode : m_nodes) {
2730 if (pnode->IsFullOutboundConn()) nOutboundFullRelay++;
2731 if (pnode->IsBlockOnlyConn()) nOutboundBlockRelay++;
2732
2733 // Make sure our persistent outbound slots to ipv4/ipv6 peers belong to different netgroups.
2734 switch (pnode->m_conn_type) {
2735 // We currently don't take inbound connections into account. Since they are
2736 // free to make, an attacker could make them to prevent us from connecting to
2737 // certain peers.
2739 // Short-lived outbound connections should not affect how we select outbound
2740 // peers from addrman.
2744 break;
2748 const CAddress address{pnode->addr};
2749 if (address.IsTor() || address.IsI2P() || address.IsCJDNS()) {
2750 // Since our addrman-groups for these networks are
2751 // random, without relation to the route we
2752 // take to connect to these peers or to the
2753 // difficulty in obtaining addresses with diverse
2754 // groups, we don't worry about diversity with
2755 // respect to our addrman groups when connecting to
2756 // these networks.
2757 ++outbound_privacy_network_peers;
2758 } else {
2759 outbound_ipv46_peer_netgroups.insert(m_netgroupman.GetGroup(address));
2760 }
2761 } // no default case, so the compiler can warn about missing cases
2762 }
2763 }
2764
2765 if (!seed_nodes.empty() && nOutboundFullRelay < SEED_OUTBOUND_CONNECTION_THRESHOLD) {
2766 if (NodeClock::now() > seed_node_timer + ADD_NEXT_SEEDNODE) {
2767 seed_node_timer = NodeClock::now();
2768 add_addr_fetch = true;
2769 }
2770 }
2771
2773 auto now = GetTime<std::chrono::microseconds>();
2774 bool anchor = false;
2775 bool fFeeler = false;
2776 std::optional<Network> preferred_net;
2777
2778 // Determine what type of connection to open. Opening
2779 // BLOCK_RELAY connections to addresses from anchors.dat gets the highest
2780 // priority. Then we open OUTBOUND_FULL_RELAY priority until we
2781 // meet our full-relay capacity. Then we open BLOCK_RELAY connection
2782 // until we hit our block-relay-only peer limit.
2783 // GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
2784 // try opening an additional OUTBOUND_FULL_RELAY connection. If none of
2785 // these conditions are met, check to see if it's time to try an extra
2786 // block-relay-only peer (to confirm our tip is current, see below) or the next_feeler
2787 // timer to decide if we should open a FEELER.
2788
2789 if (!m_anchors.empty() && (nOutboundBlockRelay < m_max_outbound_block_relay)) {
2790 conn_type = ConnectionType::BLOCK_RELAY;
2791 anchor = true;
2792 } else if (nOutboundFullRelay < m_max_outbound_full_relay) {
2793 // OUTBOUND_FULL_RELAY
2794 } else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
2795 conn_type = ConnectionType::BLOCK_RELAY;
2796 } else if (GetTryNewOutboundPeer()) {
2797 // OUTBOUND_FULL_RELAY
2798 } else if (now > next_extra_block_relay && m_start_extra_block_relay_peers) {
2799 // Periodically connect to a peer (using regular outbound selection
2800 // methodology from addrman) and stay connected long enough to sync
2801 // headers, but not much else.
2802 //
2803 // Then disconnect the peer, if we haven't learned anything new.
2804 //
2805 // The idea is to make eclipse attacks very difficult to pull off,
2806 // because every few minutes we're finding a new peer to learn headers
2807 // from.
2808 //
2809 // This is similar to the logic for trying extra outbound (full-relay)
2810 // peers, except:
2811 // - we do this all the time on an exponential timer, rather than just when
2812 // our tip is stale
2813 // - we potentially disconnect our next-youngest block-relay-only peer, if our
2814 // newest block-relay-only peer delivers a block more recently.
2815 // See the eviction logic in net_processing.cpp.
2816 //
2817 // Because we can promote these connections to block-relay-only
2818 // connections, they do not get their own ConnectionType enum
2819 // (similar to how we deal with extra outbound peers).
2820 next_extra_block_relay = now + rng.rand_exp_duration(EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
2821 conn_type = ConnectionType::BLOCK_RELAY;
2822 } else if (now > next_feeler) {
2823 next_feeler = now + rng.rand_exp_duration(FEELER_INTERVAL);
2824 conn_type = ConnectionType::FEELER;
2825 fFeeler = true;
2826 } else if (nOutboundFullRelay == m_max_outbound_full_relay &&
2828 now > next_extra_network_peer &&
2829 MaybePickPreferredNetwork(preferred_net)) {
2830 // Full outbound connection management: Attempt to get at least one
2831 // outbound peer from each reachable network by making extra connections
2832 // and then protecting "only" peers from a network during outbound eviction.
2833 // This is not attempted if the user changed -maxconnections to a value
2834 // so low that less than MAX_OUTBOUND_FULL_RELAY_CONNECTIONS are made,
2835 // to prevent interactions with otherwise protected outbound peers.
2836 next_extra_network_peer = now + rng.rand_exp_duration(EXTRA_NETWORK_PEER_INTERVAL);
2837 } else {
2838 // skip to next iteration of while loop
2839 continue;
2840 }
2841
2842 addrman.get().ResolveCollisions();
2843
2844 const auto current_time{NodeClock::now()};
2845 int nTries = 0;
2846 const auto reachable_nets{g_reachable_nets.All()};
2847
2848 while (!m_interrupt_net->interrupted()) {
2849 if (anchor && !m_anchors.empty()) {
2850 const CAddress addr = m_anchors.back();
2851 m_anchors.pop_back();
2852 if (!addr.IsValid() || IsLocal(addr) || !g_reachable_nets.Contains(addr) ||
2853 !m_msgproc->HasAllDesirableServiceFlags(addr.nServices) ||
2854 outbound_ipv46_peer_netgroups.contains(m_netgroupman.GetGroup(addr))) continue;
2855 addrConnect = addr;
2856 LogDebug(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
2857 break;
2858 }
2859
2860 // If we didn't find an appropriate destination after trying 100 addresses fetched from addrman,
2861 // stop this loop, and let the outer loop run again (which sleeps, adds seed nodes, recalculates
2862 // already-connected network ranges, ...) before trying new addrman addresses.
2863 nTries++;
2864 if (nTries > 100)
2865 break;
2866
2867 CAddress addr;
2868 NodeSeconds addr_last_try{0s};
2869
2870 if (fFeeler) {
2871 // First, try to get a tried table collision address. This returns
2872 // an empty (invalid) address if there are no collisions to try.
2873 std::tie(addr, addr_last_try) = addrman.get().SelectTriedCollision();
2874
2875 if (!addr.IsValid()) {
2876 // No tried table collisions. Select a new table address
2877 // for our feeler.
2878 std::tie(addr, addr_last_try) = addrman.get().Select(true, reachable_nets);
2879 } else if (AlreadyConnectedToAddress(addr)) {
2880 // If test-before-evict logic would have us connect to a
2881 // peer that we're already connected to, just mark that
2882 // address as Good(). We won't be able to initiate the
2883 // connection anyway, so this avoids inadvertently evicting
2884 // a currently-connected peer.
2885 addrman.get().Good(addr);
2886 // Select a new table address for our feeler instead.
2887 std::tie(addr, addr_last_try) = addrman.get().Select(true, reachable_nets);
2888 }
2889 } else {
2890 // Not a feeler
2891 // If preferred_net has a value set, pick an extra outbound
2892 // peer from that network. The eviction logic in net_processing
2893 // ensures that a peer from another network will be evicted.
2894 std::tie(addr, addr_last_try) = preferred_net.has_value()
2895 ? addrman.get().Select(false, {*preferred_net})
2896 : addrman.get().Select(false, reachable_nets);
2897 }
2898
2899 // Require outbound IPv4/IPv6 connections, other than feelers, to be to distinct network groups
2900 if (!fFeeler && outbound_ipv46_peer_netgroups.contains(m_netgroupman.GetGroup(addr))) {
2901 continue;
2902 }
2903
2904 // if we selected an invalid or local address, restart
2905 if (!addr.IsValid() || IsLocal(addr)) {
2906 break;
2907 }
2908
2909 if (!g_reachable_nets.Contains(addr)) {
2910 continue;
2911 }
2912
2913 // only consider very recently tried nodes after 30 failed attempts
2914 if (current_time - addr_last_try < 10min && nTries < 30) {
2915 continue;
2916 }
2917
2918 // for non-feelers, require all the services we'll want,
2919 // for feelers, only require they be a full node (only because most
2920 // SPV clients don't have a good address DB available)
2921 if (!fFeeler && !m_msgproc->HasAllDesirableServiceFlags(addr.nServices)) {
2922 continue;
2923 } else if (fFeeler && !MayHaveUsefulAddressDB(addr.nServices)) {
2924 continue;
2925 }
2926
2927 // Do not connect to bad ports, unless 50 invalid addresses have been selected already.
2928 if (nTries < 50 && (addr.IsIPv4() || addr.IsIPv6()) && IsBadPort(addr.GetPort())) {
2929 continue;
2930 }
2931
2932 // Do not make automatic outbound connections to addnode peers, to
2933 // not use our limited outbound slots for them and to ensure
2934 // addnode connections benefit from their intended protections.
2935 if (AddedNodesContain(addr)) {
2936 LogDebug(BCLog::NET, "Not making automatic %s%s connection to %s peer selected for manual (addnode) connection%s\n",
2937 preferred_net.has_value() ? "network-specific " : "",
2939 fLogIPs ? strprintf(": %s", addr.ToStringAddrPort()) : "");
2940 continue;
2941 }
2942
2943 addrConnect = addr;
2944 break;
2945 }
2946
2947 if (addrConnect.IsValid()) {
2948 if (fFeeler) {
2949 // Add small amount of random noise before connection to avoid synchronization.
2951 return;
2952 }
2953 LogDebug(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToStringAddrPort());
2954 }
2955
2956 if (preferred_net != std::nullopt) LogDebug(BCLog::NET, "Making network specific connection to %s on %s.\n", addrConnect.ToStringAddrPort(), GetNetworkName(preferred_net.value()));
2957
2958 // Record addrman failure attempts when node has at least 2 persistent outbound connections to peers with
2959 // different netgroups in ipv4/ipv6 networks + all peers in Tor/I2P/CJDNS networks.
2960 // Don't record addrman failure attempts when node is offline. This can be identified since all local
2961 // network connections (if any) belong in the same netgroup, and the size of `outbound_ipv46_peer_netgroups` would only be 1.
2962 const bool count_failures{((int)outbound_ipv46_peer_netgroups.size() + outbound_privacy_network_peers) >= std::min(m_max_automatic_connections - 1, 2)};
2963 // Use BIP324 transport when both us and them have NODE_V2_P2P set.
2964 const bool use_v2transport(addrConnect.nServices & GetLocalServices() & NODE_P2P_V2);
2965 OpenNetworkConnection(/*addrConnect=*/addrConnect,
2966 /*fCountFailure=*/count_failures,
2967 /*grant_outbound=*/std::move(grant),
2968 /*pszDest=*/nullptr,
2969 /*conn_type=*/conn_type,
2970 /*use_v2transport=*/use_v2transport,
2971 /*proxy_override=*/std::nullopt);
2972 }
2973 }
2974}
2975
2976std::vector<CAddress> CConnman::GetCurrentBlockRelayOnlyConns() const
2977{
2979 std::vector<CAddress> ret;
2981 for (const CNode* pnode : m_nodes) {
2982 if (pnode->IsBlockOnlyConn()) {
2983 ret.push_back(pnode->addr);
2984 }
2985 }
2986
2987 return ret;
2988}
2989
2990std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo(bool include_connected) const
2991{
2993
2994 std::vector<AddedNodeInfo> ret;
2995
2996 std::list<AddedNodeParams> lAddresses(0);
2997 {
2999 ret.reserve(m_added_node_params.size());
3000 std::copy(m_added_node_params.cbegin(), m_added_node_params.cend(), std::back_inserter(lAddresses));
3001 }
3002
3003
3004 // Build a map of all already connected addresses (by IP:port and by name) to inbound/outbound and resolved CService
3005 std::map<CService, bool> mapConnected;
3006 std::map<std::string, std::pair<bool, CService>> mapConnectedByName;
3007 {
3009 for (const CNode* pnode : m_nodes) {
3010 if (pnode->addr.IsValid()) {
3011 mapConnected[pnode->addr] = pnode->IsInboundConn();
3012 }
3013 std::string addrName{pnode->m_addr_name};
3014 if (!addrName.empty()) {
3015 mapConnectedByName[std::move(addrName)] = std::make_pair(pnode->IsInboundConn(), static_cast<const CService&>(pnode->addr));
3016 }
3017 }
3018 }
3019
3020 for (const auto& addr : lAddresses) {
3021 CService service{MaybeFlipIPv6toCJDNS(LookupNumeric(addr.m_added_node, GetDefaultPort(addr.m_added_node)))};
3022 AddedNodeInfo addedNode{addr, CService(), false, false};
3023 if (service.IsValid()) {
3024 // strAddNode is an IP:port
3025 auto it = mapConnected.find(service);
3026 if (it != mapConnected.end()) {
3027 if (!include_connected) {
3028 continue;
3029 }
3030 addedNode.resolvedAddress = service;
3031 addedNode.fConnected = true;
3032 addedNode.fInbound = it->second;
3033 }
3034 } else {
3035 // strAddNode is a name
3036 auto it = mapConnectedByName.find(addr.m_added_node);
3037 if (it != mapConnectedByName.end()) {
3038 if (!include_connected) {
3039 continue;
3040 }
3041 addedNode.resolvedAddress = it->second.second;
3042 addedNode.fConnected = true;
3043 addedNode.fInbound = it->second.first;
3044 }
3045 }
3046 ret.emplace_back(std::move(addedNode));
3047 }
3048
3049 return ret;
3050}
3051
3053{
3057
3058 while (true)
3059 {
3061 std::vector<AddedNodeInfo> vInfo = GetAddedNodeInfo(/*include_connected=*/false);
3062 bool tried = false;
3063 for (const AddedNodeInfo& info : vInfo) {
3064 if (!grant) {
3065 // If we've used up our semaphore and need a new one, let's not wait here since while we are waiting
3066 // the addednodeinfo state might change.
3067 break;
3068 }
3069 tried = true;
3071 /*fCountFailure=*/false,
3072 /*grant_outbound=*/std::move(grant),
3073 /*pszDest=*/info.m_params.m_added_node.c_str(),
3074 /*conn_type=*/ConnectionType::MANUAL,
3075 /*use_v2transport=*/info.m_params.m_use_v2transport,
3076 /*proxy_override=*/std::nullopt);
3077 if (!m_interrupt_net->sleep_for(500ms)) return;
3078 grant = CountingSemaphoreGrant<>(*semAddnode, /*fTry=*/true);
3079 }
3080 // See if any reconnections are desired.
3082 // Retry every 60 seconds if a connection was attempted, otherwise two seconds
3083 if (!m_interrupt_net->sleep_for(tried ? 60s : 2s)) {
3084 return;
3085 }
3086 }
3087}
3088
3089// if successful, this moves the passed grant to the constructed node
3091 bool fCountFailure,
3092 CountingSemaphoreGrant<>&& grant_outbound,
3093 const char* pszDest,
3094 ConnectionType conn_type,
3095 bool use_v2transport,
3096 const std::optional<Proxy>& proxy_override)
3097{
3100 assert(conn_type != ConnectionType::INBOUND);
3101
3102 //
3103 // Initiate outbound network connection
3104 //
3105 if (m_interrupt_net->interrupted()) {
3106 return false;
3107 }
3108 if (!fNetworkActive) {
3109 return false;
3110 }
3111 if (!pszDest) {
3112 bool banned_or_discouraged = m_banman && (m_banman->IsDiscouraged(addrConnect) || m_banman->IsBanned(addrConnect));
3113 if (IsLocal(addrConnect) || banned_or_discouraged || AlreadyConnectedToAddress(addrConnect)) {
3114 return false;
3115 }
3116 } else if (AlreadyConnectedToHost(pszDest)) {
3117 return false;
3118 }
3119
3120 CNode* pnode = ConnectNode(addrConnect, pszDest, fCountFailure, conn_type, use_v2transport, proxy_override);
3121
3122 if (!pnode)
3123 return false;
3124 pnode->grantOutbound = std::move(grant_outbound);
3125
3126 m_msgproc->InitializeNode(*pnode, m_local_services);
3127 {
3129 m_nodes.push_back(pnode);
3130
3131 // update connection count by network
3132 if (pnode->IsManualOrFullOutboundConn()) ++m_network_conn_counts[pnode->addr.GetNetwork()];
3133 }
3134
3135 TRACEPOINT(net, outbound_connection,
3136 pnode->GetId(),
3137 pnode->m_addr_name.c_str(),
3138 pnode->ConnectionTypeAsString().c_str(),
3139 pnode->ConnectedThroughNetwork(),
3141
3142 return true;
3143}
3144
3145std::optional<Network> CConnman::PrivateBroadcast::PickNetwork(std::optional<Proxy>& proxy) const
3146{
3148 std::optional<Proxy> clearnet_proxy;
3149 proxy.reset();
3151 nets.push_back(NET_ONION);
3152
3153 clearnet_proxy = ProxyForIPv4or6();
3154 if (clearnet_proxy.has_value()) {
3156 nets.push_back(NET_IPV4);
3157 }
3159 nets.push_back(NET_IPV6);
3160 }
3161 }
3162 }
3164 nets.push_back(NET_I2P);
3165 }
3166
3167 if (nets.empty()) {
3168 return std::nullopt;
3169 }
3170
3171 const Network net{nets[FastRandomContext{}.randrange(nets.size())]};
3172 if (net == NET_IPV4 || net == NET_IPV6) {
3173 proxy = clearnet_proxy;
3174 }
3175 return net;
3176}
3177
3179{
3180 return m_num_to_open;
3181}
3182
3184{
3185 m_num_to_open += n;
3186 m_num_to_open.notify_all();
3187}
3188
3190{
3191 size_t current_value{m_num_to_open.load()};
3192 size_t new_value;
3193 do {
3194 new_value = current_value > n ? current_value - n : 0;
3195 } while (!m_num_to_open.compare_exchange_strong(current_value, new_value));
3196 return new_value;
3197}
3198
3200{
3201 m_num_to_open.wait(0);
3202}
3203
3205{
3206 if (m_outbound_tor_ok_at_least_once.load()) {
3207 if (const auto tor_proxy = GetProxy(NET_ONION)) {
3208 return tor_proxy;
3209 }
3210 }
3211 return std::nullopt;
3212}
3213
3215
3217{
3219
3221
3222 while (!flagInterruptMsgProc)
3223 {
3224 bool fMoreWork = false;
3225
3226 {
3227 // Randomize the order in which we process messages from/to our peers.
3228 // This prevents attacks in which an attacker exploits having multiple
3229 // consecutive connections in the m_nodes list.
3230 const NodesSnapshot snap{*this, /*shuffle=*/true};
3231
3232 for (CNode* pnode : snap.Nodes()) {
3233 if (pnode->fDisconnect)
3234 continue;
3235
3236 // Receive messages
3237 bool fMoreNodeWork{m_msgproc->ProcessMessages(*pnode, flagInterruptMsgProc)};
3238 fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend);
3240 return;
3241 // Send messages
3242 m_msgproc->SendMessages(*pnode);
3243
3245 return;
3246 }
3247 }
3248
3249 WAIT_LOCK(mutexMsgProc, lock);
3250 if (!fMoreWork) {
3251 condMsgProc.wait_until(lock, std::chrono::steady_clock::now() + std::chrono::milliseconds(100), [this]() EXCLUSIVE_LOCKS_REQUIRED(mutexMsgProc) { return fMsgProcWake; });
3252 }
3253 fMsgProcWake = false;
3254 }
3255}
3256
3258{
3260
3261 static constexpr auto err_wait_begin = 1s;
3262 static constexpr auto err_wait_cap = 5min;
3263 auto err_wait = err_wait_begin;
3264
3265 bool advertising_listen_addr = false;
3266 i2p::Connection conn;
3267
3268 auto SleepOnFailure = [&]() {
3269 m_interrupt_net->sleep_for(err_wait);
3270 if (err_wait < err_wait_cap) {
3271 err_wait += 1s;
3272 }
3273 };
3274
3275 while (!m_interrupt_net->interrupted()) {
3276
3277 if (!m_i2p_sam_session->Listen(conn)) {
3278 if (advertising_listen_addr && conn.me.IsValid()) {
3279 RemoveLocal(conn.me);
3280 advertising_listen_addr = false;
3281 }
3282 SleepOnFailure();
3283 continue;
3284 }
3285
3286 if (!advertising_listen_addr) {
3287 AddLocal(conn.me, LOCAL_MANUAL);
3288 advertising_listen_addr = true;
3289 }
3290
3291 if (!m_i2p_sam_session->Accept(conn)) {
3292 SleepOnFailure();
3293 continue;
3294 }
3295
3297
3298 err_wait = err_wait_begin;
3299 }
3300}
3301
3303{
3306
3307 size_t addrman_num_bad_addresses{0};
3308 while (!m_interrupt_net->interrupted()) {
3309
3310 if (!fNetworkActive) {
3311 m_interrupt_net->sleep_for(5s);
3312 continue;
3313 }
3314
3315 CountingSemaphoreGrant<> conn_max_grant{m_private_broadcast.m_sem_conn_max}; // Would block if too many are opened.
3316
3318
3319 if (m_interrupt_net->interrupted()) {
3320 break;
3321 }
3322
3323 std::optional<Proxy> proxy;
3324 const std::optional<Network> net{m_private_broadcast.PickNetwork(proxy)};
3325 if (!net.has_value()) {
3326 LogWarning("Unable to open -privatebroadcast connections: neither Tor nor I2P is reachable");
3327 m_interrupt_net->sleep_for(5s);
3328 continue;
3329 }
3330
3331 const auto [addr, _] = addrman.get().Select(/*new_only=*/false, {net.value()});
3332
3333 if (!addr.IsValid() || IsLocal(addr)) {
3334 ++addrman_num_bad_addresses;
3335 if (addrman_num_bad_addresses > 100) {
3336 LogDebug(BCLog::PRIVBROADCAST, "Connections needed but addrman keeps returning bad addresses, will retry");
3337 m_interrupt_net->sleep_for(500ms);
3338 }
3339 continue;
3340 }
3341 addrman_num_bad_addresses = 0;
3342
3343 auto target_str{addr.ToStringAddrPort()};
3344 if (proxy.has_value()) {
3345 target_str += " through the proxy at " + proxy->ToString();
3346 }
3347
3348 const bool use_v2transport(addr.nServices & GetLocalServices() & NODE_P2P_V2);
3349
3350 if (OpenNetworkConnection(addr,
3351 /*fCountFailure=*/true,
3352 std::move(conn_max_grant),
3353 /*pszDest=*/nullptr,
3356 proxy)) {
3357 const size_t remaining{m_private_broadcast.NumToOpenSub(1)};
3358 LogDebug(BCLog::PRIVBROADCAST, "Socket connected to %s; remaining connections to open: %d", target_str, remaining);
3359 } else {
3360 const size_t remaining{m_private_broadcast.NumToOpen()};
3361 if (remaining == 0) {
3362 LogDebug(BCLog::PRIVBROADCAST, "Failed to connect to %s, will not retry, no more connections needed", target_str);
3363 } else {
3364 LogDebug(BCLog::PRIVBROADCAST, "Failed to connect to %s, will retry to a different address; remaining connections to open: %d", target_str, remaining);
3365 m_interrupt_net->sleep_for(100ms); // Prevent busy loop if OpenNetworkConnection() fails fast repeatedly.
3366 }
3367 }
3368 }
3369}
3370
3371bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError, NetPermissionFlags permissions)
3372{
3373 int nOne = 1;
3374
3375 // Create socket for listening for incoming connections
3376 struct sockaddr_storage sockaddr;
3377 socklen_t len = sizeof(sockaddr);
3378 if (!addrBind.GetSockAddr((struct sockaddr*)&sockaddr, &len))
3379 {
3380 strError = Untranslated(strprintf("Bind address family for %s not supported", addrBind.ToStringAddrPort()));
3381 LogError("%s\n", strError.original);
3382 return false;
3383 }
3384
3385 std::unique_ptr<Sock> sock = CreateSock(addrBind.GetSAFamily(), SOCK_STREAM, IPPROTO_TCP);
3386 if (!sock) {
3387 strError = Untranslated(strprintf("Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError())));
3388 LogError("%s\n", strError.original);
3389 return false;
3390 }
3391
3392 // Allow binding if the port is still in TIME_WAIT state after
3393 // the program was closed and restarted.
3394 if (sock->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, &nOne, sizeof(int)) == SOCKET_ERROR) {
3395 strError = Untranslated(strprintf("Error setting SO_REUSEADDR on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3396 LogInfo("%s\n", strError.original);
3397 }
3398
3399 // some systems don't have IPV6_V6ONLY but are always v6only; others do have the option
3400 // and enable it by default or not. Try to enable it, if possible.
3401 if (addrBind.IsIPv6()) {
3402#ifdef IPV6_V6ONLY
3403 if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_V6ONLY, &nOne, sizeof(int)) == SOCKET_ERROR) {
3404 strError = Untranslated(strprintf("Error setting IPV6_V6ONLY on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3405 LogInfo("%s\n", strError.original);
3406 }
3407#endif
3408#ifdef WIN32
3409 int nProtLevel = PROTECTION_LEVEL_UNRESTRICTED;
3410 if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_PROTECTION_LEVEL, &nProtLevel, sizeof(int)) == SOCKET_ERROR) {
3411 strError = Untranslated(strprintf("Error setting IPV6_PROTECTION_LEVEL on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError())));
3412 LogInfo("%s\n", strError.original);
3413 }
3414#endif
3415 }
3416
3417 if (sock->Bind(reinterpret_cast<struct sockaddr*>(&sockaddr), len) == SOCKET_ERROR) {
3418 int nErr = WSAGetLastError();
3419 if (nErr == WSAEADDRINUSE)
3420 strError = strprintf(_("Unable to bind to %s on this computer. %s is probably already running."), addrBind.ToStringAddrPort(), CLIENT_NAME);
3421 else
3422 strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToStringAddrPort(), NetworkErrorString(nErr));
3423 LogError("%s\n", strError.original);
3424 return false;
3425 }
3426 LogInfo("Bound to %s\n", addrBind.ToStringAddrPort());
3427
3428 // Listen for incoming connections
3429 if (sock->Listen(SOMAXCONN) == SOCKET_ERROR)
3430 {
3431 strError = strprintf(_("Listening for incoming connections failed (listen returned error %s)"), NetworkErrorString(WSAGetLastError()));
3432 LogError("%s\n", strError.original);
3433 return false;
3434 }
3435
3436 vhListenSocket.emplace_back(std::move(sock), permissions);
3437 return true;
3438}
3439
3441{
3442 if (!fDiscover)
3443 return;
3444
3445 for (const CNetAddr &addr: GetLocalAddresses()) {
3446 if (AddLocal(addr, LOCAL_IF) && fLogIPs) {
3447 LogInfo("%s: %s\n", __func__, addr.ToStringAddr());
3448 }
3449 }
3450}
3451
3453{
3454 LogInfo("%s: %s\n", __func__, active);
3455
3456 if (fNetworkActive == active) {
3457 return;
3458 }
3459
3460 fNetworkActive = active;
3461
3462 if (m_client_interface) {
3463 m_client_interface->NotifyNetworkActiveChanged(fNetworkActive);
3464 }
3465}
3466
3467CConnman::CConnman(uint64_t nSeed0In,
3468 uint64_t nSeed1In,
3469 AddrMan& addrman_in,
3470 const NetGroupManager& netgroupman,
3471 const CChainParams& params,
3472 bool network_active,
3473 std::shared_ptr<CThreadInterrupt> interrupt_net)
3474 : addrman(addrman_in)
3475 , m_netgroupman{netgroupman}
3476 , nSeed0(nSeed0In)
3477 , nSeed1(nSeed1In)
3478 , m_interrupt_net{interrupt_net}
3479 , m_params(params)
3480{
3481 SetTryNewOutboundPeer(false);
3482
3483 Options connOptions;
3484 Init(connOptions);
3485 SetNetworkActive(network_active);
3486}
3487
3489{
3490 return nLastNodeId.fetch_add(1, std::memory_order_relaxed);
3491}
3492
3494{
3495 return net == NET_I2P ? I2P_SAM31_PORT : m_params.GetDefaultPort();
3496}
3497
3498uint16_t CConnman::GetDefaultPort(const std::string& addr) const
3499{
3500 CNetAddr a;
3502}
3503
3504bool CConnman::Bind(const CService& addr_, unsigned int flags, NetPermissionFlags permissions)
3505{
3506 const CService addr{MaybeFlipIPv6toCJDNS(addr_)};
3507
3508 bilingual_str strError;
3509 if (!BindListenPort(addr, strError, permissions)) {
3511 m_client_interface->ThreadSafeMessageBox(strError, CClientUIInterface::MSG_ERROR);
3512 }
3513 return false;
3514 }
3515
3516 if (addr.IsRoutable() && fDiscover && !(flags & BF_DONT_ADVERTISE) && !NetPermissions::HasFlag(permissions, NetPermissionFlags::NoBan)) {
3517 AddLocal(addr, LOCAL_BIND);
3518 }
3519
3520 return true;
3521}
3522
3523bool CConnman::InitBinds(const Options& options)
3524{
3525 for (const auto& addrBind : options.vBinds) {
3527 return false;
3528 }
3529 }
3530 for (const auto& addrBind : options.vWhiteBinds) {
3531 if (!Bind(addrBind.m_service, BF_REPORT_ERROR, addrBind.m_flags)) {
3532 return false;
3533 }
3534 }
3535 for (const auto& addr_bind : options.onion_binds) {
3537 return false;
3538 }
3539 }
3540 if (options.bind_on_any) {
3541 // Don't consider errors to bind on IPv6 "::" fatal because the host OS
3542 // may not have IPv6 support and the user did not explicitly ask us to
3543 // bind on that.
3544 const CService ipv6_any{in6_addr(COMPAT_IN6ADDR_ANY_INIT), GetListenPort()}; // ::
3546
3547 struct in_addr inaddr_any;
3548 inaddr_any.s_addr = htonl(INADDR_ANY);
3549 const CService ipv4_any{inaddr_any, GetListenPort()}; // 0.0.0.0
3551 return false;
3552 }
3553 }
3554 return true;
3555}
3556
3557bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
3558{
3560 Init(connOptions);
3561
3562 if (fListen && !InitBinds(connOptions)) {
3563 if (m_client_interface) {
3564 m_client_interface->ThreadSafeMessageBox(
3565 _("Failed to listen on any port. Use -listen=0 if you want this."),
3567 }
3568 return false;
3569 }
3570
3571 if (connOptions.m_i2p_accept_incoming) {
3572 if (const auto i2p_sam = GetProxy(NET_I2P)) {
3573 m_i2p_sam_session = std::make_unique<i2p::sam::Session>(gArgs.GetDataDirNet() / "i2p_private_key",
3574 *i2p_sam, m_interrupt_net);
3575 }
3576 }
3577
3578 // 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)
3579 std::vector<std::string> seed_nodes = connOptions.vSeedNodes;
3580 if (!seed_nodes.empty()) {
3581 std::shuffle(seed_nodes.begin(), seed_nodes.end(), FastRandomContext{});
3582 }
3583
3585 // Load addresses from anchors.dat
3589 }
3590 LogInfo("%i block-relay-only anchors will be tried for connections.\n", m_anchors.size());
3591 }
3592
3593 if (m_client_interface) {
3594 m_client_interface->InitMessage(_("Starting network threads…"));
3595 }
3596
3597 fAddressesInitialized = true;
3598
3599 if (semOutbound == nullptr) {
3600 // initialize semaphore
3601 semOutbound = std::make_unique<std::counting_semaphore<>>(std::min(m_max_automatic_outbound, m_max_automatic_connections));
3602 }
3603 if (semAddnode == nullptr) {
3604 // initialize semaphore
3605 semAddnode = std::make_unique<std::counting_semaphore<>>(m_max_addnode);
3606 }
3607
3608 //
3609 // Start threads
3610 //
3612 m_interrupt_net->reset();
3613 flagInterruptMsgProc = false;
3614
3615 {
3617 fMsgProcWake = false;
3618 }
3619
3620 // Send and receive from sockets, accept connections
3622
3623 if (!gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED))
3624 LogInfo("DNS seeding disabled\n");
3625 else
3627
3628 // Initiate manual connections
3630
3631 if (connOptions.m_use_addrman_outgoing && !connOptions.m_specified_outgoing.empty()) {
3632 if (m_client_interface) {
3633 m_client_interface->ThreadSafeMessageBox(
3634 _("Cannot provide specific connections and have addrman find outgoing connections at the same time."),
3636 }
3637 return false;
3638 }
3639 if (connOptions.m_use_addrman_outgoing || !connOptions.m_specified_outgoing.empty()) {
3641 &util::TraceThread, "opencon",
3642 [this, connect = connOptions.m_specified_outgoing, seed_nodes = std::move(seed_nodes)] { ThreadOpenConnections(connect, seed_nodes); });
3643 }
3644
3645 // Process messages
3647
3648 if (m_i2p_sam_session) {
3650 std::thread(&util::TraceThread, "i2paccept", [this] { ThreadI2PAcceptIncoming(); });
3651 }
3652
3653 if (gArgs.GetBoolArg("-privatebroadcast", DEFAULT_PRIVATE_BROADCAST)) {
3655 std::thread(&util::TraceThread, "privbcast", [this] { ThreadPrivateBroadcast(); });
3656 }
3657
3658 // Dump network addresses
3659 scheduler.scheduleEvery([this] { DumpAddresses(); }, DUMP_PEERS_INTERVAL);
3660
3661 // Run the ASMap Health check once and then schedule it to run every 24h.
3662 if (m_netgroupman.UsingASMap()) {
3665 }
3666
3667 return true;
3668}
3669
3671{
3672public:
3673 CNetCleanup() = default;
3674
3676 {
3677#ifdef WIN32
3678 // Shutdown Windows Sockets
3679 WSACleanup();
3680#endif
3681 }
3682};
3684
3686{
3687 {
3689 flagInterruptMsgProc = true;
3690 }
3691 condMsgProc.notify_all();
3692
3693 (*m_interrupt_net)();
3695
3696 if (semOutbound) {
3697 for (int i=0; i<m_max_automatic_outbound; i++) {
3698 semOutbound->release();
3699 }
3700 }
3701
3702 if (semAddnode) {
3703 for (int i=0; i<m_max_addnode; i++) {
3704 semAddnode->release();
3705 }
3706 }
3707
3709 m_private_broadcast.NumToOpenAdd(1); // Just unblock NumToOpenWait() to be able to continue with shutdown.
3710}
3711
3713{
3714 if (threadPrivateBroadcast.joinable()) {
3716 }
3717 if (threadI2PAcceptIncoming.joinable()) {
3719 }
3720 if (threadMessageHandler.joinable())
3721 threadMessageHandler.join();
3722 if (threadOpenConnections.joinable())
3723 threadOpenConnections.join();
3724 if (threadOpenAddedConnections.joinable())
3726 if (threadDNSAddressSeed.joinable())
3727 threadDNSAddressSeed.join();
3728 if (threadSocketHandler.joinable())
3729 threadSocketHandler.join();
3730}
3731
3733{
3736
3738 DumpAddresses();
3739 fAddressesInitialized = false;
3740
3742 // Anchor connections are only dumped during clean shutdown.
3743 std::vector<CAddress> anchors_to_dump = GetCurrentBlockRelayOnlyConns();
3744 if (anchors_to_dump.size() > MAX_BLOCK_RELAY_ONLY_ANCHORS) {
3745 anchors_to_dump.resize(MAX_BLOCK_RELAY_ONLY_ANCHORS);
3746 }
3748 }
3749 }
3750
3751 // Delete peer connections.
3752 std::vector<CNode*> nodes;
3753 WITH_LOCK(m_nodes_mutex, nodes.swap(m_nodes));
3754 for (CNode* pnode : nodes) {
3755 LogDebug(BCLog::NET, "Stopping node, %s", pnode->DisconnectMsg());
3756 pnode->CloseSocketDisconnect();
3757 DeleteNode(pnode);
3758 }
3759
3760 for (CNode* pnode : m_nodes_disconnected) {
3761 DeleteNode(pnode);
3762 }
3763 m_nodes_disconnected.clear();
3764 WITH_LOCK(m_reconnections_mutex, m_reconnections.clear());
3765 vhListenSocket.clear();
3766 semOutbound.reset();
3767 semAddnode.reset();
3768}
3769
3771{
3772 assert(pnode);
3773 m_msgproc->FinalizeNode(*pnode);
3774 delete pnode;
3775}
3776
3778{
3779 Interrupt();
3780 Stop();
3781}
3782
3783std::vector<CAddress> CConnman::GetAddressesUnsafe(size_t max_addresses, size_t max_pct, std::optional<Network> network, const bool filtered) const
3784{
3785 std::vector<CAddress> addresses = addrman.get().GetAddr(max_addresses, max_pct, network, filtered);
3786 if (m_banman) {
3787 addresses.erase(std::remove_if(addresses.begin(), addresses.end(),
3788 [this](const CAddress& addr){return m_banman->IsDiscouraged(addr) || m_banman->IsBanned(addr);}),
3789 addresses.end());
3790 }
3791 return addresses;
3792}
3793
3794std::vector<CAddress> CConnman::GetAddresses(CNode& requestor, size_t max_addresses, size_t max_pct)
3795{
3796 uint64_t network_id = requestor.m_network_key;
3797 const auto current_time = GetTime<std::chrono::microseconds>();
3798 auto r = m_addr_response_caches.emplace(network_id, CachedAddrResponse{});
3799 CachedAddrResponse& cache_entry = r.first->second;
3800 if (cache_entry.m_cache_entry_expiration < current_time) { // If emplace() added new one it has expiration 0.
3801 cache_entry.m_addrs_response_cache = GetAddressesUnsafe(max_addresses, max_pct, /*network=*/std::nullopt);
3802 // Choosing a proper cache lifetime is a trade-off between the privacy leak minimization
3803 // and the usefulness of ADDR responses to honest users.
3804 //
3805 // Longer cache lifetime makes it more difficult for an attacker to scrape
3806 // enough AddrMan data to maliciously infer something useful.
3807 // By the time an attacker scraped enough AddrMan records, most of
3808 // the records should be old enough to not leak topology info by
3809 // e.g. analyzing real-time changes in timestamps.
3810 //
3811 // It takes only several hundred requests to scrape everything from an AddrMan containing 100,000 nodes,
3812 // so ~24 hours of cache lifetime indeed makes the data less inferable by the time
3813 // most of it could be scraped (considering that timestamps are updated via
3814 // ADDR self-announcements and when nodes communicate).
3815 // We also should be robust to those attacks which may not require scraping *full* victim's AddrMan
3816 // (because even several timestamps of the same handful of nodes may leak privacy).
3817 //
3818 // On the other hand, longer cache lifetime makes ADDR responses
3819 // outdated and less useful for an honest requestor, e.g. if most nodes
3820 // in the ADDR response are no longer active.
3821 //
3822 // However, the churn in the network is known to be rather low. Since we consider
3823 // nodes to be "terrible" (see IsTerrible()) if the timestamps are older than 30 days,
3824 // max. 24 hours of "penalty" due to cache shouldn't make any meaningful difference
3825 // in terms of the freshness of the response.
3826 cache_entry.m_cache_entry_expiration = current_time +
3827 21h + FastRandomContext().randrange<std::chrono::microseconds>(6h);
3828 }
3829 return cache_entry.m_addrs_response_cache;
3830}
3831
3833{
3835 const bool resolved_is_valid{resolved.IsValid()};
3836
3838 for (const auto& it : m_added_node_params) {
3839 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;
3840 }
3841
3842 m_added_node_params.push_back(add);
3843 return true;
3844}
3845
3846bool CConnman::RemoveAddedNode(std::string_view node)
3847{
3849 for (auto it = m_added_node_params.begin(); it != m_added_node_params.end(); ++it) {
3850 if (node == it->m_added_node) {
3851 m_added_node_params.erase(it);
3852 return true;
3853 }
3854 }
3855 return false;
3856}
3857
3859{
3861 const std::string addr_str{addr.ToStringAddr()};
3862 const std::string addr_port_str{addr.ToStringAddrPort()};
3864 return (m_added_node_params.size() < 24 // bound the query to a reasonable limit
3865 && std::any_of(m_added_node_params.cbegin(), m_added_node_params.cend(),
3866 [&](const auto& p) { return p.m_added_node == addr_str || p.m_added_node == addr_port_str; }));
3867}
3868
3870{
3872 if (flags == ConnectionDirection::Both) // Shortcut if we want total
3873 return m_nodes.size();
3874
3875 int nNum = 0;
3876 for (const auto& pnode : m_nodes) {
3877 if (flags & (pnode->IsInboundConn() ? ConnectionDirection::In : ConnectionDirection::Out)) {
3878 nNum++;
3879 }
3880 }
3881
3882 return nNum;
3883}
3884
3885
3886std::map<CNetAddr, LocalServiceInfo> CConnman::getNetLocalAddresses() const
3887{
3889 return mapLocalHost;
3890}
3891
3892uint32_t CConnman::GetMappedAS(const CNetAddr& addr) const
3893{
3894 return m_netgroupman.GetMappedAS(addr);
3895}
3896
3897void CConnman::GetNodeStats(std::vector<CNodeStats>& vstats) const
3898{
3900
3901 vstats.clear();
3903 vstats.reserve(m_nodes.size());
3904 for (CNode* pnode : m_nodes) {
3905 vstats.emplace_back();
3906 pnode->CopyStats(vstats.back());
3907 vstats.back().m_mapped_as = GetMappedAS(pnode->addr);
3908 }
3909}
3910
3911bool CConnman::DisconnectNode(std::string_view strNode)
3912{
3914 auto it = std::ranges::find_if(m_nodes, [&strNode](CNode* node) { return node->m_addr_name == strNode; });
3915 if (it != m_nodes.end()) {
3916 CNode* node{*it};
3917 LogDebug(BCLog::NET, "disconnect by address%s match, %s", (fLogIPs ? strprintf("=%s", strNode) : ""), node->DisconnectMsg());
3918 node->fDisconnect = true;
3919 return true;
3920 }
3921 return false;
3922}
3923
3925{
3927 bool disconnected = false;
3929 for (CNode* pnode : m_nodes) {
3930 if (subnet.Match(pnode->addr)) {
3931 LogDebug(BCLog::NET, "disconnect by subnet%s match, %s", (fLogIPs ? strprintf("=%s", subnet.ToString()) : ""), pnode->DisconnectMsg());
3932 pnode->fDisconnect = true;
3933 disconnected = true;
3934 }
3935 }
3936 return disconnected;
3937}
3938
3940{
3942 return DisconnectNode(CSubNet(addr));
3943}
3944
3946{
3948 for(CNode* pnode : m_nodes) {
3949 if (id == pnode->GetId()) {
3950 LogDebug(BCLog::NET, "disconnect by id, %s", pnode->DisconnectMsg());
3951 pnode->fDisconnect = true;
3952 return true;
3953 }
3954 }
3955 return false;
3956}
3957
3958void CConnman::RecordBytesRecv(uint64_t bytes)
3959{
3960 nTotalBytesRecv += bytes;
3961}
3962
3963void CConnman::RecordBytesSent(uint64_t bytes)
3964{
3967
3968 nTotalBytesSent += bytes;
3969
3970 const auto now = GetTime<std::chrono::seconds>();
3971 if (nMaxOutboundCycleStartTime + MAX_UPLOAD_TIMEFRAME < now)
3972 {
3973 // timeframe expired, reset cycle
3974 nMaxOutboundCycleStartTime = now;
3975 nMaxOutboundTotalBytesSentInCycle = 0;
3976 }
3977
3978 nMaxOutboundTotalBytesSentInCycle += bytes;
3979}
3980
3982{
3985 return nMaxOutboundLimit;
3986}
3987
3988std::chrono::seconds CConnman::GetMaxOutboundTimeframe() const
3989{
3990 return MAX_UPLOAD_TIMEFRAME;
3991}
3992
3994{
3998}
3999
4001{
4003
4004 if (nMaxOutboundLimit == 0)
4005 return 0s;
4006
4007 if (nMaxOutboundCycleStartTime.count() == 0)
4008 return MAX_UPLOAD_TIMEFRAME;
4009
4010 const std::chrono::seconds cycleEndTime = nMaxOutboundCycleStartTime + MAX_UPLOAD_TIMEFRAME;
4011 const auto now = GetTime<std::chrono::seconds>();
4012 return (cycleEndTime < now) ? 0s : cycleEndTime - now;
4013}
4014
4015bool CConnman::OutboundTargetReached(bool historicalBlockServingLimit) const
4016{
4019 if (nMaxOutboundLimit == 0)
4020 return false;
4021
4022 if (historicalBlockServingLimit)
4023 {
4024 // keep a large enough buffer to at least relay each block once
4025 const std::chrono::seconds timeLeftInCycle = GetMaxOutboundTimeLeftInCycle_();
4026 const uint64_t buffer = timeLeftInCycle / std::chrono::minutes{10} * MAX_BLOCK_SERIALIZED_SIZE;
4027 if (buffer >= nMaxOutboundLimit || nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit - buffer)
4028 return true;
4029 }
4030 else if (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit)
4031 return true;
4032
4033 return false;
4034}
4035
4037{
4040 if (nMaxOutboundLimit == 0)
4041 return 0;
4042
4043 return (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit) ? 0 : nMaxOutboundLimit - nMaxOutboundTotalBytesSentInCycle;
4044}
4045
4047{
4048 return nTotalBytesRecv;
4049}
4050
4052{
4055 return nTotalBytesSent;
4056}
4057
4059{
4060 return m_local_services;
4061}
4062
4063static std::unique_ptr<Transport> MakeTransport(NodeId id, bool use_v2transport, bool inbound) noexcept
4064{
4065 if (use_v2transport) {
4066 return std::make_unique<V2Transport>(id, /*initiating=*/!inbound);
4067 } else {
4068 return std::make_unique<V1Transport>(id);
4069 }
4070}
4071
4073 std::shared_ptr<Sock> sock,
4074 const CAddress& addrIn,
4075 uint64_t nKeyedNetGroupIn,
4076 uint64_t nLocalHostNonceIn,
4077 const CService& addrBindIn,
4078 const std::string& addrNameIn,
4079 ConnectionType conn_type_in,
4080 bool inbound_onion,
4081 uint64_t network_key,
4082 CNodeOptions&& node_opts)
4083 : m_transport{MakeTransport(idIn, node_opts.use_v2transport, conn_type_in == ConnectionType::INBOUND)},
4084 m_permission_flags{node_opts.permission_flags},
4085 m_sock{sock},
4086 m_connected{NodeClock::now()},
4087 m_proxy_override{std::move(node_opts.proxy_override)},
4088 addr{addrIn},
4089 addrBind{addrBindIn},
4090 m_addr_name{addrNameIn.empty() ? addr.ToStringAddrPort() : addrNameIn},
4091 m_dest(addrNameIn),
4092 m_inbound_onion{inbound_onion},
4093 m_prefer_evict{node_opts.prefer_evict},
4094 nKeyedNetGroup{nKeyedNetGroupIn},
4095 m_network_key{network_key},
4096 m_conn_type{conn_type_in},
4097 id{idIn},
4098 nLocalHostNonce{nLocalHostNonceIn},
4099 m_recv_flood_size{node_opts.recv_flood_size},
4100 m_i2p_sam_session{std::move(node_opts.i2p_sam_session)}
4101{
4102 if (inbound_onion) assert(conn_type_in == ConnectionType::INBOUND);
4103
4104 for (const auto& msg : ALL_NET_MESSAGE_TYPES) {
4105 mapRecvBytesPerMsgType[msg] = 0;
4106 }
4107 mapRecvBytesPerMsgType[NET_MESSAGE_TYPE_OTHER] = 0;
4108
4109 if (fLogIPs) {
4110 LogDebug(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
4111 } else {
4112 LogDebug(BCLog::NET, "Added connection peer=%d\n", id);
4113 }
4114}
4115
4117{
4119
4120 size_t nSizeAdded = 0;
4121 for (const auto& msg : vRecvMsg) {
4122 // vRecvMsg contains only completed CNetMessage
4123 // the single possible partially deserialized message are held by TransportDeserializer
4124 nSizeAdded += msg.GetMemoryUsage();
4125 }
4126
4128 m_msg_process_queue.splice(m_msg_process_queue.end(), vRecvMsg);
4129 m_msg_process_queue_size += nSizeAdded;
4130 fPauseRecv = m_msg_process_queue_size > m_recv_flood_size;
4131}
4132
4133std::optional<std::pair<CNetMessage, bool>> CNode::PollMessage()
4134{
4136 if (m_msg_process_queue.empty()) return std::nullopt;
4137
4138 std::list<CNetMessage> msgs;
4139 // Just take one message
4140 msgs.splice(msgs.begin(), m_msg_process_queue, m_msg_process_queue.begin());
4141 m_msg_process_queue_size -= msgs.front().GetMemoryUsage();
4142 fPauseRecv = m_msg_process_queue_size > m_recv_flood_size;
4143
4144 return std::make_pair(std::move(msgs.front()), !m_msg_process_queue.empty());
4145}
4146
4148{
4149 return pnode && pnode->fSuccessfullyConnected && !pnode->fDisconnect;
4150}
4151
4154static bool IsOutboundMessageAllowedInPrivateBroadcast(std::string_view type) noexcept
4155{
4156 return type == NetMsgType::VERSION ||
4157 type == NetMsgType::VERACK ||
4158 type == NetMsgType::INV ||
4159 type == NetMsgType::TX ||
4160 type == NetMsgType::PING;
4161}
4162
4164{
4166
4168 LogDebug(BCLog::PRIVBROADCAST, "Omitting send of message '%s', %s", msg.m_type, pnode->LogPeer());
4169 return;
4170 }
4171
4173 pnode->addr.IsTor() && msg.m_type == NetMsgType::VERACK) {
4174 // If we are sending the peer VERACK that means we successfully sent
4175 // and received another message to/from that peer (VERSION).
4177 }
4178
4179 size_t nMessageSize = msg.data.size();
4180 LogDebug(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
4181 if (m_capture_messages) {
4182 CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false);
4183 }
4184
4185 TRACEPOINT(net, outbound_message,
4186 pnode->GetId(),
4187 pnode->m_addr_name.c_str(),
4188 pnode->ConnectionTypeAsString().c_str(),
4189 msg.m_type.c_str(),
4190 msg.data.size(),
4191 msg.data.data()
4192 );
4193
4194 size_t nBytesSent = 0;
4195 {
4196 LOCK(pnode->cs_vSend);
4197 // Check if the transport still has unsent bytes, and indicate to it that we're about to
4198 // give it a message to send.
4199 const auto& [to_send, more, _msg_type] =
4200 pnode->m_transport->GetBytesToSend(/*have_next_message=*/true);
4201 const bool queue_was_empty{to_send.empty() && pnode->vSendMsg.empty()};
4202
4203 // Update memory usage of send buffer.
4204 pnode->m_send_memusage += msg.GetMemoryUsage();
4205 if (pnode->m_send_memusage + pnode->m_transport->GetSendMemoryUsage() > nSendBufferMaxSize) pnode->fPauseSend = true;
4206 // Move message to vSendMsg queue.
4207 pnode->vSendMsg.push_back(std::move(msg));
4208
4209 // If there was nothing to send before, and there is now (predicted by the "more" value
4210 // returned by the GetBytesToSend call above), attempt "optimistic write":
4211 // because the poll/select loop may pause for SELECT_TIMEOUT_MILLISECONDS before actually
4212 // doing a send, try sending from the calling thread if the queue was empty before.
4213 // With a V1Transport, more will always be true here, because adding a message always
4214 // results in sendable bytes there, but with V2Transport this is not the case (it may
4215 // still be in the handshake).
4216 if (queue_was_empty && more) {
4217 std::tie(nBytesSent, std::ignore) = SocketSendData(*pnode);
4218 }
4219 }
4220 if (nBytesSent) RecordBytesSent(nBytesSent);
4221}
4222
4223bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
4224{
4226
4227 CNode* found = nullptr;
4229 for (auto&& pnode : m_nodes) {
4230 if(pnode->GetId() == id) {
4231 found = pnode;
4232 break;
4233 }
4234 }
4235 return found != nullptr && NodeFullyConnected(found) && func(found);
4236}
4237
4239{
4240 return CSipHasher(nSeed0, nSeed1).Write(id);
4241}
4242
4243uint64_t CConnman::CalculateKeyedNetGroup(const CNetAddr& address) const
4244{
4245 std::vector<unsigned char> vchNetGroup(m_netgroupman.GetGroup(address));
4246
4248}
4249
4251{
4255 while (true) {
4256 // Move first element of m_reconnections to todo (avoiding an allocation inside the lock).
4257 decltype(m_reconnections) todo;
4258 {
4260 if (m_reconnections.empty()) break;
4261 todo.splice(todo.end(), m_reconnections, m_reconnections.begin());
4262 }
4263
4264 auto& item = *todo.begin();
4265 OpenNetworkConnection(item.addr_connect,
4266 // We only reconnect if the first attempt to connect succeeded at
4267 // connection time, but then failed after the CNode object was
4268 // created. Since we already know connecting is possible, do not
4269 // count failure to reconnect.
4270 /*fCountFailure=*/false,
4271 std::move(item.grant),
4272 item.destination.empty() ? nullptr : item.destination.c_str(),
4273 item.conn_type,
4274 item.use_v2transport,
4275 item.proxy_override);
4276 }
4277}
4278
4280{
4281 const std::vector<CAddress> v4_addrs{GetAddressesUnsafe(/*max_addresses=*/0, /*max_pct=*/0, Network::NET_IPV4, /*filtered=*/false)};
4282 const std::vector<CAddress> v6_addrs{GetAddressesUnsafe(/*max_addresses=*/0, /*max_pct=*/0, Network::NET_IPV6, /*filtered=*/false)};
4283 std::vector<CNetAddr> clearnet_addrs;
4284 clearnet_addrs.reserve(v4_addrs.size() + v6_addrs.size());
4285 std::transform(v4_addrs.begin(), v4_addrs.end(), std::back_inserter(clearnet_addrs),
4286 [](const CAddress& addr) { return static_cast<CNetAddr>(addr); });
4287 std::transform(v6_addrs.begin(), v6_addrs.end(), std::back_inserter(clearnet_addrs),
4288 [](const CAddress& addr) { return static_cast<CNetAddr>(addr); });
4289 m_netgroupman.ASMapHealthCheck(clearnet_addrs);
4290}
4291
4292// Dump binary message to file, with timestamp.
4293static void CaptureMessageToFile(const CAddress& addr,
4294 const std::string& msg_type,
4295 std::span<const unsigned char> data,
4296 bool is_incoming)
4297{
4298 // Note: This function captures the message at the time of processing,
4299 // not at socket receive/send time.
4300 // This ensures that the messages are always in order from an application
4301 // layer (processing) perspective.
4302 auto now = GetTime<std::chrono::microseconds>();
4303
4304 // Windows folder names cannot include a colon
4305 std::string clean_addr = addr.ToStringAddrPort();
4306 std::replace(clean_addr.begin(), clean_addr.end(), ':', '_');
4307
4308 fs::path base_path = gArgs.GetDataDirNet() / "message_capture" / fs::u8path(clean_addr);
4309 fs::create_directories(base_path);
4310
4311 fs::path path = base_path / (is_incoming ? "msgs_recv.dat" : "msgs_sent.dat");
4312 AutoFile f{fsbridge::fopen(path, "ab")};
4313
4314 ser_writedata64(f, now.count());
4315 f << std::span{msg_type};
4316 for (auto i = msg_type.length(); i < CMessageHeader::MESSAGE_TYPE_SIZE; ++i) {
4317 f << uint8_t{'\0'};
4318 }
4319 uint32_t size = data.size();
4320 ser_writedata32(f, size);
4321 f << data;
4322
4323 if (f.fclose() != 0) {
4324 throw std::ios_base::failure(
4325 strprintf("Error closing %s after write, file contents are likely incomplete", fs::PathToString(path)));
4326 }
4327}
4328
4329std::function<void(const CAddress& addr,
4330 const std::string& msg_type,
4331 std::span<const unsigned char> data,
4332 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:3183
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:3204
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:3189
void NumToOpenWait() const
Wait for the number of needed connections to become greater than 0.
Definition: net.cpp:3199
size_t NumToOpen() const
Get the pending number of connections to open.
Definition: net.cpp:3178
std::optional< Network > PickNetwork(std::optional< Proxy > &proxy) const
Choose a network to open a connection to.
Definition: net.cpp:3145
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:1751
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:2555
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:4250
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:2574
std::reference_wrapper< AddrMan > addrman
Definition: net.h:1653
void StopNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3732
void DisconnectNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex
Definition: net.cpp:1938
m_max_outbound_full_relay
Definition: net.h:1124
void DeleteNode(CNode *pnode)
Definition: net.cpp:3770
void ThreadI2PAcceptIncoming() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3257
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:2468
const bool use_v2transport(GetLocalServices() &NODE_P2P_V2)
class CConnman::PrivateBroadcast m_private_broadcast
uint16_t GetDefaultPort(Network net) const
Definition: net.cpp:3493
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:2035
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:3794
void SetTryNewOutboundPeer(bool flag)
Definition: net.cpp:2473
std::atomic< bool > flagInterruptMsgProc
Definition: net.h:1759
void Interrupt() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc)
Definition: net.cpp:3685
std::map< CNetAddr, LocalServiceInfo > getNetLocalAddresses() const
Definition: net.cpp:3886
void ThreadDNSAddressSeed() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
Definition: net.cpp:2290
std::vector< CAddress > GetCurrentBlockRelayOnlyConns() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Return vector of current BLOCK_RELAY peers.
Definition: net.cpp:2976
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:3488
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:2281
bool OutboundTargetReached(bool historicalBlockServingLimit) const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
check if the outbound target is reached if param historicalBlockServingLimit is set true,...
Definition: net.cpp:4015
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:2255
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3981
std::thread threadDNSAddressSeed
Definition: net.h:1774
void ASMapHealthCheck()
Definition: net.cpp:4279
bool AddConnection(const std::string &address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Attempts to open a connection.
Definition: net.cpp:1893
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:2153
const uint64_t nSeed1
Definition: net.h:1752
void StartExtraBlockRelayPeers()
Definition: net.cpp:2479
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:3988
uint64_t CalculateKeyedNetGroup(const CNetAddr &ad) const
Definition: net.cpp:4243
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:4058
bool AddNode(const AddedNodeParams &add) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3832
std::vector< AddedNodeInfo > GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:2990
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:3523
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:4238
Mutex m_total_bytes_sent_mutex
Definition: net.h:1629
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:3052
bool Bind(const CService &addr, unsigned int flags, NetPermissionFlags permissions)
Definition: net.cpp:3504
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:2538
std::thread threadOpenConnections
Definition: net.h:1777
void ThreadPrivateBroadcast() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3302
uint32_t GetMappedAS(const CNetAddr &addr) const
Definition: net.cpp:3892
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
Definition: net.cpp:2440
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:3557
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:4000
uint64_t GetTotalBytesRecv() const
Definition: net.cpp:4046
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:1607
bool OpenNetworkConnection(const CAddress &addrConnect, bool fCountFailure, CountingSemaphoreGrant<> &&grant_outbound, const char *pszDest, ConnectionType conn_type, bool use_v2transport, const std::optional< Proxy > &proxy_override) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Open a new P2P connection and initialize it with the PeerManager at m_msgproc.
Definition: net.cpp:3090
m_max_outbound_block_relay
Definition: net.h:1125
static bool NodeFullyConnected(const CNode *pnode)
Definition: net.cpp:4147
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:3452
bool MultipleManualOrFullOutboundConns(Network net) const EXCLUSIVE_LOCKS_REQUIRED(m_nodes_mutex)
Definition: net.cpp:2568
bool AddedNodesContain(const CAddress &addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
Definition: net.cpp:3858
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:2040
std::chrono::seconds GetMaxOutboundTimeLeftInCycle() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3993
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:1781
void ThreadOpenConnections(std::vector< std::string > connect, std::span< const std::string > seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
Definition: net.cpp:2592
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:1694
void GetNodeStats(std::vector< CNodeStats > &vstats) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3897
bool ForNode(NodeId id, std::function< bool(CNode *pnode)> func) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:4223
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:3846
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:3783
void NotifyNumConnectionsChanged() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2018
~CConnman()
Definition: net.cpp:3777
void StopThreads()
Definition: net.cpp:3712
int GetExtraBlockRelayCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2522
std::thread threadOpenAddedConnections
Definition: net.h:1776
bool DisconnectNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:3911
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:2270
void RecordBytesSent(uint64_t bytes) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:3963
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Definition: net.cpp:3216
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:4051
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:3869
void RecordBytesRecv(uint64_t bytes)
Definition: net.cpp:3958
int GetExtraFullOutboundCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Definition: net.cpp:2506
uint64_t GetOutboundTargetBytesLeft() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
response the bytes left in the current max outbound cycle in case of no limit, it will always respons...
Definition: net.cpp:4036
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Check connected and listening sockets for IO readiness and process them accordingly.
Definition: net.cpp:2124
void PushMessage(CNode *pnode, CSerializedNetMsg &&msg) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
Definition: net.cpp:4163
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:2093
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:3467
void DumpAddresses()
Definition: net.cpp:2430
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:2486
bool BindListenPort(const CService &bindAddr, bilingual_str &strError, NetPermissionFlags permissions)
Definition: net.cpp:3371
An encapsulated private key.
Definition: key.h:37
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:674
std::string ToStringAddr() const
Definition: netaddress.cpp:580
std::vector< unsigned char > GetAddrBytes() const
Definition: netaddress.cpp:692
bool IsTor() const
Definition: netaddress.h:175
bool IsRoutable() const
Definition: netaddress.cpp:462
bool IsPrivacyNet() const
Whether this object is a privacy network.
Definition: netaddress.h:189
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:424
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:496
~CNetCleanup()
Definition: net.cpp:3675
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:4072
void MarkReceivedMsgsForProcessing() EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex)
Move all messages from the received queue to the processing queue.
Definition: net.cpp:4116
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:4133
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:530
bool SetSockAddr(const struct sockaddr *paddr, socklen_t addrlen)
Set CService from a network sockaddr.
Definition: netaddress.cpp:806
uint16_t GetPort() const
Definition: netaddress.cpp:835
sa_family_t GetSAFamily() const
Get the address family.
Definition: netaddress.cpp:822
bool GetSockAddr(struct sockaddr *paddr, socklen_t *addrlen) const
Obtain the IPv4/6 socket address this represents.
Definition: netaddress.cpp:862
std::string ToStringAddrPort() const
Definition: netaddress.cpp:903
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:1538
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:1577
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:1460
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:1586
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:1521
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:1560
bool SetMessageToSend(CSerializedNetMsg &msg) noexcept override EXCLUSIVE_LOCKS_REQUIRED(!m_send_mutex)
Set the next message to send.
Definition: net.cpp:1489
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.
static const 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:82
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition: fs.h:162
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:352
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:22
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:4063
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:4293
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:4333
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:4154
static CNetCleanup instance_of_cnetcleanup
Definition: net.cpp:3683
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:3440
bool SeenLocal(const CService &addr)
vote for a local address
Definition: net.cpp:324
static constexpr bool DEFAULT_PRIVATE_BROADCAST
Default for -privatebroadcast.
Definition: net.h:91
static constexpr std::chrono::minutes TIMEOUT_INTERVAL
Time after which to disconnect, after waiting for a ping response (or inactivity).
Definition: net.h:59
static constexpr bool DEFAULT_FIXEDSEEDS
Definition: net.h:99
static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH
Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable).
Definition: net.h:65
static constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL
Run the extra block-relay-only connection loop once every 5 minutes.
Definition: net.h:63
static constexpr bool DEFAULT_FORCEDNSSEED
Definition: net.h:97
static constexpr bool DEFAULT_DNSSEED
Definition: net.h:98
int64_t NodeId
Definition: net.h:105
static constexpr std::chrono::hours ASMAP_HEALTH_CHECK_INTERVAL
Interval for ASMap Health Check.
Definition: net.h:95
static constexpr auto FEELER_INTERVAL
Run the feeler connection loop once every 2 minutes.
Definition: net.h:61
static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
Definition: net.h:69
@ LOCAL_MANUAL
Definition: net.h:160
@ LOCAL_BIND
Definition: net.h:158
@ LOCAL_IF
Definition: net.h:157
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
Definition: net.h:73
NetPermissionFlags
static 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
static 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