Update .gitignore, add chain utils, modify cmake for just main atm

This commit is contained in:
Matt Hess
2025-11-14 18:53:42 +00:00
parent c4d46fbd0b
commit 5bbbac72f1
7 changed files with 97 additions and 17 deletions

4
.gitignore vendored
View File

@@ -1,3 +1,7 @@
.vscode
build
logs
tests/extract_cache
tests/extract_chain
tests/inspect_dump

View File

@@ -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" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/block.dat" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/sidechain_dump.dat.xz" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
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" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
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" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
#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" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)
#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" $<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>)

51
tests/extract_chain.cpp Normal file
View File

@@ -0,0 +1,51 @@
#include <fstream>
#include <iostream>
#include <vector>
#include <cstdint>
#include <algorithm>
#include <cstring>
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] << " <cache_file> <output> <num_blocks>\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<std::pair<int, std::vector<uint8_t>>> slots;
std::vector<uint8_t> slot(BLOCK_SIZE);
for (int i = 0; i < NUM_BLOCKS; ++i) {
cache.read(reinterpret_cast<char*>(slot.data()), BLOCK_SIZE);
uint32_t size = *reinterpret_cast<uint32_t*>(slot.data());
if (size > 0 && size < BLOCK_SIZE - 4) {
std::vector<uint8_t> 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<char*>(&size), 4);
out.write(reinterpret_cast<char*>(slots[i].second.data()), size);
written++;
}
std::cout << "Extracted " << written << " consecutive blocks (slots " << slots[start].first << " to " << slots.back().first << ")\n";
return 0;
}

23
tests/inspect_dump.cpp Normal file
View File

@@ -0,0 +1,23 @@
#include <fstream>
#include <iostream>
#include <cstdint>
int main(int argc, char* argv[]) {
std::ifstream in(argv[1], std::ios::binary);
uint32_t size;
in.read(reinterpret_cast<char*>(&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<char*>(&size), 4);
if (in) count++;
}
std::cout << count << "\n";
return 0;
}

View File

@@ -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<uint64_t>::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, &params);
@@ -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<MinerShare> shares;

Binary file not shown.

Binary file not shown.