From baf13781e4eecb3ec05640973ffac25a7723b345 Mon Sep 17 00:00:00 2001 From: SChernykh <15806605+SChernykh@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:04:16 +0200 Subject: [PATCH] P2P: use a separate peer id for .onion peers --- src/p2p_server.cpp | 10 +++++----- src/p2p_server.h | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index e880a41..1eb033d 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -87,6 +87,7 @@ P2PServer::P2PServer(p2pool* pool) m_rng.discard(10000); m_peerId = m_rng(); + m_peerId_TOR = m_rng(); const Params& params = pool->params(); @@ -321,9 +322,8 @@ void P2PServer::update_peer_connections() connected_clients.reserve(m_numConnections); for (P2PClient* client = static_cast(m_connectedClientsList->m_next); client != m_connectedClientsList; client = static_cast(client->m_next)) { const int timeout = client->m_handshakeComplete ? 300 : 10; - if (cur_time >= client->m_lastAlive + timeout) { - const Client::Socks5ProxyState s = client->m_socks5ProxyState; - if ((s == Client::Socks5ProxyState::Default) || (s == Client::Socks5ProxyState::ConnectRequestSent)) { + if (client->m_lastAlive && (cur_time >= client->m_lastAlive + timeout)) { + if (client->m_socks5ProxyState == Client::Socks5ProxyState::Default) { const uint64_t idle_time = static_cast(cur_time - client->m_lastAlive); LOGWARN(5, "peer " << static_cast(client->m_addrString) << " has been idle for " << idle_time << " seconds, disconnecting"); client->close(); @@ -2173,7 +2173,7 @@ bool P2PServer::P2PClient::send_handshake_challenge() k >>= 8; } - k = owner->get_peerId(); + k = owner->get_peerId((m_addressType == AddressType::DomainName) && (strstr(m_addrString, ".onion:"))); memcpy(p, &k, sizeof(uint64_t)); p += sizeof(uint64_t); @@ -2366,7 +2366,7 @@ bool P2PServer::P2PClient::on_handshake_challenge(const uint8_t* buf) uint64_t peer_id; memcpy(&peer_id, buf + CHALLENGE_SIZE, sizeof(uint64_t)); - if (peer_id == server->get_peerId()) { + if ((peer_id == server->get_peerId(false)) || (peer_id == server->get_peerId(true))) { LOGWARN(5, "tried to connect to self at " << static_cast(m_addrString)); return false; } diff --git a/src/p2p_server.h b/src/p2p_server.h index 9b5b7a4..05db10e 100644 --- a/src/p2p_server.h +++ b/src/p2p_server.h @@ -189,7 +189,7 @@ public: void broadcast(const PoolBlock& block, const PoolBlock* parent); [[nodiscard]] uint64_t get_random64(); - [[nodiscard]] uint64_t get_peerId() const { return m_peerId; } + [[nodiscard]] uint64_t get_peerId(bool is_tor) const { return is_tor ? m_peerId_TOR : m_peerId; } void print_status() override; void show_peers_async(); @@ -268,6 +268,7 @@ private: uint64_t m_timerInterval; uint64_t m_peerId; + uint64_t m_peerId_TOR; mutable uv_mutex_t m_peerListLock;