diff --git a/.gitignore b/.gitignore index 110c231..a91886b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ .vscode build logs +tests/extract_cache +tests/extract_chain +tests/inspect_dump + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 78a140d..f685c07 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -189,5 +189,6 @@ target_link_libraries(${CMAKE_PROJECT_NAME} debug ${ZMQ_LIBRARY_DEBUG} debug ${U add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/crypto_tests.txt" $) add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/block.dat" $) add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump.dat.xz" $) -add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump_mini.dat.xz" $) -add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump_nano.dat.xz" $) +#add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump_mini.dat.xz" $) +#add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump_nano.dat.xz" $) + diff --git a/tests/extract_chain.cpp b/tests/extract_chain.cpp new file mode 100644 index 0000000..68debcc --- /dev/null +++ b/tests/extract_chain.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include + +static constexpr uint32_t BLOCK_SIZE = 96 * 1024; +static constexpr uint32_t NUM_BLOCKS = 4608; + +int main(int argc, char* argv[]) { + if (argc != 4) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + std::ifstream cache(argv[1], std::ios::binary); + std::ofstream out(argv[2], std::ios::binary); + int want_blocks = std::stoi(argv[3]); + + // Read all slots to find the last written block + std::vector>> slots; + std::vector slot(BLOCK_SIZE); + + for (int i = 0; i < NUM_BLOCKS; ++i) { + cache.read(reinterpret_cast(slot.data()), BLOCK_SIZE); + uint32_t size = *reinterpret_cast(slot.data()); + + if (size > 0 && size < BLOCK_SIZE - 4) { + std::vector data(size); + memcpy(data.data(), slot.data() + 4, size); + slots.push_back({i, std::move(data)}); + } + } + + std::cout << "Found " << slots.size() << " valid blocks in cache\n"; + + // Take the last N blocks (most recent) + int start = std::max(0, (int)slots.size() - want_blocks); + int written = 0; + + for (int i = start; i < slots.size(); ++i) { + uint32_t size = slots[i].second.size(); + out.write(reinterpret_cast(&size), 4); + out.write(reinterpret_cast(slots[i].second.data()), size); + written++; + } + + std::cout << "Extracted " << written << " consecutive blocks (slots " << slots[start].first << " to " << slots.back().first << ")\n"; + return 0; +} diff --git a/tests/inspect_dump.cpp b/tests/inspect_dump.cpp new file mode 100644 index 0000000..95e6b15 --- /dev/null +++ b/tests/inspect_dump.cpp @@ -0,0 +1,23 @@ +#include +#include +#include + +int main(int argc, char* argv[]) { + std::ifstream in(argv[1], std::ios::binary); + + uint32_t size; + in.read(reinterpret_cast(&size), 4); + + std::cout << "First block size: " << size << " bytes\n"; + std::cout << "Total blocks in file: "; + + int count = 1; + while (in) { + in.seekg(size, std::ios::cur); + in.read(reinterpret_cast(&size), 4); + if (in) count++; + } + + std::cout << count << "\n"; + return 0; +} diff --git a/tests/src/pool_block_tests.cpp b/tests/src/pool_block_tests.cpp index fbf2de9..da8ae9f 100644 --- a/tests/src/pool_block_tests.cpp +++ b/tests/src/pool_block_tests.cpp @@ -152,17 +152,17 @@ TEST(pool_block, verify) bool m_shuffle; hash m_templateBlobsHash; } 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") }, + // Salvium mainnet - full cache (4608 blocks at sidechain height 11536) + { "salvium_main", "sidechain_dump.dat", 357365, 11536, 3, false, H("5634d8403f91c81ff792504419b63c617efb372aff6144ab9e025501df45c821") }, + { "salvium_main", "sidechain_dump.dat", 357365, 11536, 3, true, H("5634d8403f91c81ff792504419b63c617efb372aff6144ab9e025501df45c821") }, }; for (const STest& t : tests) { SideChain sidechain(nullptr, NetworkType::Mainnet, t.m_poolName); - // Difficulty of block 3454976 - sidechain.m_testMainChainDiff = difficulty_type(625461936742ULL, 0ULL); + // Difficulty at Salvium height ~357000 + sidechain.m_testMainChainDiff = difficulty_type(12964350330ULL, 0ULL); std::ifstream f(t.m_fileName, std::ios::binary | std::ios::ate); ASSERT_EQ(f.good() && f.is_open(), true); @@ -221,13 +221,14 @@ TEST(pool_block, verify) auto& r = tpl.rng(); r.seed(0); - MinerData data; - data.major_version = 16; - data.height = t.m_txinGenHeight; - data.prev_id = H("f7723462d2f4d9f605601df8de8bd483802d2275f77cbf3a6f61d8f3fc4c47bc"); - data.seed_hash = H("11186f5a8473d8dc7a0d3a0bf25834a07b1dffe8741d53cd543a8708c2e8b2a9"); - data.difficulty = { 656711234691ULL, 0 }; - data.median_weight = 300000; + MinerData data; + data.major_version = 10; // Salvium Carrot v1 + data.height = t.m_txinGenHeight; + data.prev_id = tip->m_sidechainId; // Use actual tip block ID + data.seed_hash = H("65d2f44f763238aa3363add8f638f78dc811e084ce8b244916ab7589650b760b"); // Current Salvium seed + data.difficulty = { 12964350330ULL, 0 }; // Current Salvium difficulty + data.median_weight = 300000; + data.already_generated_coins = std::numeric_limits::max(); data.median_timestamp = (1ULL << 35) - 2; @@ -246,8 +247,8 @@ TEST(pool_block, verify) Params params; - params.m_miningWallet = Wallet("44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg"); - params.m_subaddress = Wallet("86eQxzSW4AZfvsWRSop755WZUsog6L3x32NRZukeeShnS4mBGVpcqQhS6pCNxj44usPKNwesZ45ooHyjDku6nVZdT3Q9qrz"); + params.m_miningWallet = Wallet("SC11n4s2UEj9Rc8XxppPbegwQethVmREpG9JP3aJUBGRCuD3wEvS4qtYtBjhqSx3S1hw3WDCfmbWKHJqa9g5Vqyo3jrsReJ5vp"); + params.m_subaddress = Wallet("SC1siDDg9o3hBrSHJPBaGPXmJvPcUku8nD84cCT2PNUn61PxtdtBynHBiCaUf7BbNJctmU8LKabiHNE8x5ReYg6RYEhSqRFcL2W"); tpl.update(data, mempool, ¶ms); @@ -266,7 +267,7 @@ TEST(pool_block, verify) } PoolBlock block; - ASSERT_TRUE(block.m_minerWallet.decode("44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg")); + ASSERT_TRUE(block.m_minerWallet.decode("SC11n4s2UEj9Rc8XxppPbegwQethVmREpG9JP3aJUBGRCuD3wEvS4qtYtBjhqSx3S1hw3WDCfmbWKHJqa9g5Vqyo3jrsReJ5vp")); std::vector shares; diff --git a/tests/src/sidechain_dump.dat b/tests/src/sidechain_dump.dat deleted file mode 100644 index 652f381..0000000 Binary files a/tests/src/sidechain_dump.dat and /dev/null differ diff --git a/tests/src/sidechain_dump.dat.xz b/tests/src/sidechain_dump.dat.xz index 10a3f43..92164c0 100644 Binary files a/tests/src/sidechain_dump.dat.xz and b/tests/src/sidechain_dump.dat.xz differ