Skip to content

Commit 620ac8c

Browse files
committed
Merge #19724: [net] Cleanup connection types- followups
eb1c5d0 [doc] Follow developer notes, add comment about missing default. (Amiti Uttarwar) d5a57ce [doc] Describe connection types in more depth. (Amiti Uttarwar) 4829b6f [refactor] Simplify connection type logic in ThreadOpenConnections (Amiti Uttarwar) 1e563ae [refactor] Simplify check for block-relay-only connection. (Amiti Uttarwar) da3a0be [test] Add explicit tests that connection types get set correctly (Amiti Uttarwar) 1d74fc7 [trivial] Small style updates (Amiti Uttarwar) ff6b908 [doc] Explain address handling logic in process messages (Amiti Uttarwar) dff16b1 [refactor] Restructure logic to check for addr relay. (Amiti Uttarwar) a6ab1e8 [net] Remove unnecessary default args on OpenNetworkConnection (Amiti Uttarwar) 8d6ff46 scripted-diff: Rename `OUTBOUND` ConnectionType to `OUTBOUND_FULL_RELAY` (Amiti Uttarwar) Pull request description: This PR addresses outstanding review comments from #19316. It further simplifies `net.cpp` complexity and adds documentation about design goals about different connection types. ACKs for top commit: naumenkogs: ACK eb1c5d0 laanwj: Code review ACK eb1c5d0 Tree-SHA512: 2fe14e428404c95661e5518c8c90db07ab5b9ebb1bac921b3bdf82b181f444fae379f8fc0a2b619e6b4693f01c55bd246fbd8c8eedadd96849a30de3161afee5
2 parents 68f0ab2 + eb1c5d0 commit 620ac8c

File tree

8 files changed

+139
-75
lines changed

8 files changed

+139
-75
lines changed

src/net.cpp

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,41 +1843,45 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
18431843
// but inbound and manual peers do not use our outbound slots. Inbound peers
18441844
// also have the added issue that they could be attacker controlled and used
18451845
// to prevent us from connecting to particular hosts if we used them here.
1846-
switch(pnode->m_conn_type){
1846+
switch (pnode->m_conn_type) {
18471847
case ConnectionType::INBOUND:
18481848
case ConnectionType::MANUAL:
18491849
break;
1850-
case ConnectionType::OUTBOUND:
1850+
case ConnectionType::OUTBOUND_FULL_RELAY:
18511851
case ConnectionType::BLOCK_RELAY:
18521852
case ConnectionType::ADDR_FETCH:
18531853
case ConnectionType::FEELER:
18541854
setConnected.insert(pnode->addr.GetGroup(addrman.m_asmap));
1855-
}
1855+
} // no default case, so the compiler can warn about missing cases
18561856
}
18571857
}
18581858

1859-
// Feeler Connections
1860-
//
1861-
// Design goals:
1862-
// * Increase the number of connectable addresses in the tried table.
1863-
//
1864-
// Method:
1865-
// * Choose a random address from new and attempt to connect to it if we can connect
1866-
// successfully it is added to tried.
1867-
// * Start attempting feeler connections only after node finishes making outbound
1868-
// connections.
1869-
// * Only make a feeler connection once every few minutes.
1870-
//
1859+
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
1860+
int64_t nTime = GetTimeMicros();
18711861
bool fFeeler = false;
18721862

1873-
if (nOutboundFullRelay >= m_max_outbound_full_relay && nOutboundBlockRelay >= m_max_outbound_block_relay && !GetTryNewOutboundPeer()) {
1874-
int64_t nTime = GetTimeMicros(); // The current time right now (in microseconds).
1875-
if (nTime > nNextFeeler) {
1876-
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
1877-
fFeeler = true;
1878-
} else {
1879-
continue;
1880-
}
1863+
// Determine what type of connection to open. Opening
1864+
// OUTBOUND_FULL_RELAY connections gets the highest priority until we
1865+
// meet our full-relay capacity. Then we open BLOCK_RELAY connection
1866+
// until we hit our block-relay-only peer limit.
1867+
// GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
1868+
// try opening an additional OUTBOUND_FULL_RELAY connection. If none of
1869+
// these conditions are met, check the nNextFeeler timer to decide if
1870+
// we should open a FEELER.
1871+
1872+
if (nOutboundFullRelay < m_max_outbound_full_relay) {
1873+
// OUTBOUND_FULL_RELAY
1874+
} else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
1875+
conn_type = ConnectionType::BLOCK_RELAY;
1876+
} else if (GetTryNewOutboundPeer()) {
1877+
// OUTBOUND_FULL_RELAY
1878+
} else if (nTime > nNextFeeler) {
1879+
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
1880+
conn_type = ConnectionType::FEELER;
1881+
fFeeler = true;
1882+
} else {
1883+
// skip to next iteration of while loop
1884+
continue;
18811885
}
18821886

18831887
addrman.ResolveCollisions();
@@ -1944,23 +1948,6 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
19441948
LogPrint(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToString());
19451949
}
19461950

1947-
ConnectionType conn_type;
1948-
// Determine what type of connection to open. If fFeeler is not
1949-
// set, open OUTBOUND connections until we meet our full-relay
1950-
// capacity. Then open BLOCK_RELAY connections until we hit our
1951-
// block-relay peer limit. Otherwise, default to opening an
1952-
// OUTBOUND connection.
1953-
if (fFeeler) {
1954-
conn_type = ConnectionType::FEELER;
1955-
} else if (nOutboundFullRelay < m_max_outbound_full_relay) {
1956-
conn_type = ConnectionType::OUTBOUND;
1957-
} else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
1958-
conn_type = ConnectionType::BLOCK_RELAY;
1959-
} else {
1960-
// GetTryNewOutboundPeer() is true
1961-
conn_type = ConnectionType::OUTBOUND;
1962-
}
1963-
19641951
OpenNetworkConnection(addrConnect, (int)setConnected.size() >= std::min(nMaxConnections - 1, 2), &grant, nullptr, conn_type);
19651952
}
19661953
}
@@ -2784,6 +2771,9 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn
27842771
hashContinue = uint256();
27852772
if (conn_type_in != ConnectionType::BLOCK_RELAY) {
27862773
m_tx_relay = MakeUnique<TxRelay>();
2774+
}
2775+
2776+
if (RelayAddrsWithConn()) {
27872777
m_addr_known = MakeUnique<CRollingBloomFilter>(5000, 0.001);
27882778
}
27892779

src/net.h

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,54 @@ struct CSerializedNetMsg
118118
* information we have available at the time of opening or accepting the
119119
* connection. Aside from INBOUND, all types are initiated by us. */
120120
enum class ConnectionType {
121-
INBOUND, /**< peer initiated connections */
122-
OUTBOUND, /**< full relay connections (blocks, addrs, txns) made automatically. Addresses selected from AddrMan. */
123-
MANUAL, /**< connections to addresses added via addnode or the connect command line argument */
124-
FEELER, /**< short lived connections used to test address validity */
125-
BLOCK_RELAY, /**< only relay blocks to these automatic outbound connections. Addresses selected from AddrMan. */
126-
ADDR_FETCH, /**< short lived connections used to solicit addrs when starting the node without a populated AddrMan */
121+
/**
122+
* Inbound connections are those initiated by a peer. This is the only
123+
* property we know at the time of connection, until P2P messages are
124+
* exchanged.
125+
*/
126+
INBOUND,
127+
128+
/**
129+
* These are the default connections that we use to connect with the
130+
* network. There is no restriction on what is relayed- by default we relay
131+
* blocks, addresses & transactions. We automatically attempt to open
132+
* MAX_OUTBOUND_FULL_RELAY_CONNECTIONS using addresses from our AddrMan.
133+
*/
134+
OUTBOUND_FULL_RELAY,
135+
136+
137+
/**
138+
* We open manual connections to addresses that users explicitly inputted
139+
* via the addnode RPC, or the -connect command line argument. Even if a
140+
* manual connection is misbehaving, we do not automatically disconnect or
141+
* add it to our discouragement filter.
142+
*/
143+
MANUAL,
144+
145+
/**
146+
* Feeler connections are short lived connections used to increase the
147+
* number of connectable addresses in our AddrMan. Approximately every
148+
* FEELER_INTERVAL, we attempt to connect to a random address from the new
149+
* table. If successful, we add it to the tried table.
150+
*/
151+
FEELER,
152+
153+
/**
154+
* We use block-relay-only connections to help prevent against partition
155+
* attacks. By not relaying transactions or addresses, these connections
156+
* are harder to detect by a third party, thus helping obfuscate the
157+
* network topology. We automatically attempt to open
158+
* MAX_BLOCK_RELAY_ONLY_CONNECTIONS using addresses from our AddrMan.
159+
*/
160+
BLOCK_RELAY,
161+
162+
/**
163+
* AddrFetch connections are short lived connections used to solicit
164+
* addresses from peers. These are initiated to addresses submitted via the
165+
* -seednode command line argument, or under certain conditions when the
166+
* AddrMan is empty.
167+
*/
168+
ADDR_FETCH,
127169
};
128170

129171
class NetEventsInterface;
@@ -209,7 +251,7 @@ class CConnman
209251
bool GetNetworkActive() const { return fNetworkActive; };
210252
bool GetUseAddrmanOutgoing() const { return m_use_addrman_outgoing; };
211253
void SetNetworkActive(bool active);
212-
void OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = nullptr, const char *strDest = nullptr, ConnectionType conn_type = ConnectionType::OUTBOUND);
254+
void OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant* grantOutbound, const char* strDest, ConnectionType conn_type);
213255
bool CheckIncomingNonce(uint64_t nonce);
214256

215257
bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func);
@@ -823,22 +865,22 @@ class CNode
823865
std::atomic_bool fPauseSend{false};
824866

825867
bool IsOutboundOrBlockRelayConn() const {
826-
switch(m_conn_type) {
827-
case ConnectionType::OUTBOUND:
868+
switch (m_conn_type) {
869+
case ConnectionType::OUTBOUND_FULL_RELAY:
828870
case ConnectionType::BLOCK_RELAY:
829871
return true;
830872
case ConnectionType::INBOUND:
831873
case ConnectionType::MANUAL:
832874
case ConnectionType::ADDR_FETCH:
833875
case ConnectionType::FEELER:
834876
return false;
835-
}
877+
} // no default case, so the compiler can warn about missing cases
836878

837879
assert(false);
838880
}
839881

840882
bool IsFullOutboundConn() const {
841-
return m_conn_type == ConnectionType::OUTBOUND;
883+
return m_conn_type == ConnectionType::OUTBOUND_FULL_RELAY;
842884
}
843885

844886
bool IsManualConn() const {
@@ -861,17 +903,23 @@ class CNode
861903
return m_conn_type == ConnectionType::INBOUND;
862904
}
863905

906+
/* Whether we send addr messages over this connection */
907+
bool RelayAddrsWithConn() const
908+
{
909+
return m_conn_type != ConnectionType::BLOCK_RELAY;
910+
}
911+
864912
bool ExpectServicesFromConn() const {
865-
switch(m_conn_type) {
913+
switch (m_conn_type) {
866914
case ConnectionType::INBOUND:
867915
case ConnectionType::MANUAL:
868916
case ConnectionType::FEELER:
869917
return false;
870-
case ConnectionType::OUTBOUND:
918+
case ConnectionType::OUTBOUND_FULL_RELAY:
871919
case ConnectionType::BLOCK_RELAY:
872920
case ConnectionType::ADDR_FETCH:
873921
return true;
874-
}
922+
} // no default case, so the compiler can warn about missing cases
875923

876924
assert(false);
877925
}
@@ -886,13 +934,11 @@ class CNode
886934

887935
// flood relay
888936
std::vector<CAddress> vAddrToSend;
889-
std::unique_ptr<CRollingBloomFilter> m_addr_known = nullptr;
937+
std::unique_ptr<CRollingBloomFilter> m_addr_known{nullptr};
890938
bool fGetAddr{false};
891939
std::chrono::microseconds m_next_addr_send GUARDED_BY(cs_sendProcessing){0};
892940
std::chrono::microseconds m_next_local_addr_send GUARDED_BY(cs_sendProcessing){0};
893941

894-
bool IsAddrRelayPeer() const { return m_addr_known != nullptr; }
895-
896942
// List of block ids we still have announce.
897943
// There is no final sorting before sending, as they are always sent immediately
898944
// and in the order requested.

src/net_processing.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -882,8 +882,9 @@ void PeerLogicValidation::InitializeNode(CNode *pnode) {
882882
LOCK(g_peer_mutex);
883883
g_peer_map.emplace_hint(g_peer_map.end(), nodeid, std::move(peer));
884884
}
885-
if(!pnode->IsInboundConn())
885+
if (!pnode->IsInboundConn()) {
886886
PushNodeVersion(*pnode, m_connman, GetTime());
887+
}
887888
}
888889

889890
void PeerLogicValidation::ReattemptInitialBroadcast(CScheduler& scheduler) const
@@ -1531,7 +1532,7 @@ static void RelayAddress(const CAddress& addr, bool fReachable, const CConnman&
15311532
assert(nRelayNodes <= best.size());
15321533

15331534
auto sortfunc = [&best, &hasher, nRelayNodes](CNode* pnode) {
1534-
if (pnode->IsAddrRelayPeer()) {
1535+
if (pnode->RelayAddrsWithConn()) {
15351536
uint64_t hashKey = CSipHasher(hasher).Write(pnode->GetId()).Finalize();
15361537
for (unsigned int i = 0; i < nRelayNodes; i++) {
15371538
if (hashKey > best[i].first) {
@@ -2017,7 +2018,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
20172018
}
20182019
}
20192020

2020-
if (!pfrom.fDisconnect && pfrom.IsOutboundOrBlockRelayConn() && nodestate->pindexBestKnownBlock != nullptr && pfrom.m_tx_relay != nullptr) {
2021+
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
20212022
// If this is an outbound full-relay peer, check to see if we should protect
20222023
// it from the bad/lagging chain logic.
20232024
// Note that block-relay-only peers are already implicitly protected, so we
@@ -2458,9 +2459,23 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
24582459
UpdatePreferredDownload(pfrom, State(pfrom.GetId()));
24592460
}
24602461

2461-
if (!pfrom.IsInboundConn() && pfrom.IsAddrRelayPeer())
2462-
{
2463-
// Advertise our address
2462+
if (!pfrom.IsInboundConn() && !pfrom.IsBlockOnlyConn()) {
2463+
// For outbound peers, we try to relay our address (so that other
2464+
// nodes can try to find us more quickly, as we have no guarantee
2465+
// that an outbound peer is even aware of how to reach us) and do a
2466+
// one-time address fetch (to help populate/update our addrman). If
2467+
// we're starting up for the first time, our addrman may be pretty
2468+
// empty and no one will know who we are, so these mechanisms are
2469+
// important to help us connect to the network.
2470+
//
2471+
// We also update the addrman to record connection success for
2472+
// these peers (which include OUTBOUND_FULL_RELAY and FEELER
2473+
// connections) so that addrman will have an up-to-date notion of
2474+
// which peers are online and available.
2475+
//
2476+
// We skip these operations for BLOCK_RELAY peers to avoid
2477+
// potentially leaking information about our BLOCK_RELAY
2478+
// connections via the addrman or address relay.
24642479
if (fListen && !::ChainstateActive().IsInitialBlockDownload())
24652480
{
24662481
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
@@ -2479,6 +2494,9 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
24792494
// Get recent addresses
24802495
m_connman.PushMessage(&pfrom, CNetMsgMaker(nSendVersion).Make(NetMsgType::GETADDR));
24812496
pfrom.fGetAddr = true;
2497+
2498+
// Moves address from New to Tried table in Addrman, resolves
2499+
// tried-table collisions, etc.
24822500
m_connman.MarkAddressGood(pfrom.addr);
24832501
}
24842502

@@ -2584,7 +2602,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
25842602
std::vector<CAddress> vAddr;
25852603
vRecv >> vAddr;
25862604

2587-
if (!pfrom.IsAddrRelayPeer()) {
2605+
if (!pfrom.RelayAddrsWithConn()) {
25882606
return;
25892607
}
25902608
if (vAddr.size() > MAX_ADDR_TO_SEND)
@@ -3522,7 +3540,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
35223540
LogPrint(BCLog::NET, "Ignoring \"getaddr\" from outbound connection. peer=%d\n", pfrom.GetId());
35233541
return;
35243542
}
3525-
if (!pfrom.IsAddrRelayPeer()) {
3543+
if (!pfrom.RelayAddrsWithConn()) {
35263544
LogPrint(BCLog::NET, "Ignoring \"getaddr\" from block-relay-only connection. peer=%d\n", pfrom.GetId());
35273545
return;
35283546
}
@@ -4122,15 +4140,15 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
41224140
int64_t nNow = GetTimeMicros();
41234141
auto current_time = GetTime<std::chrono::microseconds>();
41244142

4125-
if (pto->IsAddrRelayPeer() && !::ChainstateActive().IsInitialBlockDownload() && pto->m_next_local_addr_send < current_time) {
4143+
if (pto->RelayAddrsWithConn() && !::ChainstateActive().IsInitialBlockDownload() && pto->m_next_local_addr_send < current_time) {
41264144
AdvertiseLocal(pto);
41274145
pto->m_next_local_addr_send = PoissonNextSend(current_time, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
41284146
}
41294147

41304148
//
41314149
// Message: addr
41324150
//
4133-
if (pto->IsAddrRelayPeer() && pto->m_next_addr_send < current_time) {
4151+
if (pto->RelayAddrsWithConn() && pto->m_next_addr_send < current_time) {
41344152
pto->m_next_addr_send = PoissonNextSend(current_time, AVG_ADDRESS_BROADCAST_INTERVAL);
41354153
std::vector<CAddress> vAddr;
41364154
vAddr.reserve(pto->vAddrToSend.size());

src/test/denialofservice_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
8484

8585
// Mock an outbound peer
8686
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
87-
CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK|NODE_WITNESS), 0, INVALID_SOCKET, addr1, 0, 0, CAddress(), "", ConnectionType::OUTBOUND);
87+
CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), 0, INVALID_SOCKET, addr1, 0, 0, CAddress(), "", ConnectionType::OUTBOUND_FULL_RELAY);
8888
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
8989

9090
peerLogic->InitializeNode(&dummyNode1);
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
136136
static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerLogicValidation &peerLogic, CConnmanTest* connman)
137137
{
138138
CAddress addr(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
139-
vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK|NODE_WITNESS), 0, INVALID_SOCKET, addr, 0, 0, CAddress(), "", ConnectionType::OUTBOUND));
139+
vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), 0, INVALID_SOCKET, addr, 0, 0, CAddress(), "", ConnectionType::OUTBOUND_FULL_RELAY));
140140
CNode &node = *vNodes.back();
141141
node.SetSendVersion(PROTOCOL_VERSION);
142142

src/test/fuzz/net.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
4646
fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
4747
*address_bind,
4848
fuzzed_data_provider.ConsumeRandomLengthString(32),
49-
fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH})};
49+
fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND_FULL_RELAY, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH})};
5050
while (fuzzed_data_provider.ConsumeBool()) {
5151
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 12)) {
5252
case 0: {
@@ -147,7 +147,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
147147
const int ref_count = node.GetRefCount();
148148
assert(ref_count >= 0);
149149
(void)node.GetSendVersion();
150-
(void)node.IsAddrRelayPeer();
150+
(void)node.RelayAddrsWithConn();
151151

152152
const NetPermissionFlags net_permission_flags = fuzzed_data_provider.ConsumeBool() ?
153153
fuzzed_data_provider.PickValueInArray<NetPermissionFlags>({NetPermissionFlags::PF_NONE, NetPermissionFlags::PF_BLOOMFILTER, NetPermissionFlags::PF_RELAY, NetPermissionFlags::PF_FORCERELAY, NetPermissionFlags::PF_NOBAN, NetPermissionFlags::PF_MEMPOOL, NetPermissionFlags::PF_ISIMPLICIT, NetPermissionFlags::PF_ALL}) :

src/test/fuzz/process_message.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
6868
return;
6969
}
7070
CDataStream random_bytes_data_stream{fuzzed_data_provider.ConsumeRemainingBytes<unsigned char>(), SER_NETWORK, PROTOCOL_VERSION};
71-
CNode& p2p_node = *MakeUnique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_WITNESS | NODE_BLOOM), 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND).release();
71+
CNode& p2p_node = *MakeUnique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_WITNESS | NODE_BLOOM), 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND_FULL_RELAY).release();
7272
p2p_node.fSuccessfullyConnected = true;
7373
p2p_node.nVersion = PROTOCOL_VERSION;
7474
p2p_node.SetSendVersion(PROTOCOL_VERSION);

0 commit comments

Comments
 (0)