From c4d46fbd0b63c4a2d5e73e3266333495b6b56177 Mon Sep 17 00:00:00 2001 From: Matt Hess Date: Fri, 14 Nov 2025 10:41:38 +0000 Subject: [PATCH] Update pool_block verify test for Salvium - Add 200-block test data extracted from live cache --- tests/extract_cache.cpp | 40 +++++++++++++++++++++++++++++++++ tests/src/pool_block_tests.cpp | 13 +++++------ tests/src/sidechain_dump.dat | Bin 0 -> 96968 bytes 3 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 tests/extract_cache.cpp create mode 100644 tests/src/sidechain_dump.dat diff --git a/tests/extract_cache.cpp b/tests/extract_cache.cpp new file mode 100644 index 0000000..0eb072b --- /dev/null +++ b/tests/extract_cache.cpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +static constexpr uint32_t BLOCK_SIZE = 96 * 1024; + +int main(int argc, char* argv[]) { + if (argc != 4) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + std::ifstream in(argv[1], std::ios::binary); + std::ofstream out(argv[2], std::ios::binary); + int max_blocks = std::stoi(argv[3]); + + std::vector slot(BLOCK_SIZE); + int blocks_written = 0; + + while (in && blocks_written < max_blocks) { + // Read 96KB slot + in.read(reinterpret_cast(slot.data()), BLOCK_SIZE); + if (!in) break; + + // Read size from first 4 bytes + uint32_t size = *reinterpret_cast(slot.data()); + + // Skip empty slots + if (size == 0 || size > BLOCK_SIZE - 4) continue; + + // Write: size + data + out.write(reinterpret_cast(&size), sizeof(size)); + out.write(reinterpret_cast(slot.data() + 4), size); + blocks_written++; + } + + std::cout << "Extracted " << blocks_written << " blocks\n"; + return 0; +} diff --git a/tests/src/pool_block_tests.cpp b/tests/src/pool_block_tests.cpp index 6cb7250..fbf2de9 100644 --- a/tests/src/pool_block_tests.cpp +++ b/tests/src/pool_block_tests.cpp @@ -151,14 +151,11 @@ TEST(pool_block, verify) uint32_t m_expectedSharesNextBlock; bool m_shuffle; hash m_templateBlobsHash; - } tests[6] = { - { "default", "sidechain_dump.dat", 3456189, 11704382, 53, false, H("c84a85eebf17ab266e8a81b347dd7490043ede3a055c0dbe85e9cd378905845a") }, - { "default", "sidechain_dump.dat", 3456189, 11704382, 53, true, H("c84a85eebf17ab266e8a81b347dd7490043ede3a055c0dbe85e9cd378905845a") }, - { "mini", "sidechain_dump_mini.dat", 3456189, 11207082, 578, false, H("08debd1378bae899017eb58362f4c638d78e5218558025142dcbc2651c76b27e") }, - { "mini", "sidechain_dump_mini.dat", 3456189, 11207082, 578, true, H("08debd1378bae899017eb58362f4c638d78e5218558025142dcbc2651c76b27e") }, - { "nano", "sidechain_dump_nano.dat", 3456189, 188542, 115, false, H("dd667c41eb15ffb0eb662065545dc0dfbbcac8393348a4fc0a7367040319b0d5") }, - { "nano", "sidechain_dump_nano.dat", 3456189, 188542, 115, true, H("dd667c41eb15ffb0eb662065545dc0dfbbcac8393348a4fc0a7367040319b0d5") }, - }; + } tests[] = { + // Salvium mainnet - 200 blocks from live cache + { "salvium_main", "sidechain_dump.dat", 356800, 200, 200, false, H("0000000000000000000000000000000000000000000000000000000000000000") }, + { "salvium_main", "sidechain_dump.dat", 356800, 200, 200, true, H("0000000000000000000000000000000000000000000000000000000000000000") }, + }; for (const STest& t : tests) { diff --git a/tests/src/sidechain_dump.dat b/tests/src/sidechain_dump.dat new file mode 100644 index 0000000000000000000000000000000000000000..652f3815dd6062d0ad0b61966b52a2ec4893094b GIT binary patch literal 96968 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 F{{f;(=z0JE literal 0 HcmV?d00001