diff --git a/aad_coin_miner_cpu.c b/aad_coin_miner_cpu.c new file mode 100644 index 0000000..f13b6be --- /dev/null +++ b/aad_coin_miner_cpu.c @@ -0,0 +1,163 @@ +// +// Arquiteturas de Alto Desempenho 2025/2026 +// +// DETI Coin Miner - CPU implementation +// + +#include +#include +#include +#include +#include +#include "aad_data_types.h" +#include "aad_utilities.h" +#include "aad_sha1_cpu.h" +#include "aad_vault.h" + +static volatile int keep_running = 1; + +void signal_handler(int signum) +{ + (void)signum; + keep_running = 0; +} + +// +// check if a hash starts with aad20250 +// +static int is_valid_coin(u32_t *hash) +{ + return hash[0] == 0xAAD20250u; +} + +// +// mine DETI coins using the CPU (no SIMD) +// +static void mine_coins_cpu(u64_t max_attempts) +{ + u32_t coin[14]; + u32_t hash[5]; + u64_t attempts = 0; + u32_t coins_found = 0; + + // Initialize coin template: "DETI coin 2 " + variable content + "\n\x80" + memset(coin, 0, sizeof(coin)); + + // "DETI coin 2 " at the beginning + ((u08_t *)coin)[0x0 ^ 3] = 'D'; + ((u08_t *)coin)[0x1 ^ 3] = 'E'; + ((u08_t *)coin)[0x2 ^ 3] = 'T'; + ((u08_t *)coin)[0x3 ^ 3] = 'I'; + ((u08_t *)coin)[0x4 ^ 3] = ' '; + ((u08_t *)coin)[0x5 ^ 3] = 'c'; + ((u08_t *)coin)[0x6 ^ 3] = 'o'; + ((u08_t *)coin)[0x7 ^ 3] = 'i'; + ((u08_t *)coin)[0x8 ^ 3] = 'n'; + ((u08_t *)coin)[0x9 ^ 3] = ' '; + ((u08_t *)coin)[0xa ^ 3] = '2'; + ((u08_t *)coin)[0xb ^ 3] = ' '; + + // Newline at position 54, padding at 55 + ((u08_t *)coin)[0x36 ^ 3] = '\n'; + ((u08_t *)coin)[0x37 ^ 3] = 0x80; + + // Variable part: positions 12-53 (42 bytes) + // Initialize with a pattern + for(int i = 12; i < 54; i++) + ((u08_t *)coin)[i ^ 3] = 'A' + (i - 12) % 26; + + printf("Mining DETI coins using CPU (no SIMD)...\n"); + printf("Press Ctrl+C to stop\n\n"); + + time_measurement(); + time_measurement(); + double start_time = wall_time_delta(); + + while(keep_running && (max_attempts == 0 || attempts < max_attempts)) + { + // Compute SHA1 hash + sha1(coin, hash); + attempts++; + + // Check if it's a valid coin + if(is_valid_coin(hash)) + { + coins_found++; + printf("COIN FOUND! (attempt %llu)\n", (unsigned long long)attempts); + save_coin(coin); + } + + // Update the variable part (simple counter-based approach) + // Increment from the end to beginning + int pos = 53; + while(pos >= 12) + { + u08_t *byte = &((u08_t *)coin)[pos ^ 3]; + if(*byte == '\n' || *byte == 0x80) + *byte = 32; // Start from space + + (*byte)++; + + // Skip newline character + if(*byte == '\n') + (*byte)++; + + // Wrap around at 127 (printable ASCII limit) + if(*byte >= 127) + { + *byte = 32; // Reset to space + pos--; // Carry to next position + } + else + { + break; // No carry needed + } + } + + // Print progress every 1M attempts + if(attempts % 1000000 == 0) + { + time_measurement(); + double current_time = wall_time_delta() - start_time; + double rate = attempts / current_time; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u\n", + (unsigned long long)attempts, rate / 1e6, coins_found); + } + } + + time_measurement(); + double total_time = wall_time_delta() - start_time; + + printf("\n=== Mining Statistics ===\n"); + printf("Total attempts: %llu\n", (unsigned long long)attempts); + printf("Total time: %.2f seconds\n", total_time); + printf("Average rate: %.2f attempts/second\n", attempts / total_time); + printf("Coins found: %u\n", coins_found); + + // Save any remaining coins + save_coin(NULL); +} + +int main(int argc, char *argv[]) +{ + u64_t max_attempts = 0; + + // Set up signal handler for graceful shutdown + signal(SIGINT, signal_handler); + + if(argc > 1) + { + max_attempts = strtoull(argv[1], NULL, 10); + printf("Will perform %llu attempts\n", (unsigned long long)max_attempts); + } + else + { + printf("Usage: %s [max_attempts]\n", argv[0]); + printf("Running indefinitely until Ctrl+C...\n"); + } + + mine_coins_cpu(max_attempts); + + return 0; +} +