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