From f3024d35567e56581c0967f24ca1fa25c7f35df7 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Wed, 13 Oct 2021 18:57:21 +0200 Subject: [PATCH] StratumServer: submit Monero block as soon as possible 1-3 ms saved when a block is found --- src/block_template.cpp | 19 +++++++++++++ src/block_template.h | 1 + src/stratum_server.cpp | 61 ++++++++++++++++++++++++------------------ src/stratum_server.h | 1 + 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/block_template.cpp b/src/block_template.cpp index 0115ee7..212bf2a 100644 --- a/src/block_template.cpp +++ b/src/block_template.cpp @@ -838,6 +838,25 @@ void BlockTemplate::calc_merkle_tree_main_branch() } } +bool BlockTemplate::get_difficulties(const uint32_t template_id, difficulty_type& mainchain_difficulty, difficulty_type& sidechain_difficulty) const +{ + ReadLock lock(m_lock); + + if (template_id == m_templateId) { + mainchain_difficulty = m_difficulty; + sidechain_difficulty = m_poolBlockTemplate->m_difficulty; + return true; + } + + const BlockTemplate* old = m_oldTemplates[template_id % array_size(m_oldTemplates)]; + + if (old && (template_id == old->m_templateId)) { + return old->get_difficulties(template_id, mainchain_difficulty, sidechain_difficulty); + } + + return false; +} + uint32_t BlockTemplate::get_hashing_blob(const uint32_t template_id, uint32_t extra_nonce, uint8_t (&blob)[128], uint64_t& height, difficulty_type& difficulty, difficulty_type& sidechain_difficulty, hash& seed_hash, size_t& nonce_offset) const { ReadLock lock(m_lock); diff --git a/src/block_template.h b/src/block_template.h index 730d0c2..069f76a 100644 --- a/src/block_template.h +++ b/src/block_template.h @@ -40,6 +40,7 @@ public: void update(const MinerData& data, const Mempool& mempool, Wallet* miner_wallet); + bool get_difficulties(const uint32_t template_id, difficulty_type& mainchain_difficulty, difficulty_type& sidechain_difficulty) const; uint32_t get_hashing_blob(const uint32_t template_id, uint32_t extra_nonce, uint8_t (&blob)[128], uint64_t& height, difficulty_type& difficulty, difficulty_type& sidechain_difficulty, hash& seed_hash, size_t& nonce_offset) const; uint32_t get_hashing_blob(uint32_t extra_nonce, uint8_t (&blob)[128], uint64_t& height, difficulty_type& difficulty, difficulty_type& sidechain_difficulty, hash& seed_hash, size_t& nonce_offset, uint32_t& template_id) const; diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index e24e9b0..1dd99f6 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -319,6 +319,26 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo } if (found) { + BlockTemplate& block = m_pool->block_template(); + difficulty_type mainchain_diff, sidechain_diff; + + if (!block.get_difficulties(template_id, mainchain_diff, sidechain_diff)) { + LOGWARN(4, "client " << static_cast(client->m_addrString) << " got a stale share"); + return send(client, + [id](void* buf) + { + log::Stream s(reinterpret_cast(buf)); + s << "{\"id\":" << id << ",\"jsonrpc\":\"2.0\",\"error\":{\"message\":\"Stale share\"}}\n"; + return s.m_pos; + }); + } + + if (mainchain_diff.check_pow(resultHash)) { + LOGINFO(0, log::Green() << "client " << static_cast(client->m_addrString) << " found a mainchain block, submitting it"); + m_pool->submit_block_async(template_id, nonce, extra_nonce); + block.update_tx_keys(); + } + SubmittedShare* share; { @@ -345,6 +365,7 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo share->m_extraNonce = extra_nonce; share->m_target = target; share->m_resultHash = resultHash; + share->m_sidechainDifficulty = sidechain_diff; const int err = uv_queue_work(&m_loop, &share->m_req, on_share_found, on_after_share_found); if (err) { @@ -571,7 +592,6 @@ void StratumServer::on_share_found(uv_work_t* req) StratumClient* client = share->m_client; StratumServer* server = share->m_server; p2pool* pool = server->m_pool; - BlockTemplate& block = pool->block_template(); uint64_t target = share->m_target; if (target >= TARGET_4_BYTES_LIMIT) { @@ -582,24 +602,21 @@ void StratumServer::on_share_found(uv_work_t* req) LOGWARN(0, "p2pool is shutting down, but a share was found. Trying to process it anyway!"); } - uint8_t blob[128]; - uint64_t height; - difficulty_type difficulty; - difficulty_type sidechain_difficulty; - hash seed_hash; - size_t nonce_offset; + if (share->m_sidechainDifficulty.check_pow(share->m_resultHash)) { + uint8_t blob[128]; + uint64_t height; + difficulty_type difficulty; + difficulty_type sidechain_difficulty; + hash seed_hash; + size_t nonce_offset; - const uint32_t blob_size = block.get_hashing_blob(share->m_templateId, share->m_extraNonce, blob, height, difficulty, sidechain_difficulty, seed_hash, nonce_offset); - if (!blob_size) { - LOGWARN(4, "client " << static_cast(client->m_addrString) << " got a stale share"); - share->m_result = SubmittedShare::Result::STALE; - return; - } + const uint32_t blob_size = pool->block_template().get_hashing_blob(share->m_templateId, share->m_extraNonce, blob, height, difficulty, sidechain_difficulty, seed_hash, nonce_offset); + if (!blob_size) { + LOGWARN(4, "client " << static_cast(client->m_addrString) << " got a stale share"); + share->m_result = SubmittedShare::Result::STALE; + return; + } - const bool mainchain_solution = difficulty.check_pow(share->m_resultHash); - const bool sidechain_solution = sidechain_difficulty.check_pow(share->m_resultHash); - - if (mainchain_solution || sidechain_solution) { for (uint32_t i = 0, nonce = share->m_nonce; i < sizeof(share->m_nonce); ++i) { blob[nonce_offset + i] = nonce & 255; nonce >>= 8; @@ -630,15 +647,7 @@ void StratumServer::on_share_found(uv_work_t* req) ++server->m_totalFoundShares; LOGINFO(0, log::Green() << "SHARE FOUND: mainchain height " << height << ", diff " << sidechain_difficulty << ", effort " << effort << '%'); - - if (mainchain_solution) { - pool->submit_block_async(share->m_templateId, share->m_nonce, share->m_extraNonce); - block.update_tx_keys(); - } - - if (sidechain_solution) { - pool->submit_sidechain_block(share->m_templateId, share->m_nonce, share->m_extraNonce); - } + pool->submit_sidechain_block(share->m_templateId, share->m_nonce, share->m_extraNonce); } // Send the response to miner diff --git a/src/stratum_server.h b/src/stratum_server.h index eed7bfc..99d6018 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -121,6 +121,7 @@ private: uint32_t m_extraNonce; uint64_t m_target; hash m_resultHash; + difficulty_type m_sidechainDifficulty; enum class Result { STALE,