From c569c0c34649cf3390e35e8ed0459efc2ed09f74 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Fri, 15 Aug 2025 07:47:16 -0400 Subject: [PATCH] Improved POW --- Makefile | 42 ++++++++--- VERSION | 2 +- build.sh | 96 +++++++++++++++++++++++- libnostr_core.a | Bin 15925618 -> 15925714 bytes nostr_core/core.c | 32 +++++--- nostr_core/core.o | Bin 34888 -> 34984 bytes nostr_core/nostr_core.h | 10 ++- tests/test_pow_loop.c | 161 ---------------------------------------- 8 files changed, 155 insertions(+), 188 deletions(-) delete mode 100644 tests/test_pow_loop.c diff --git a/Makefile b/Makefile index 7d0579f9..838eb632 100644 --- a/Makefile +++ b/Makefile @@ -65,37 +65,55 @@ $(SECP256K1_LIB): secp256k1/configure fi @echo "x86_64 secp256k1 library built successfully" -# Build OpenSSL for x86_64 +# Build OpenSSL for x86_64 (minimal build optimized for curl) $(OPENSSL_LIB_SSL) $(OPENSSL_LIB_CRYPTO): openssl-3.4.2/Configure - @echo "Building OpenSSL for x86_64..." + @echo "Building minimal OpenSSL for x86_64 (optimized for curl)..." @cd openssl-3.4.2 && \ if [ ! -f ../openssl-install/lib64/libssl.a ] || [ ! -f ../openssl-install/lib64/libcrypto.a ]; then \ - echo "Configuring OpenSSL..."; \ + echo "Configuring minimal OpenSSL..."; \ make distclean >/dev/null 2>&1 || true; \ - ./Configure linux-x86_64 --prefix=$(PWD)/openssl-install --openssldir=$(PWD)/openssl-install/ssl no-shared no-dso; \ - echo "Building OpenSSL libraries..."; \ + ./Configure linux-x86_64 \ + --prefix=$(PWD)/openssl-install \ + --openssldir=$(PWD)/openssl-install/ssl \ + no-shared no-dso no-apps no-docs \ + no-ssl3 no-tls1 no-tls1_1 \ + no-engine no-comp no-legacy \ + no-gost no-idea no-seed no-md2 no-md4 \ + no-mdc2 no-rmd160 no-camellia no-rc5 \ + no-bf no-cast no-des \ + enable-tls1_2 enable-tls1_3; \ + echo "Building minimal OpenSSL libraries..."; \ make -j$(shell nproc 2>/dev/null || echo 4); \ make install_sw >/dev/null 2>&1; \ else \ echo "OpenSSL libraries already exist, skipping build"; \ fi - @echo "x86_64 OpenSSL libraries built successfully" + @echo "x86_64 minimal OpenSSL libraries built successfully" -# Build curl for x86_64 +# Build curl for x86_64 (minimal HTTPS-only build) $(CURL_LIB): curl-8.15.0/curl-8.15.0/configure $(OPENSSL_LIB_SSL) - @echo "Building curl for x86_64..." + @echo "Building minimal curl for x86_64 (HTTPS-only)..." @cd curl-8.15.0/curl-8.15.0 && \ if [ ! -f ../../curl-install/lib/libcurl.a ]; then \ - echo "Configuring curl..."; \ + echo "Configuring minimal curl..."; \ make distclean >/dev/null 2>&1 || true; \ - ./configure --prefix=$(PWD)/curl-install --with-openssl=$(PWD)/openssl-install --disable-shared --enable-static --without-libpsl --without-nghttp2 --without-brotli --without-zstd; \ - echo "Building curl library..."; \ + ./configure --prefix=$(PWD)/curl-install \ + --with-openssl=$(PWD)/openssl-install \ + --disable-shared --enable-static \ + --disable-ftp --disable-file --disable-ldap --disable-ldaps \ + --disable-pop3 --disable-imap --disable-smtp \ + --disable-gopher --disable-smb --disable-telnet \ + --disable-tftp --disable-dict --disable-rtsp \ + --disable-manual --disable-libcurl-option \ + --without-libpsl --without-nghttp2 --without-brotli --without-zstd \ + --without-libidn2 --without-librtmp --without-libssh2; \ + echo "Building minimal curl library..."; \ make -j$(shell nproc 2>/dev/null || echo 4); \ make install >/dev/null 2>&1; \ else \ echo "curl library already exists, skipping build"; \ fi - @echo "x86_64 curl library built successfully" + @echo "x86_64 minimal curl library built successfully" # Static library - includes secp256k1 and OpenSSL objects for self-contained library $(STATIC_LIB): $(LIB_OBJECTS) $(SECP256K1_LIB) $(OPENSSL_LIB_SSL) $(OPENSSL_LIB_CRYPTO) diff --git a/VERSION b/VERSION index a2e1aa9d..db7a4804 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.27 +0.1.31 diff --git a/build.sh b/build.sh index 05960ab3..d5ef46da 100755 --- a/build.sh +++ b/build.sh @@ -80,12 +80,60 @@ increment_version() { print_success "Updated VERSION file to ${NEW_VERSION#v}" } +# Function to perform git operations after successful build +perform_git_operations() { + local commit_message="$1" + + if [[ -z "$commit_message" ]]; then + return 0 # No commit message provided, skip git operations + fi + + print_status "Performing git operations..." + + # Check if we're in a git repository + if ! git rev-parse --git-dir > /dev/null 2>&1; then + print_warning "Not in a git repository - skipping git operations" + return 0 + fi + + # Check if there are changes to commit + if git diff --quiet && git diff --cached --quiet; then + print_warning "No changes to commit" + return 0 + fi + + # Add all changes + print_status "Adding changes to git..." + if ! git add .; then + print_error "Failed to add changes to git" + return 1 + fi + + # Commit changes + print_status "Committing changes with message: '$commit_message'" + if ! git commit -m "$commit_message"; then + print_error "Failed to commit changes" + return 1 + fi + + # Push changes + print_status "Pushing changes to remote repository..." + if ! git push; then + print_error "Failed to push changes to remote repository" + print_warning "Changes have been committed locally but not pushed" + return 1 + fi + + print_success "Git operations completed successfully!" + return 0 +} + # Function to show usage show_usage() { echo "NOSTR Core Library Build Script" echo "===============================" echo "" - echo "Usage: $0 [target] [architecture]" + echo "Usage: $0 [target] [-m \"commit message\"]" echo "" echo "Available targets:" echo " clean - Clean all build artifacts" @@ -99,6 +147,14 @@ show_usage() { echo " uninstall - Remove library from system" echo " help - Show this help message" echo "" + echo "Options:" + echo " -m \"message\" - Git commit message (triggers automatic git add, commit, push after successful build)" + echo "" + echo "Examples:" + echo " $0 lib -m \"Add new proof-of-work parameters\"" + echo " $0 x64 -m \"Fix OpenSSL minimal build configuration\"" + echo " $0 lib # Build without git operations" + echo "" echo "Library outputs (both self-contained with secp256k1):" echo " libnostr_core.a - x86_64 static library" echo " libnostr_core_arm64.a - ARM64 static library" @@ -109,7 +165,36 @@ show_usage() { } # Parse command line arguments -TARGET=${1:-lib} +TARGET="" +COMMIT_MESSAGE="" + +# Parse arguments +while [[ $# -gt 0 ]]; do + case $1 in + -m) + COMMIT_MESSAGE="$2" + shift 2 + ;; + -*) + print_error "Unknown option: $1" + show_usage + exit 1 + ;; + *) + if [[ -z "$TARGET" ]]; then + TARGET="$1" + else + print_error "Multiple targets specified: $TARGET and $1" + show_usage + exit 1 + fi + shift + ;; + esac +done + +# Set default target if none specified +TARGET=${TARGET:-lib} case "$TARGET" in clean) @@ -145,6 +230,7 @@ case "$TARGET" in if [ $SUCCESS -eq 2 ]; then print_success "Both architectures built successfully!" ls -la libnostr_core*.a + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build all libraries" exit 1 @@ -160,6 +246,7 @@ case "$TARGET" in SIZE=$(stat -c%s "libnostr_core.a") print_success "x64 static library built successfully (${SIZE} bytes)" ls -la libnostr_core.a + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build x64 static library" exit 1 @@ -175,6 +262,7 @@ case "$TARGET" in SIZE=$(stat -c%s "libnostr_core_arm64.a") print_success "ARM64 static library built successfully (${SIZE} bytes)" ls -la libnostr_core_arm64.a + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build ARM64 static library" exit 1 @@ -190,6 +278,7 @@ case "$TARGET" in SIZE=$(stat -c%s "libnostr_core.so") print_success "Shared library built successfully (${SIZE} bytes)" ls -la libnostr_core.so + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build shared library" exit 1 @@ -224,6 +313,7 @@ case "$TARGET" in print_success "All libraries and examples built successfully!" ls -la libnostr_core*.a ls -la examples/ + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build all components" exit 1 @@ -242,6 +332,7 @@ case "$TARGET" in print_success "Both libraries and examples built successfully" ls -la libnostr_core*.a ls -la examples/ + perform_git_operations "$COMMIT_MESSAGE" else print_error "Failed to build libraries for examples" exit 1 @@ -281,6 +372,7 @@ case "$TARGET" in make all sudo make install print_success "Library installed to /usr/local" + perform_git_operations "$COMMIT_MESSAGE" ;; uninstall) diff --git a/libnostr_core.a b/libnostr_core.a index e46267280b2be17d8c94b0ea7233386ca36af062..4b132684e6ae718da83de45476669f3ac01243f3 100644 GIT binary patch delta 46028 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 dxkYZ1Ch~Xk5Aq9XCU?lM= target_difficulty) { #ifdef ENABLE_DEBUG_LOGGING diff --git a/nostr_core/core.o b/nostr_core/core.o index a76b01542b6fd81bb3cdff6d3e1edee5188edbdc..905d766d8a90086864f3531e764ffcf661461dcf 100644 GIT binary patch delta 3335 zcmZ`*TWl0n7@pY{yT;O4AUa*Bwk1Q_vIV;sxrUb2ZJ3&=wn?K+fe6|lAW=wKF1;|V z-Dx?gOCTqLBq*s5O2S2O6H`hgi_(@ps1!|z!2neR7UcTSOHkJDoSAJ8U?-Wg=X~FP z|NlAdnVqf!yIebSb!_+`dfeLA_Mym1O_K3r5=eF4(j>B)iC>u2CNA4G=L2MMqlbWcu^ zIlt7prG%>Bs?@rogvzne8KUz|R0$PfV~{(={=s7Zt?SH-L9X3b@}n@ZlAm>Qhb5%* z!+jkTJ7$%<+gt39vu)YVAh{kS>$TjyLk$SvoDzEAVr4Tlvp~1{YP{eXm2aJ^ov620 zXq5)J9VGF1zm5XTKPkhj@2{T^Pt&`q_>~Z8~JGKivM%8|{aXYL* z&L8(cz)?QQ_6Fw4;{>-DXS+gZj!t@P*a=94P)=LN0Zpc8j3ohnrO}S=>Es6M&l0`8 z#_25bL_XXyAC(a#qK9YM2H^CzxuQc90>X{=2fEsFU|Dj+Iog2t@pS z%C}QO7?DzT7(9DJ2`$4;$&^}pj4VL4lpPx& ziquM4x@GRzShQX%Q>r@EFdmPuo~>kt7>Ahc z&$C+h+25;TO=siRe7ckReBLBa>?&RAn?57Uv0_i?FKp;q{&p9WyWCeX89`Y+bcatf z_x~f>Z#m`GTYiw6Msq-EDf;+y8gu) zOX6D=d~6u2b0_FwJ{;`YaoT~N2l0)0(5Dj8ql7+UNg`BCC=b;jLkP9NsZC2%E(_wE z?vJ8&`F2&E7)nTYWfd+EZmz~>keH(c6aFYS7G$@dqh!}NXu`Q05@Qt8cN>^A+@ARE zS#06wS?wX^=nm=R;^@}?7!yYWH*Vqv8PMhLG@{F_*x0+rJi)vWaIAU z86cffTmU(SGaq9Cvbklk>EwHEh6h|~#cOh$ip8Ih#b7@oJ6PjORQC~Cb2RqH6mE?w z+<8Rd|K*Y8m=q5$_7}!1aXC5Dat=_S3lkEL^UljE@6v>fc&aoF>;d6Vk@V;t6-%lz3M_u@C< zF^_KCtorAU!%_jS6SRJ%lQyf~%L2PbVDHcXY{mulZGn9z4+lIf_my}PkxZtmwy5S* zfjum+vjzN!fX@~1W&sZfc%y*7@8GzFqzVDwV&ju}SRV@nq5dtZ_bb7i$R1%qPmBoc z*L1~JmG0Y;>g^Fx!D2t%1)U2bOT)H~e2;Nv>P(2^VI``?n<$Yg;9{~l4$hKdRZqyz z5#+@&(*;~?O_hzm@r`)K9PJZK+f2%5mTlW& zygmnKk-mvH;d73Fiy0INc0Lp2*9r1f0=~`0>7M#Y-c~{Pm>{#Co;_f7P0O*4@HL6{H>!)>{C^HRyKe+})xlYInt*4B^0c&3rAA|_JdXw% zRk@H^luOv&TQ-jVGA?OSc^mrDm@Xe=JH);bn&sgxJR^%#Zrth>Bx^frMFWL&_yL6z9Guw0i16p;P AivR!s delta 3336 zcmZ`*ZA=tL7~VagUQ%>1MVB+F9?c@)fpIlP(JEYW7l(GQk(RVdG-67v+E2|P77orU zx4`szEp`&cq{bNiVbiE3q^%H34~k-cGy&5n{i3xJ;cAOj8z^dfeP?zT$C}$@=VqSg z{dne`cLz@Fw_RwpwdRTT_I!Kpwl+Z!5Dq8^VZV}vGZln2Wu=BaN=X%pq~_!?KCHCB zuNp&oLJFUI1YGn9DSQ?tktY?vTIx~-!QBNmf)s8^0Y0(`LPnQU1mT~__1xm1)2II- zg?-@U(?_JRhlK%THJikw@KTs)_=ZMHmWP2IJ-p%Y(_hWbjbWZ zNY*0TGrZ~u6ZtNa?NRL4=d!@Q$ZLYTu}@^=5r_jaSpYreziQ1J{}vlAsT0-`VH(@t zhj2eL4Z`9K$Tt#Or7<`?R(%*nURCTKe9bbk;xGZssgy;O!c$OeEn1~img4U^ogh_> zY0)(J6}srox}7jU-I$LSEmziiBI$~n7t`?N&Wvd*Iy2ogT&~znU26nV^5~qP=}oJB z-e90|h7Aa_Kn;&ua)B<;B5)K4|Ar!(l7%9E^O(Q{q_Zfjfb;1=L<=E5ts}zYMgrW= z&f*g60R`bujcoLI`Y1G=zst!Sp-@Kg+_)Ev^dn%T;a}khrO#|(@Y)H0dU0S(3fID{ zu~!@ztDZVD1Dx{*++v@%=o$jOE4`BTm$zsXe(urpl0CE-OHrg;DM5JHgGUns9$45t zMT#Q5_Xf*y12ujn8mdEg_Z?^xB)yuXyXMOUK!dJMilOKn$OVVfEs_$~Tqiq76fwS~ zD&#UgE=iwFzn4&78>w?SQta{b@XMN1kH8hO}S1B2+Qb8t^RS3#giu?QxR4KG3Qwn_uN|%_mXpD)_ zjL;-%3|hp=TrD-F`22os8S}RAx{SWSgHZ_%sa4+-lL^2hhp77_GwM$HI%(NVS&~n0`A2dxT|7U7lFnr(< zf4*sbzhXw2RQ~Cpe_$dzWH}DE3J;V`%oI^c_-!^fYxSYe&@?ilFEdl-WYLy_L?B6Rp zmL*|Vkse@+IrcQ?`xLne?6XPO&5V6H3A>xJVm-5I<7}$A_{WI4S1#=^S-K;-IZJsr z=f$_DA9QzE(4#?tGY9sC- zWdYgo7H7%teLo3-PND2coIU7iK^m3@eW$LFs!HZmUz9+6E!N<60 z3%O{wli1(k?D_0z?7u02tgD|*^6JxP@|VmCGFUG=$_$H#uAr@qtxLi-6SYAm1NB+z zM@cL`HF0__yrM5?+@;@eUVIM>C&8x*JHBriPZQI~*WndnB@y*v(M#NH46(5X#ug$r z6^l;dZYs77HITQP){5Dr2Ou92n~UMEg&W2 -#include -#include -#include "../nostr_core/nostr_core.h" -#include "../cjson/cJSON.h" - -// Helper function to count leading zero bits (from NIP-13) -static int zero_bits(unsigned char b) { - int n = 0; - - if (b == 0) - return 8; - - while (b >>= 1) - n++; - - return 7-n; -} - -// Count leading zero bits in hash (from NIP-13) -static int count_leading_zero_bits(unsigned char *hash) { - int bits, total, i; - for (i = 0, total = 0; i < 32; i++) { - bits = zero_bits(hash[i]); - total += bits; - if (bits != 8) - break; - } - return total; -} - -int main() { - // Initialize library - if (nostr_init() != NOSTR_SUCCESS) { - fprintf(stderr, "Failed to initialize nostr library\n"); - return 1; - } - - // Generate test keypair - unsigned char private_key[32]; - unsigned char public_key[32]; - - if (nostr_generate_keypair(private_key, public_key) != NOSTR_SUCCESS) { - fprintf(stderr, "Failed to generate keypair\n"); - nostr_cleanup(); - return 1; - } - - printf("=== Manual Proof of Work Mining (Target Difficulty: 8) ===\n\n"); - - // Create base event content - const char* content = "Proof of Work Test"; - int kind = 1; - time_t created_at = time(NULL); - - // Target difficulty - const int target_difficulty = 20; - uint64_t nonce = 0; - int max_attempts = 10000000000; - - printf("Mining event with target difficulty %d...\n\n", target_difficulty); - - // Mining loop - for (int attempt = 0; attempt < max_attempts; attempt++) { - // Create tags array with current nonce - cJSON* tags = cJSON_CreateArray(); - if (!tags) { - fprintf(stderr, "Failed to create tags array\n"); - break; - } - - // Add nonce tag: ["nonce", "", ""] - cJSON* nonce_tag = cJSON_CreateArray(); - char nonce_str[32]; - char difficulty_str[16]; - snprintf(nonce_str, sizeof(nonce_str), "%llu", (unsigned long long)nonce); - snprintf(difficulty_str, sizeof(difficulty_str), "%d", target_difficulty); - - cJSON_AddItemToArray(nonce_tag, cJSON_CreateString("nonce")); - cJSON_AddItemToArray(nonce_tag, cJSON_CreateString(nonce_str)); - cJSON_AddItemToArray(nonce_tag, cJSON_CreateString(difficulty_str)); - cJSON_AddItemToArray(tags, nonce_tag); - - // Create and sign event with current nonce - cJSON* event = nostr_create_and_sign_event(kind, content, tags, private_key, created_at); - cJSON_Delete(tags); - - if (!event) { - fprintf(stderr, "Failed to create event at nonce %llu\n", (unsigned long long)nonce); - nonce++; - continue; - } - - // Get event ID - cJSON* id_item = cJSON_GetObjectItem(event, "id"); - if (!id_item || !cJSON_IsString(id_item)) { - fprintf(stderr, "Failed to get event ID at nonce %llu\n", (unsigned long long)nonce); - cJSON_Delete(event); - nonce++; - continue; - } - - const char* event_id = cJSON_GetStringValue(id_item); - - // Convert hex ID to bytes and count leading zero bits - unsigned char hash[32]; - if (nostr_hex_to_bytes(event_id, hash, 32) != NOSTR_SUCCESS) { - fprintf(stderr, "Failed to convert event ID to bytes at nonce %llu\n", (unsigned long long)nonce); - cJSON_Delete(event); - nonce++; - continue; - } - - int current_difficulty = count_leading_zero_bits(hash); - - // Print current attempt - printf("Nonce %llu: ID = %.16s... (difficulty: %d)", - (unsigned long long)nonce, event_id, current_difficulty); - - // Check if we've reached target difficulty - if (current_difficulty >= target_difficulty) { - printf(" āœ“ SUCCESS!\n\n"); - - // Print final successful event - printf("=== SUCCESSFUL EVENT ===\n"); - char* final_json = cJSON_Print(event); - if (final_json) { - printf("%s\n", final_json); - free(final_json); - } - - printf("\nšŸŽ‰ Mining completed!\n"); - printf(" Attempts: %d\n", attempt + 1); - printf(" Final nonce: %llu\n", (unsigned long long)nonce); - printf(" Final difficulty: %d (target was %d)\n", current_difficulty, target_difficulty); - - cJSON_Delete(event); - nostr_cleanup(); - return 0; - } else { - printf(" (need %d)\n", target_difficulty); - } - - cJSON_Delete(event); - nonce++; - } - - // If we reach here, we've exceeded max attempts - printf("\nāŒ Mining failed after %d attempts\n", max_attempts); - printf("Consider increasing max_attempts or reducing target_difficulty\n"); - - nostr_cleanup(); - return 1; -}