diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 3fa3642..27951ad 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -863,6 +863,10 @@ static RPCHelpMan getblocktemplate() {RPCResult::Type::NUM_TIME, "curtime", "current timestamp in " + UNIX_EPOCH_TIME}, {RPCResult::Type::STR, "bits", "compressed target of next block"}, {RPCResult::Type::NUM, "height", "The height of the next block"}, + {RPCResult::Type::NUM, "pow_algo_id", "Mining algorithm id: 0 for SHA256D, 1 for RandomX"}, + {RPCResult::Type::STR, "pow_algo", "Mining algorithm name: sha256d or randomx"}, + {RPCResult::Type::NUM, "randomx_seed_height", /* optional */ true, "Height of the block used as the RandomX seed source"}, + {RPCResult::Type::STR_HEX, "randomx_seed", /* optional */ true, "RandomX seed key in raw uint256 byte order"}, {RPCResult::Type::STR, "default_witness_commitment", /* optional */ true, "a valid witness commitment for the unmodified block template"}, }}, }, @@ -1212,6 +1216,31 @@ static RPCHelpMan getblocktemplate() result.pushKV("bits", strprintf("%08x", pblock->nBits)); result.pushKV("height", (int64_t)(pindexPrev->nHeight+1)); + result.pushKV("pow_algo_id", algo); + result.pushKV("pow_algo", GetMiningAlgoName(algo)); + + if (algo == ALGO_RANDOMX) { + const int blockHeight = pindexPrev->nHeight + 1; + const int seedHeight = + GetRandomXSeedHeight(blockHeight, consensusParams); + + uint256 randomxSeed; + if (!GetRandomXSeed( + pindexPrev, + blockHeight, + consensusParams, + randomxSeed)) { + throw JSONRPCError( + RPC_INTERNAL_ERROR, + "Failed to resolve RandomX seed"); + } + + result.pushKV("randomx_seed_height", seedHeight); + result.pushKV( + "randomx_seed", + HexStr(MakeUCharSpan(randomxSeed))); + } + if (consensusParams.signet_blocks) { result.pushKV("signet_challenge", HexStr(consensusParams.signet_challenge)); } diff --git a/test/functional/mining_randomx_gbt.py b/test/functional/mining_randomx_gbt.py index 2046525..5578d29 100755 --- a/test/functional/mining_randomx_gbt.py +++ b/test/functional/mining_randomx_gbt.py @@ -56,6 +56,10 @@ class RandomXGetBlockTemplateTest(DigiByteTestFramework): sha_template["version"] & BLOCK_VERSION_ALGO, BLOCK_VERSION_SHA256D, ) + assert_equal(sha_template["pow_algo_id"], 0) + assert_equal(sha_template["pow_algo"], "sha256d") + assert "randomx_seed_height" not in sha_template + assert "randomx_seed" not in sha_template self.log.info("Mining RPC reports only SHA256D before activation") mining_info = node.getmininginfo() @@ -130,6 +134,14 @@ class RandomXGetBlockTemplateTest(DigiByteTestFramework): randomx_template["version"] & BLOCK_VERSION_ALGO, BLOCK_VERSION_RANDOMX, ) + assert_equal(randomx_template["pow_algo_id"], 1) + assert_equal(randomx_template["pow_algo"], "randomx") + assert_equal(randomx_template["randomx_seed_height"], 0) + + genesis_hash = node.getblockhash(0) + expected_randomx_seed = bytes.fromhex(genesis_hash)[::-1].hex() + assert_equal(randomx_template["randomx_seed"], expected_randomx_seed) + assert_equal(len(randomx_template["randomx_seed"]), 64) self.log.info("Default GBT remains SHA256D after RandomX activation") sha_template = node.getblocktemplate(NORMAL_GBT_REQUEST_PARAMS) @@ -138,6 +150,10 @@ class RandomXGetBlockTemplateTest(DigiByteTestFramework): sha_template["version"] & BLOCK_VERSION_ALGO, BLOCK_VERSION_SHA256D, ) + assert_equal(sha_template["pow_algo_id"], 0) + assert_equal(sha_template["pow_algo"], "sha256d") + assert "randomx_seed_height" not in sha_template + assert "randomx_seed" not in sha_template self.log.info("Mining RPC exposes SHA256D and RandomX at activation") mining_info = node.getmininginfo()