# Makefile per Bitcoin P2PK Bruteforce CC = g++ # Ottimizzazioni aggressive per CPU moderna # -O3: massima ottimizzazione # -march=native: usa tutte le istruzioni del processore (AVX2, SSE4.2, etc) # -mtune=native: ottimizza per il processore specifico # -flto: Link Time Optimization # -ffast-math: ottimizzazioni matematiche aggressive (safe per crypto) # -funroll-loops: srotola loop piccoli # -finline-functions: inline aggressivo # -fprefetch-loop-arrays: prefetch automatico # -faligned-new: supporto per aligned new (C++17) CFLAGS = -O3 -march=native -mtune=native -flto -ffast-math \ -funroll-loops -finline-functions -fprefetch-loop-arrays \ -faligned-new -pthread -Wall -Wextra -std=c++17 # Librerie necessarie LIBS = -lsecp256k1 -lgmp # Target TARGET = p2pk_bruteforce SOURCE = p2pk_bruteforce.cpp # Percorsi libreria INCLUDE_PATH = -I/usr/local/include -I/usr/include LIB_PATH = -L/usr/local/lib -L/usr/lib # ============================================================================ # TARGET PRINCIPALI # ============================================================================ all: build # Compilazione standard build: $(SOURCE) @echo "=========================================" @echo " Bitcoin P2PK Bruteforce - Compilazione" @echo "=========================================" @if [ -d "secp256k1" ]; then \ echo "[+] Compilazione con libsecp256k1 locale..."; \ $(CC) $(CFLAGS) \ -I./secp256k1/include \ -L./secp256k1/lib \ -Wl,-rpath,$(shell pwd)/secp256k1/lib \ -o $(TARGET) $(SOURCE) $(LIBS); \ else \ echo "[+] Compilazione con libsecp256k1 di sistema..."; \ $(CC) $(CFLAGS) $(INCLUDE_PATH) $(LIB_PATH) \ -o $(TARGET) $(SOURCE) $(LIBS); \ fi @echo "[+] Compilazione completata!" @echo "[+] Eseguibile: ./$(TARGET)" @echo "" @echo "OTTIMIZZAZIONI ATTIVE:" @echo " ✓ Batch EC point addition (256 keys/iteration)" @echo " ✓ Zero-copy lookup (no serialization)" @echo " ✓ SIMD-optimized Bloom filter" @echo " ✓ Cache-aligned memory" @echo " ✓ CPU prefetching hints" @echo " ✓ LTO & aggressive inlining" @echo "" @echo "PERFORMANCE ATTESE: 800K - 2M keys/sec" @echo "=========================================" # ============================================================================ # PROFILE-GUIDED OPTIMIZATION (PGO) # ============================================================================ pgo: pgo-generate pgo-run pgo-use pgo-generate: $(SOURCE) @echo "[+] Step 1/3: Compilazione con profile generation..." @if [ -d "secp256k1" ]; then \ $(CC) $(CFLAGS) -fprofile-generate \ -I./secp256k1/include \ -L./secp256k1/lib \ -Wl,-rpath,$(shell pwd)/secp256k1/lib \ -o $(TARGET)_pgo $(SOURCE) $(LIBS); \ else \ $(CC) $(CFLAGS) -fprofile-generate $(INCLUDE_PATH) $(LIB_PATH) \ -o $(TARGET)_pgo $(SOURCE) $(LIBS); \ fi @echo "[+] Pronto per eseguire il programma e generare profilo..." @echo "[!] Esegui: timeout 30s ./$(TARGET)_pgo" pgo-run: @echo "[+] Step 2/3: Generazione profilo (30 secondi)..." @timeout 30s ./$(TARGET)_pgo || true @echo "[+] Profilo generato!" pgo-use: $(SOURCE) @echo "[+] Step 3/3: Ricompilazione con Profile-Guided Optimization..." @if [ -d "secp256k1" ]; then \ $(CC) $(CFLAGS) -fprofile-use -fprofile-correction \ -I./secp256k1/include \ -L./secp256k1/lib \ -Wl,-rpath,$(shell pwd)/secp256k1/lib \ -o $(TARGET) $(SOURCE) $(LIBS); \ else \ $(CC) $(CFLAGS) -fprofile-use -fprofile-correction $(INCLUDE_PATH) $(LIB_PATH) \ -o $(TARGET) $(SOURCE) $(LIBS); \ fi @echo "[+] PGO compilazione completata!" @echo "[+] Eseguibile ottimizzato: ./$(TARGET)" @echo "[!] Performance attese: +10-20% aggiuntivo" @rm -f $(TARGET)_pgo # ============================================================================ # UTILITÀ # ============================================================================ # Versione debug debug: $(SOURCE) @echo "[+] Compilazione DEBUG..." $(CC) -g -O0 -pthread -Wall -Wextra -std=c++17 \ $(INCLUDE_PATH) $(LIB_PATH) \ -o $(TARGET)_debug $(SOURCE) $(LIBS) @echo "[+] Eseguibile debug: ./$(TARGET)_debug" # Analisi assembly generato asm: $(SOURCE) @echo "[+] Generazione assembly..." $(CC) $(CFLAGS) -S -fverbose-asm $(INCLUDE_PATH) \ -o $(TARGET).s $(SOURCE) @echo "[+] Assembly salvato in: $(TARGET).s" # Benchmark veloce (10 secondi) bench: build @echo "[+] Benchmark rapido (10 secondi)..." @timeout 10s ./$(TARGET) || true # Test con valgrind (memory leaks) valgrind: debug @echo "[+] Test con Valgrind..." valgrind --leak-check=full --show-leak-kinds=all \ ./$(TARGET)_debug # Pulizia clean: @echo "[+] Pulizia file compilati..." rm -f $(TARGET) $(TARGET)_debug $(TARGET)_pgo rm -f *.o *.gcda *.gcno *.s rm -f progress.csv @echo "[+] Pulizia completata!" clean-all: clean @echo "[+] Pulizia completa..." rm -rf secp256k1_build secp256k1 @echo "[+] Pulizia completa terminata!" # ============================================================================ # DIPENDENZE # ============================================================================ install-deps: @echo "[+] Installazione dipendenze..." @echo "[!] Richiede: build-essential, libsecp256k1-dev, libgmp-dev" @read -p "Continuare? [y/N] " -n 1 -r; \ echo; \ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \ sudo apt-get update && \ sudo apt-get install -y build-essential libsecp256k1-dev libgmp-dev \ git autoconf libtool pkg-config; \ echo "[+] Dipendenze installate!"; \ fi build-secp256k1: @echo "[+] Compilazione libsecp256k1 ottimizzata..." @./build_secp256k1.sh # ============================================================================ # HELP # ============================================================================ help: @echo "===================================================" @echo " Bitcoin P2PK Bruteforce - Makefile" @echo "===================================================" @echo "" @echo "Target disponibili:" @echo " make - Compila il programma (default)" @echo " make build - Compila il programma" @echo " make pgo - Compila con Profile-Guided Optimization" @echo " make debug - Compila versione debug" @echo " make asm - Genera assembly per analisi" @echo " make bench - Benchmark rapido (10s)" @echo " make valgrind - Test memory leaks" @echo " make clean - Rimuove file compilati" @echo " make clean-all - Pulizia completa" @echo " make install-deps - Installa dipendenze" @echo " make build-secp256k1 - Compila libsecp256k1 locale" @echo "" @echo "Uso consigliato:" @echo " 1. make # Compila" @echo " 2. ./$(TARGET) # Esegui bruteforce" @echo "" @echo "Per massime performance:" @echo " make pgo # Compila con PGO (+10-20% speed)" @echo "" @echo "===================================================" .PHONY: all build pgo pgo-generate pgo-run pgo-use debug asm bench \ valgrind clean clean-all install-deps build-secp256k1 help