Add algorithm-aware mining difficulty

This commit is contained in:
Capri 2026-09-17 18:31:43 +00:00
commit 37d4ae0d1b
Signed by: VextaProject
SSH key fingerprint: SHA256:739BZv8LvIDY2tR7lXLy/IQ6MaGTQtYcG9GNvCjmpVM
4 changed files with 92 additions and 3 deletions

View file

@ -137,11 +137,46 @@ double GetDifficulty(const CBlockIndex* blockindex)
return dDiff; return dDiff;
} }
double GetAlgoDifficulty(
const CBlockIndex* blockindex,
const Consensus::Params& consensusParams,
int algo)
{
assert(blockindex != nullptr);
if (algo == ALGO_SHA256D) {
return GetDifficulty(blockindex);
}
if (algo != ALGO_RANDOMX) {
return 0.0;
}
bool negative;
bool overflow;
arith_uint256 target;
target.SetCompact(blockindex->nBits, &negative, &overflow);
if (negative || overflow || target == 0) {
return 0.0;
}
const arith_uint256 reference =
UintToArith256(consensusParams.randomXInitialTarget);
if (reference == 0) {
return 0.0;
}
return reference.getdouble() / target.getdouble();
}
static double GetNextDifficulty(const CBlockIndex* tip, const Consensus::Params& consensusParams, int algo) static double GetNextDifficulty(const CBlockIndex* tip, const Consensus::Params& consensusParams, int algo)
{ {
CBlockIndex next; CBlockIndex next;
next.nBits = GetNextWorkRequired(tip, nullptr, consensusParams, algo); next.nBits = GetNextWorkRequired(tip, nullptr, consensusParams, algo);
return GetDifficulty(&next); return GetAlgoDifficulty(&next, consensusParams, algo);
} }
static int ComputeNextBlockAndDepth(const CBlockIndex* tip, const CBlockIndex* blockindex, const CBlockIndex*& next) static int ComputeNextBlockAndDepth(const CBlockIndex* tip, const CBlockIndex* blockindex, const CBlockIndex*& next)

View file

@ -26,6 +26,10 @@ class ChainstateManager;
class UniValue; class UniValue;
struct NodeContext; struct NodeContext;
namespace Consensus {
struct Params;
}
static constexpr int NUM_GETBLOCKSTATS_PERCENTILES = 5; static constexpr int NUM_GETBLOCKSTATS_PERCENTILES = 5;
/** /**
@ -36,6 +40,17 @@ static constexpr int NUM_GETBLOCKSTATS_PERCENTILES = 5;
*/ */
double GetDifficulty(const CBlockIndex* blockindex); double GetDifficulty(const CBlockIndex* blockindex);
/**
* Get difficulty for a specific mining algorithm.
*
* SHA256D preserves the legacy GetDifficulty() scale.
* RandomX uses randomXInitialTarget as difficulty 1.0.
*/
double GetAlgoDifficulty(
const CBlockIndex* blockindex,
const Consensus::Params& consensusParams,
int algo);
/** Callback for when block tip changed. */ /** Callback for when block tip changed. */
void RPCNotifyBlockChange(const CBlockIndex*); void RPCNotifyBlockChange(const CBlockIndex*);

View file

@ -678,9 +678,15 @@ static RPCHelpMan getmininginfo()
GetNextWorkRequired(tip, nullptr, consensusParams, ALGO_RANDOMX); GetNextWorkRequired(tip, nullptr, consensusParams, ALGO_RANDOMX);
const double sha_difficulty = const double sha_difficulty =
GetDifficulty(&sha_next); GetAlgoDifficulty(
&sha_next,
consensusParams,
ALGO_SHA256D);
const double randomx_difficulty = const double randomx_difficulty =
GetDifficulty(&randomx_next); GetAlgoDifficulty(
&randomx_next,
consensusParams,
ALGO_RANDOMX);
difficulties.pushKV( difficulties.pushKV(
GetMiningAlgoName(ALGO_SHA256D), GetMiningAlgoName(ALGO_SHA256D),

View file

@ -7,6 +7,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <chain.h> #include <chain.h>
#include <chainparams.h>
#include <pow.h>
#include <rpc/blockchain.h> #include <rpc/blockchain.h>
#include <test/util/setup_common.h> #include <test/util/setup_common.h>
#include <util/string.h> #include <util/string.h>
@ -74,4 +76,35 @@ BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target)
TestDifficulty(0x12345678, 5913134931067755359633408.0); TestDifficulty(0x12345678, 5913134931067755359633408.0);
} }
BOOST_AUTO_TEST_CASE(get_algo_difficulty)
{
const auto chainParams =
CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
const auto& consensus = chainParams->GetConsensus();
CBlockIndex sha;
sha.nBits = UintToArith256(consensus.powLimit).GetCompact();
BOOST_CHECK_EQUAL(
GetAlgoDifficulty(&sha, consensus, ALGO_SHA256D),
GetDifficulty(&sha));
CBlockIndex randomx;
randomx.nBits =
UintToArith256(consensus.randomXInitialTarget).GetCompact();
RejectDifficultyMismatch(
GetAlgoDifficulty(&randomx, consensus, ALGO_RANDOMX),
1.0);
arith_uint256 harderRandomXTarget =
UintToArith256(consensus.randomXInitialTarget);
harderRandomXTarget /= 2;
randomx.nBits = harderRandomXTarget.GetCompact();
RejectDifficultyMismatch(
GetAlgoDifficulty(&randomx, consensus, ALGO_RANDOMX),
2.0);
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()