From 191d3b583f576a8ef6172914c1cd3afb4a4acbd1 Mon Sep 17 00:00:00 2001 From: John Tromp Date: Tue, 10 Jul 2018 09:55:16 +0200 Subject: [PATCH] allow command line personalization for plain CPU miners --- Makefile | 6 ++++++ equi.c | 15 ++++++++++----- equi.h | 15 ++++++++------- equi_miner.cpp | 14 ++++++++++---- equi_miner.h | 4 ++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 8e05f35..6bcc3fc 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,9 @@ eq4851: equi.h equi_miner.h equi_miner.cpp Makefile eq1445: equi.h equi_miner.h equi_miner.cpp Makefile $(GPP) -DATOMIC -DRESTBITS=4 -DWN=144 -DWK=5 equi_miner.cpp blake/blake2b.cpp -o eq1445 +eq1686: equi.h equi_miner.h equi_miner.cpp Makefile + $(GPP) -DATOMIC -DRESTBITS=4 -DWN=168 -DWK=6 equi_miner.cpp blake/blake2b.cpp -o eq1686 + eq1927: equi.h equi_miner.h equi_miner.cpp Makefile $(GPP) -DATOMIC -DRESTBITS=4 -DWN=192 -DWK=7 equi_miner.cpp blake/blake2b.cpp -o eq1927 @@ -70,6 +73,9 @@ verify: equi.h equi.c Makefile verify1445: equi.h equi.c Makefile g++ -DRESTBITS=4 -DWN=144 -DWK=5 -g equi.c blake/blake2b.cpp -o verify1445 +verify1686: equi.h equi.c Makefile + g++ -DRESTBITS=4 -DWN=168 -DWK=6 -g equi.c blake/blake2b.cpp -o verify1686 + bench: equi1 time ./equi1 -r 10 diff --git a/equi.c b/equi.c index 30628a7..0175c55 100644 --- a/equi.c +++ b/equi.c @@ -8,8 +8,9 @@ int main(int argc, char **argv) { const char *header = ""; - int nonce = 0, c; - while ((c = getopt (argc, argv, "h:n:")) != -1) { + char personal[] = "ZcashPoW"; + int prefixlen, nonce = 0, c; + while ((c = getopt (argc, argv, "h:n:p:")) != -1) { switch (c) { case 'h': header = optarg; @@ -17,10 +18,14 @@ int main(int argc, char **argv) { case 'n': nonce = atoi(optarg); break; + case 'p': + prefixlen = strlen(optarg); + assert(prefixlen <= 8); + memcpy((void *)personal, optarg, prefixlen); } } - printf("Verifying size %d proof for equi(\"%s\",%d)\n", - PROOFSIZE, header, nonce); + printf("Verifying size %d proof for %s(\"%s\",%d)\n", + PROOFSIZE, personal, header, nonce); char headernonce[HEADERNONCELEN]; u32 hdrlen = strlen(header); memcpy(headernonce, header, hdrlen); @@ -32,7 +37,7 @@ int main(int argc, char **argv) { int nscan = scanf(" %x", &indices[n]); assert(nscan == 1); } - int pow_rc = verify(indices, headernonce, sizeof(headernonce)); + int pow_rc = verify(indices, headernonce, sizeof(headernonce), personal); if (pow_rc == POW_OK) printf("Verified\n"); else diff --git a/equi.h b/equi.h index de57cba..1dbe508 100644 --- a/equi.h +++ b/equi.h @@ -42,12 +42,13 @@ static const u32 HASHOUT = HASHESPERBLAKE*WN/8; typedef u32 proof[PROOFSIZE]; -void setheader(blake2b_state *ctx, const char *headernonce) { +void setheader(blake2b_state *ctx, const char *headernonce, const char *personal) { + char personals[16]; + memcpy(personals+ 0, personal, 8); uint32_t le_N = htole32(WN); + memcpy(personals+ 8, &le_N, 4); uint32_t le_K = htole32(WK); - uchar personal[] = "ZcashPoW01230123"; - memcpy(personal+8, &le_N, 4); - memcpy(personal+12, &le_K, 4); + memcpy(personals+12, &le_K, 4); blake2b_param P[1]; P->digest_length = HASHOUT; P->key_length = 0; @@ -59,7 +60,7 @@ void setheader(blake2b_state *ctx, const char *headernonce) { P->inner_length = 0; memset(P->reserved, 0, sizeof(P->reserved)); memset(P->salt, 0, sizeof(P->salt)); - memcpy(P->personal, (const uint8_t *)personal, 16); + memcpy(P->personal, (const uint8_t *)personals, 16); blake2b_init_param(ctx, P); blake2b_update(ctx, (const uchar *)headernonce, HEADERNONCELEN); } @@ -118,13 +119,13 @@ bool duped(proof prf) { } // verify Wagner conditions -int verify(u32 indices[PROOFSIZE], const char *headernonce, const u32 headerlen) { +int verify(u32 indices[PROOFSIZE], const char *headernonce, const u32 headerlen, const char *personal) { if (headerlen != HEADERNONCELEN) return POW_HEADER_LENGTH; if (duped(indices)) return POW_DUPLICATE; blake2b_state ctx; - setheader(&ctx, headernonce); + setheader(&ctx, headernonce, personal); uchar hash[WN/8]; return verifyrec(&ctx, indices, hash, WK); } diff --git a/equi_miner.cpp b/equi_miner.cpp index f019f13..8ca9415 100644 --- a/equi_miner.cpp +++ b/equi_miner.cpp @@ -43,8 +43,9 @@ int main(int argc, char **argv) { bool compress_sol = false; const char *header = ""; const char *hex = ""; - int c; - while ((c = getopt (argc, argv, "h:n:r:t:x:sc")) != -1) { + char personal[] = "ZcashPoW"; + int prefixlen, c; + while ((c = getopt (argc, argv, "h:n:p:r:t:x:sc")) != -1) { switch (c) { case 'h': header = optarg; @@ -52,6 +53,11 @@ int main(int argc, char **argv) { case 'n': nonce = atoi(optarg); break; + case 'p': + prefixlen = strlen(optarg); + assert(prefixlen <= 8); + memcpy((void *)personal, optarg, prefixlen); + break; case 'r': range = atoi(optarg); break; @@ -79,7 +85,7 @@ int main(int argc, char **argv) { #else assert(nthreads==1); #endif - printf("Looking for wagner-tree on (\"%s\",%d", hex ? "0x..." : header, nonce); + printf("Looking for wagner-tree on %s(\"%s\",%d", personal, hex ? "0x..." : header, nonce); if (range > 1) printf("-%d", nonce+range-1); printf(") with %d %d-bit digits and %d threads\n", NDIGITS, DIGITBITS, nthreads); @@ -103,7 +109,7 @@ int main(int argc, char **argv) { } for (int r = 0; r < range; r++) { ((u32 *)headernonce)[27] = htole32(nonce+r); - eq.setheadernonce(headernonce, sizeof(headernonce)); + eq.setheadernonce(headernonce, sizeof(headernonce), personal); for (int t = 0; t < nthreads; t++) { threads[t].id = t; threads[t].eq = &eq; diff --git a/equi_miner.h b/equi_miner.h index d5cf4df..7496440 100644 --- a/equi_miner.h +++ b/equi_miner.h @@ -370,14 +370,14 @@ struct equi { free(sols); } // prepare blake2b midstate for new run and initialize counters - void setheadernonce(const char *headernonce, const u32 len) { + void setheadernonce(const char *headernonce, const u32 len, const char *personalprefix = 0) { #ifdef ASM_BLAKE alignas(8) uchar alignheader[HEADERNONCELEN]; memcpy(alignheader, headernonce, len); assert(len == HEADERNONCELEN); Blake2PrepareMidstate4(&blake_ctx, alignheader); #else - setheader(&blake_ctx, headernonce); + setheader(&blake_ctx, headernonce, personalprefix); #endif nsols = bfull = hfull = 0; }