From dc8bc028a6db271ea71f49fc5c29a4926907fb02 Mon Sep 17 00:00:00 2001 From: selsta Date: Sun, 21 Jun 2026 17:04:21 +0200 Subject: [PATCH] cryptonote: scope 202612 PoW workaround The block 202612 PoW workaround previously applied to any block at height 202612. Restrict it to the object hashes of the known historical mainnet, testnet, and stagenet block hashing blobs so new chains do not inherit the fixed PoW hash, which would prevent sync or mining past that height if their difficulty is higher. Reported-by: DataHoarder Co-authored-by: jeffro256 --- .../cryptonote_format_utils.cpp | 36 +++++- tests/data/blocks/block_202612_mainnet.bin | Bin 0 -> 16672 bytes tests/data/blocks/block_202612_stagenet.bin | Bin 0 -> 129 bytes tests/data/blocks/block_202612_testnet.bin | Bin 0 -> 244 bytes tests/unit_tests/cryptonote_format_utils.cpp | 111 ++++++++++++++++++ 5 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 tests/data/blocks/block_202612_mainnet.bin create mode 100644 tests/data/blocks/block_202612_stagenet.bin create mode 100644 tests/data/blocks/block_202612_testnet.bin diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp index 5447584f9..ce0982ec4 100644 --- a/src/cryptonote_basic/cryptonote_format_utils.cpp +++ b/src/cryptonote_basic/cryptonote_format_utils.cpp @@ -1598,6 +1598,32 @@ namespace cryptonote return get_tx_tree_hash(txs_ids); } //--------------------------------------------------------------- + static bool get_block_longhash_202612(const blobdata_ref block_hashing_blob, crypto::hash &res) + { + static constexpr const char longhash_202612[] = "84f64766475d51837ac9efbef1926486e58563c95a19fef4aec3254f03000000"; + // Object hashes of get_block_hashing_blob(block). The mainnet value differs + // from the public block id because calculate_block_hash() replaces that id. + static constexpr const char * const block_hashing_blob_ids_202612[] = + { + "426d16cff04c71f8b16340b722dc4010a2dd3831c22041431f772547ba6e331a", // mainnet + "248fde4b96b829c4ddbd00e3f76d35b03d01257898bc1b5578bc9e04b379a676", // testnet + "f3449e658b5f880c4b0e69007ed5d092c9c883ac3a518166fa652d5cc505e7b1", // stagenet + }; + + crypto::hash block_id; + const blobdata block_hashing_blob_copy(block_hashing_blob.data(), block_hashing_blob.size()); + get_object_hash(block_hashing_blob_copy, block_id); + const std::string block_id_hex = string_tools::pod_to_hex(block_id); + for (const char * const expected_block_id: block_hashing_blob_ids_202612) + { + if (block_id_hex == expected_block_id) + { + return epee::string_tools::hex_to_pod(longhash_202612, res); + } + } + return false; + } + //--------------------------------------------------------------- crypto::hash get_block_longhash(const blobdata_ref block_hashing_blob, const uint64_t height, const uint8_t major_version, @@ -1605,12 +1631,10 @@ namespace cryptonote { crypto::hash res; - if (height == 202612) // block 202612 bug workaround - { - static const std::string longhash_202612 = "84f64766475d51837ac9efbef1926486e58563c95a19fef4aec3254f03000000"; - epee::string_tools::hex_to_pod(longhash_202612, res); - } - else if (major_version >= RX_BLOCK_VERSION) // RandomX + if (height == 202612 && get_block_longhash_202612(block_hashing_blob, res)) + return res; + + if (major_version >= RX_BLOCK_VERSION) // RandomX { crypto::rx_slow_hash(seed_hash.data, block_hashing_blob.data(), block_hashing_blob.size(), res.data); } diff --git a/tests/data/blocks/block_202612_mainnet.bin b/tests/data/blocks/block_202612_mainnet.bin new file mode 100644 index 0000000000000000000000000000000000000000..b2e81a3e2ca61f5e2371096f28c3affea7e2c627 GIT binary patch literal 16672 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 literal 0 HcmV?d00001 diff --git a/tests/data/blocks/block_202612_stagenet.bin b/tests/data/blocks/block_202612_stagenet.bin new file mode 100644 index 0000000000000000000000000000000000000000..a282cc762b94f3f3e1d5ac5d9e7def9aa4a715a6 GIT binary patch literal 129 zcmV-{0Dk`o3Dkg}-v!m*Y(BM#9f8FhZ=dADt~iK^->*U&XrAc)l&~FB(ICu9hxP)n zuM7eI^sWp6?EaGTuFVAk_=n^|9qvNzmYGOTlq(nu=+B%@!9lvz-|)tmG-ApvCB ju&!8%p(mFM-e9cRpM?E+_8qrkV=?e_&|(K{JmdfX++IO4 literal 0 HcmV?d00001 diff --git a/tests/data/blocks/block_202612_testnet.bin b/tests/data/blocks/block_202612_testnet.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9745978de1403d07fd94e0602a0b955a2863e25 GIT binary patch literal 244 zcmVKg7%PVUK9^!fWXT0grfoi5J`UGa7rlDZV?Aeb~$m5Pjxjq3UnS? u@x!INpUMS_Apy8|O#wtp@}-$DnSbCnz)?imBnZB2oizGT<~}OBfu;c8k8*GT literal 0 HcmV?d00001 diff --git a/tests/unit_tests/cryptonote_format_utils.cpp b/tests/unit_tests/cryptonote_format_utils.cpp index 1b15305f7..55bc14710 100644 --- a/tests/unit_tests/cryptonote_format_utils.cpp +++ b/tests/unit_tests/cryptonote_format_utils.cpp @@ -30,8 +30,17 @@ #include "crypto/generators.h" #include "cryptonote_basic/cryptonote_format_utils.h" +#include "file_io_utils.h" #include "serialization/binary_utils.h" #include "serialization/string.h" +#include "string_tools.h" +#include "unit_tests_utils.h" + +namespace +{ +static constexpr const char EXISTING_BLOCK_POW_HASH_202612[] = + "84f64766475d51837ac9efbef1926486e58563c95a19fef4aec3254f03000000"; +} //anonymous namespace TEST(cn_format_utils, add_extra_nonce_to_tx_extra) { @@ -160,6 +169,108 @@ TEST(cn_format_utils, payment_id_tx_extra_nonce_rejects_wrong_tag_or_size) EXPECT_FALSE(cryptonote::get_encrypted_payment_id_from_tx_extra_nonce(wrong_size, parsed_encrypted_payment_id)); } +TEST(cn_format_utils, block_longhash_202612_arbitrary_blob) +{ + const cryptonote::blobdata blob = "not the historical block 202612 hashing blob"; + const crypto::hash pow_hash = cryptonote::get_block_longhash(blob, 202612, 1, crypto::null_hash); + + ASSERT_NE(EXISTING_BLOCK_POW_HASH_202612, epee::string_tools::pod_to_hex(pow_hash)); +} + +TEST(cn_format_utils, block_longhash_202612_mainnet_blob) +{ + // load existing mainnet block 202612 from file + const auto block_202612_blob_path = unit_test::data_dir / "blocks" / "block_202612_mainnet.bin"; + cryptonote::blobdata block_blob; + ASSERT_TRUE(epee::file_io_utils::load_file_to_string(block_202612_blob_path.string(), block_blob)); + + // parse and validate existing mainnet block 202612 and check block ID (you can see bbd604d2... on an explorer) + cryptonote::block block; + crypto::hash block_id = crypto::null_hash; + ASSERT_TRUE(cryptonote::parse_and_validate_block_from_blob(block_blob, block, &block_id)); + ASSERT_EQ("bbd604d2ba11ba27935e006ed39c9bfdd99b76bf4a50654bc1e1e61217962698", epee::string_tools::pod_to_hex(block_id)); + + // get hashing blob for 202612 and check raw hash (you can see 426d16cf... in cryptonote::get_block_longhash() impl) + const cryptonote::blobdata hashing_blob = cryptonote::get_block_hashing_blob(block); + ASSERT_TRUE(cryptonote::get_object_hash(hashing_blob, block_id)); + ASSERT_EQ("426d16cff04c71f8b16340b722dc4010a2dd3831c22041431f772547ba6e331a", epee::string_tools::pod_to_hex(block_id)); + + // call get_block_longhash() and check that we get the existing PoW hash + const crypto::hash pow_hash = cryptonote::get_block_longhash(hashing_blob, 202612, 1, crypto::null_hash); + ASSERT_EQ(EXISTING_BLOCK_POW_HASH_202612, epee::string_tools::pod_to_hex(pow_hash)); +} + +TEST(cn_format_utils, block_longhash_202612_testnet_blob) +{ + // load existing testnet block 202612 from file + const auto block_202612_blob_path = unit_test::data_dir / "blocks" / "block_202612_testnet.bin"; + cryptonote::blobdata block_blob; + ASSERT_TRUE(epee::file_io_utils::load_file_to_string(block_202612_blob_path.string(), block_blob)); + + // parse and validate existing testnet block 202612 and check block ID (you can see 248fde4b... on an explorer) + cryptonote::block block; + crypto::hash block_id; + ASSERT_TRUE(cryptonote::parse_and_validate_block_from_blob(block_blob, block, block_id)); + ASSERT_EQ("248fde4b96b829c4ddbd00e3f76d35b03d01257898bc1b5578bc9e04b379a676", epee::string_tools::pod_to_hex(block_id)); + + // get hashing blob for 202612 and check raw hash (you can see 248fde4b... in cryptonote::get_block_longhash() impl) + const cryptonote::blobdata hashing_blob = cryptonote::get_block_hashing_blob(block); + ASSERT_TRUE(cryptonote::get_object_hash(hashing_blob, block_id)); + ASSERT_EQ("248fde4b96b829c4ddbd00e3f76d35b03d01257898bc1b5578bc9e04b379a676", epee::string_tools::pod_to_hex(block_id)); + + // call get_block_longhash() and check that we get the existing PoW hash + const crypto::hash pow_hash = cryptonote::get_block_longhash(hashing_blob, 202612, 9, crypto::null_hash); + ASSERT_EQ(EXISTING_BLOCK_POW_HASH_202612, epee::string_tools::pod_to_hex(pow_hash)); +} + +TEST(cn_format_utils, block_longhash_202612_stagenet_blob) +{ + // load existing stagenet block 202612 from file + const auto block_202612_blob_path = unit_test::data_dir / "blocks" / "block_202612_stagenet.bin"; + cryptonote::blobdata block_blob; + ASSERT_TRUE(epee::file_io_utils::load_file_to_string(block_202612_blob_path.string(), block_blob)); + + // parse and validate existing stagenet block 202612 and check block ID (you can see f3449e65... on an explorer) + cryptonote::block block; + crypto::hash block_id; + ASSERT_TRUE(cryptonote::parse_and_validate_block_from_blob(block_blob, block, block_id)); + ASSERT_EQ("f3449e658b5f880c4b0e69007ed5d092c9c883ac3a518166fa652d5cc505e7b1", epee::string_tools::pod_to_hex(block_id)); + + // get hashing blob for 202612 and check raw hash (you can see f3449e65... in cryptonote::get_block_longhash() impl) + const cryptonote::blobdata hashing_blob = cryptonote::get_block_hashing_blob(block); + ASSERT_TRUE(cryptonote::get_object_hash(hashing_blob, block_id)); + ASSERT_EQ("f3449e658b5f880c4b0e69007ed5d092c9c883ac3a518166fa652d5cc505e7b1", epee::string_tools::pod_to_hex(block_id)); + + // call get_block_longhash() and check that we get the existing PoW hash + const crypto::hash pow_hash = cryptonote::get_block_longhash(hashing_blob, 202612, 9, crypto::null_hash); + ASSERT_EQ(EXISTING_BLOCK_POW_HASH_202612, epee::string_tools::pod_to_hex(pow_hash)); +} + +TEST(cn_format_utils, block_longhash_reconstruct_existing_202612) +{ + // load existing mainnet block 202612 from file + const auto block_202612_blob_path = unit_test::data_dir / "blocks" / "block_202612_mainnet.bin"; + cryptonote::blobdata block_blob; + ASSERT_TRUE(epee::file_io_utils::load_file_to_string(block_202612_blob_path.string(), block_blob)); + + // parse and validate existing mainnet block 202612 + cryptonote::block block; + ASSERT_TRUE(cryptonote::parse_and_validate_block_from_blob(block_blob, block)); + ASSERT_EQ(513, block.tx_hashes.size()); + + // modify block and hashing blob s.t. it matches buggy behavior of tree hash before counting fix + block.tx_hashes.pop_back(); + block.tx_hashes.pop_back(); + cryptonote::blobdata hashing_blob = cryptonote::get_block_hashing_blob(block); + ASSERT_EQ(77, hashing_blob.size()); + hashing_blob.at(75) = (char) -126; // mangle total tx count from 512 to 514 + + // check that we can reconstruct the existing PoW hash + crypto::hash pow_hash; + crypto::cn_slow_hash(hashing_blob.data(), hashing_blob.size(), pow_hash, /*variant=*/0, /*height=*/202612); + ASSERT_EQ(EXISTING_BLOCK_POW_HASH_202612, epee::string_tools::pod_to_hex(pow_hash)); +} + TEST(cn_format_utils, add_mm_merkle_root_to_tx_extra) { const std::vector depths{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 63, 64, 127, 128, 16383, 16384};