Add deterministic RandomX block header hashing

This commit is contained in:
Capri 2026-09-14 20:18:52 +00:00
commit 2431ea4588
Signed by: VextaProject
SSH key fingerprint: SHA256:739BZv8LvIDY2tR7lXLy/IQ6MaGTQtYcG9GNvCjmpVM
7 changed files with 84 additions and 8 deletions

View file

@ -750,7 +750,7 @@ vexta_cli_LDADD = \
$(LIBVEXTA_UTIL) \ $(LIBVEXTA_UTIL) \
$(LIBVEXTA_CRYPTO) $(LIBVEXTA_CRYPTO)
vexta_cli_LDADD += $(BOOST_LIBS) $(EVENT_LIBS) vexta_cli_LDADD += $(BOOST_LIBS) $(EVENT_LIBS) $(RANDOMX_LIBS)
# #
# digibyte-tx binary # # digibyte-tx binary #
@ -772,7 +772,7 @@ vexta_tx_LDADD = \
$(LIBVEXTA_CRYPTO) \ $(LIBVEXTA_CRYPTO) \
$(LIBSECP256K1) $(LIBSECP256K1)
vexta_tx_LDADD += $(BOOST_LIBS) vexta_tx_LDADD += $(BOOST_LIBS) $(RANDOMX_LIBS)
# #
# digibyte-wallet binary # # digibyte-wallet binary #
@ -806,7 +806,7 @@ vexta_util_LDADD = \
$(LIBVEXTA_CRYPTO) \ $(LIBVEXTA_CRYPTO) \
$(LIBSECP256K1) $(LIBSECP256K1)
vexta_util_LDADD += $(BOOST_LIBS) vexta_util_LDADD += $(BOOST_LIBS) $(RANDOMX_LIBS)
# #
# vextaconsensus library # # vextaconsensus library #
@ -844,7 +844,7 @@ if GLIBC_BACK_COMPAT
endif endif
libvextaconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) libvextaconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
libvextaconsensus_la_LIBADD = $(LIBSECP256K1) libvextaconsensus_la_LIBADD = $(LIBSECP256K1) $(RANDOMX_LIBS)
libvextaconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -I$(srcdir)/crypto/pq/mldsa65 -I$(srcdir)/crypto/pq/sphincsplus -DDILITHIUM_MODE=3 -DPARAMS=sphincs-sha2-128s -DVEXTA_PQ_VERIFY_ONLY -DBUILD_VEXTA_INTERNAL libvextaconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -I$(srcdir)/crypto/pq/mldsa65 -I$(srcdir)/crypto/pq/sphincsplus -DDILITHIUM_MODE=3 -DPARAMS=sphincs-sha2-128s -DVEXTA_PQ_VERIFY_ONLY -DBUILD_VEXTA_INTERNAL
libvextaconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libvextaconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libvextaconsensus_la_CFLAGS = $(AM_CFLAGS) $(PIE_FLAGS) libvextaconsensus_la_CFLAGS = $(AM_CFLAGS) $(PIE_FLAGS)

View file

@ -65,7 +65,8 @@ bench_bench_vexta_LDADD = \
$(LIBSECP256K1) \ $(LIBSECP256K1) \
$(LIBUNIVALUE) \ $(LIBUNIVALUE) \
$(EVENT_PTHREADS_LIBS) \ $(EVENT_PTHREADS_LIBS) \
$(EVENT_LIBS) $(EVENT_LIBS) \
$(RANDOMX_LIBS)
if ENABLE_ZMQ if ENABLE_ZMQ
bench_bench_vexta_LDADD += $(LIBVEXTA_ZMQ) $(ZMQ_LIBS) bench_bench_vexta_LDADD += $(LIBVEXTA_ZMQ) $(ZMQ_LIBS)

View file

@ -333,7 +333,7 @@ vexta_qt_ldadd += $(LIBVEXTA_ZMQ) $(ZMQ_LIBS)
endif endif
vexta_qt_ldadd += $(LIBVEXTA_CLI) $(LIBVEXTA_COMMON) $(LIBVEXTA_UTIL) $(LIBVEXTA_CONSENSUS) $(LIBVEXTA_PQ) $(LIBVEXTA_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) \ vexta_qt_ldadd += $(LIBVEXTA_CLI) $(LIBVEXTA_COMMON) $(LIBVEXTA_UTIL) $(LIBVEXTA_CONSENSUS) $(LIBVEXTA_PQ) $(LIBVEXTA_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) \
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \ $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS) $(RANDOMX_LIBS)
vexta_qt_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) vexta_qt_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
vexta_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX vexta_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX

View file

@ -51,7 +51,8 @@ FUZZ_SUITE_LD_COMMON = \
$(LIBMEMENV) \ $(LIBMEMENV) \
$(LIBSECP256K1) \ $(LIBSECP256K1) \
$(EVENT_LIBS) \ $(EVENT_LIBS) \
$(EVENT_PTHREADS_LIBS) $(EVENT_PTHREADS_LIBS) \
$(RANDOMX_LIBS)
if USE_UPNP if USE_UPNP
FUZZ_SUITE_LD_COMMON += $(MINIUPNPC_LIBS) FUZZ_SUITE_LD_COMMON += $(MINIUPNPC_LIBS)
@ -188,7 +189,7 @@ test_test_digibyte_LDADD += $(LIBVEXTA_SERVER) $(LIBVEXTA_CLI) $(LIBVEXTA_COMMON
$(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS)
test_test_digibyte_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) test_test_digibyte_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
test_test_digibyte_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) test_test_digibyte_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(RANDOMX_LIBS)
test_test_digibyte_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) -static test_test_digibyte_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) -static
if ENABLE_ZMQ if ENABLE_ZMQ

View file

@ -5,11 +5,14 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <primitives/block.h> #include <primitives/block.h>
#include <crypto/randomx_hash.h>
#include <crypto/common.h> #include <crypto/common.h>
#include <consensus/consensus.h> #include <consensus/consensus.h>
#include <chainparams.h> #include <chainparams.h>
#include <hash.h> #include <hash.h>
#include <streams.h>
#include <tinyformat.h> #include <tinyformat.h>
#include <version.h>
#include <arith_uint256.h> #include <arith_uint256.h>
uint256 CBlockHeader::GetHash() const uint256 CBlockHeader::GetHash() const
@ -36,6 +39,25 @@ uint256 CBlockHeader::GetPoWAlgoHash(const Consensus::Params& params) const
return GetHash(); return GetHash();
} }
uint256 CBlockHeader::GetRandomXPoWHash(const uint256& seed) const
{
CDataStream stream(SER_GETHASH, PROTOCOL_VERSION);
stream << *this;
uint256 result;
if (!VextaRandomXHash(
stream.data(),
stream.size(),
seed.data(),
seed.size(),
result.begin())) {
result.SetNull();
}
return result;
}
std::string CBlock::ToString(const Consensus::Params& params) const std::string CBlock::ToString(const Consensus::Params& params) const
{ {
std::stringstream s; std::stringstream s;

View file

@ -96,6 +96,14 @@ public:
uint256 GetPoWAlgoHash(const Consensus::Params& params) const; uint256 GetPoWAlgoHash(const Consensus::Params& params) const;
/**
* Calculate the RandomX proof-of-work hash using an explicit seed key.
*
* The input is the canonical serialized 80-byte block header.
* The seed is supplied in raw uint256 serialization byte order.
*/
uint256 GetRandomXPoWHash(const uint256& seed) const;
int64_t GetBlockTime() const int64_t GetBlockTime() const
{ {
return (int64_t)nTime; return (int64_t)nTime;

View file

@ -9,6 +9,7 @@
#include <chainparams.h> #include <chainparams.h>
#include <pow.h> #include <pow.h>
#include <primitives/block.h> #include <primitives/block.h>
#include <util/strencodings.h>
#include <test/util/setup_common.h> #include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
@ -558,4 +559,47 @@ BOOST_AUTO_TEST_CASE(RandomX_seed_height_test)
BOOST_CHECK_EQUAL(GetRandomXSeedHeight(128, consensus), 120); BOOST_CHECK_EQUAL(GetRandomXSeedHeight(128, consensus), 120);
} }
BOOST_AUTO_TEST_CASE(RandomX_header_hash_vector_test)
{
CBlockHeader header;
header.nVersion = BLOCK_VERSION_DEFAULT | BLOCK_VERSION_RANDOMX;
header.hashPrevBlock = uint256S("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f");
header.hashMerkleRoot = uint256S("f0e0d0c0b0a090807060504030201000ffeeddccbbaa99887766554433221100");
header.nTime = 0x12345678;
header.nBits = 0x1d00ffff;
header.nNonce = 0x89abcdef;
const uint256 seed =
uint256S("00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f");
CDataStream stream(SER_GETHASH, PROTOCOL_VERSION);
stream << header;
BOOST_REQUIRE_EQUAL(stream.size(), 80U);
const std::vector<unsigned char> headerBytes(stream.begin(), stream.end());
const std::vector<unsigned char> seedBytes(seed.begin(), seed.end());
BOOST_CHECK_EQUAL(
HexStr(headerBytes),
"020400001f1e1d1c1b1a191817161514131211100f0e0d0c0b0a0908070605040302010000112233445566778899aabbccddeeff00102030405060708090a0b0c0d0e0f078563412ffff001defcdab89");
BOOST_CHECK_EQUAL(
HexStr(seedBytes),
"0ffeeddccbbaa9988776655443322110ffeeddccbbaa99887766554433221100");
const uint256 randomXHash = header.GetRandomXPoWHash(seed);
BOOST_CHECK_EQUAL(
randomXHash.ToString(),
"a694ce64be1245187466b2027afceb32c99b57bd21164dec2913b390f68c653c");
const std::vector<unsigned char> hashBytes(randomXHash.begin(), randomXHash.end());
BOOST_CHECK_EQUAL(
HexStr(hashBytes),
"3c658cf690b31329ec4d1621bd579bc932ebfc7a02b26674184512be64ce94a6");
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()