From 8e7df958b85bf270cf81eddb1d1430a9e2b1d324 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Thu, 12 Jan 2023 10:07:35 +0100 Subject: [PATCH] Use extra_nonce to signal hardfork readiness --- src/miner.cpp | 2 +- src/pool_block.h | 16 +++++++++++++++- src/stratum_server.cpp | 4 ++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 49d9fd9..2b33245 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -47,7 +47,7 @@ Miner::Miner(p2pool* pool, uint32_t threads) , m_jobIndex{ 0 } { std::random_device rd; - m_extraNonce = static_cast(rd()); + m_extraNonce = PoolBlock::signal_v2_readiness(static_cast(rd())); on_block(m_pool->block_template()); diff --git a/src/pool_block.h b/src/pool_block.h index 343909b..8a1d1fd 100644 --- a/src/pool_block.h +++ b/src/pool_block.h @@ -152,12 +152,26 @@ struct PoolBlock // but P2Pool can switch to using only TXOUT_TO_TAGGED_KEY for miner payouts starting from v15 FORCEINLINE uint8_t get_tx_type() const { return (m_majorVersion < HARDFORK_VIEW_TAGS_VERSION) ? TXOUT_TO_KEY : TXOUT_TO_TAGGED_KEY; } + static constexpr int VERSION2_TIMESTAMP = 1679173200; + + // Signal hardfork readiness (only before the v2 hardfork) + // TODO: remove this code after hardfork + FORCEINLINE static uint32_t signal_v2_readiness(uint32_t extra_nonce) + { + if (time(nullptr) < PoolBlock::VERSION2_TIMESTAMP) { + extra_nonce |= 0xFF000000UL; + extra_nonce &= ~0x00100000UL; + return extra_nonce; + } + return extra_nonce; + } + FORCEINLINE int get_sidechain_version() const { // P2Pool forks to v2 at 2023-03-18 21:00 UTC // Different miners can have different timestamps, // so a temporary mix of v1 and v2 blocks is allowed - return (m_timestamp >= 1679173200) ? 2 : 1; + return (m_timestamp >= VERSION2_TIMESTAMP) ? 2 : 1; } typedef std::array full_id; diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index bc22cdb..366bf11 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -60,7 +60,7 @@ StratumServer::StratumServer(p2pool* pool) // Diffuse the initial state in case it has low quality m_rng.discard(10000); - m_extraNonce = static_cast(m_rng()); + m_extraNonce = PoolBlock::signal_v2_readiness(static_cast(m_rng())); m_hashrateData[0] = { seconds_since_epoch(), 0 }; @@ -107,7 +107,7 @@ void StratumServer::on_block(const BlockTemplate& block) return; } - const uint32_t extra_nonce_start = static_cast(get_random64()); + const uint32_t extra_nonce_start = PoolBlock::signal_v2_readiness(static_cast(get_random64())); m_extraNonce.exchange(extra_nonce_start + num_connections); BlobsData* blobs_data = new BlobsData{};