Feature: broadcast all new Monero blocks through p2pool network for faster propagation

This commit is contained in:
sech1
2025-09-03 10:07:39 +02:00
parent c5fba9992e
commit 50634e5e79
11 changed files with 519 additions and 9 deletions
+25 -2
View File
@@ -40,8 +40,9 @@ static constexpr uint32_t PROTOCOL_VERSION_1_0 = 0x00010000UL;
static constexpr uint32_t PROTOCOL_VERSION_1_1 = 0x00010001UL;
static constexpr uint32_t PROTOCOL_VERSION_1_2 = 0x00010002UL;
static constexpr uint32_t PROTOCOL_VERSION_1_3 = 0x00010003UL;
static constexpr uint32_t PROTOCOL_VERSION_1_4 = 0x00010004UL;
static constexpr uint32_t SUPPORTED_PROTOCOL_VERSION = PROTOCOL_VERSION_1_3;
static constexpr uint32_t SUPPORTED_PROTOCOL_VERSION = PROTOCOL_VERSION_1_4;
class P2PServer : public TCPServer
{
@@ -59,7 +60,9 @@ public:
BLOCK_NOTIFY,
// Donation messages are signed by author's private keys to prevent their abuse/misuse.
AUX_JOB_DONATION,
LAST = AUX_JOB_DONATION,
// Broadcast 3rd-party Monero blocks to make the whole Monero network faster
MONERO_BLOCK_BROADCAST,
LAST = MONERO_BLOCK_BROADCAST,
};
explicit P2PServer(p2pool *pool);
@@ -118,6 +121,7 @@ public:
void on_peer_list_response(const uint8_t* buf);
void on_block_notify(const uint8_t* buf);
[[nodiscard]] bool on_aux_job_donation(const uint8_t* buf, uint32_t size);
[[nodiscard]] bool on_monero_block_broadcast(const uint8_t* buf, uint32_t size);
[[nodiscard]] bool handle_incoming_block_async(const PoolBlock* block, uint64_t max_time_delta = 0);
static void handle_incoming_block(p2pool* pool, PoolBlock& block, std::vector<hash>& missing_blocks, bool& result);
@@ -212,6 +216,12 @@ public:
void broadcast_aux_job_donation(const uint8_t* data, uint32_t data_size, uint64_t timestamp, const P2PClient* source, bool duplicate_check_done);
void broadcast_monero_block_async(std::vector<uint8_t>&& blob);
void broadcast_monero_block_handler();
void broadcast_monero_block(const uint8_t* data, uint32_t data_size, const P2PClient* source, bool duplicate_check_done);
bool store_monero_block_broadcast(const uint8_t* data, uint32_t data_size);
private:
[[nodiscard]] const char* get_log_category() const override;
@@ -307,12 +317,16 @@ private:
enum {
AUX_JOB_TIMEOUT = 3600,
MONERO_BROADCAST_TIMEOUT = 3600 * 6,
};
unordered_set<std::pair<uint64_t, uint64_t>> m_auxJobMessages;
std::vector<uint8_t> m_auxJobLastMessage;
uint64_t m_auxJobLastMessageTimestamp;
uv_mutex_t m_MoneroBlockBroadcastsLock;
unordered_map<uint64_t, uint64_t> m_MoneroBlockBroadcasts;
void send_aux_job_donation(P2PServer::P2PClient* client, const uint8_t* data, uint32_t data_size);
void clean_aux_job_messages();
@@ -332,6 +346,15 @@ private:
static void on_aux_job_broadcast(uv_async_t* handle) { reinterpret_cast<P2PServer*>(handle->data)->broadcast_aux_job_donation_handler(); }
void broadcast_aux_job_donation_handler();
#endif
uv_mutex_t m_BroadcastMoneroBlockLock;
std::vector<uint8_t> m_MoneroBlockToBroadcast;
uv_async_t m_BroadcastMoneroBlockAsync;
static void on_monero_block_broadcast(uv_async_t* handle) { reinterpret_cast<P2PServer*>(handle->data)->broadcast_monero_block_handler(); }
void clean_monero_block_broadcasts();
};
} // namespace p2pool