Add deterministic RandomX block header hashing
This commit is contained in:
parent
7ca340c248
commit
2431ea4588
7 changed files with 84 additions and 8 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue