Compare commits

...

7 Commits

Author SHA1 Message Date
Jay D Dee
c0aadbcc99 v3.12.6 2020-03-05 18:43:20 -05:00
Jay D Dee
3da149418a v3.12.5 2020-03-01 13:18:17 -05:00
Jay D Dee
720610cce5 v3.12.4.6 2020-02-28 18:20:32 -05:00
Jay D Dee
cedcf4d070 v3.12.4.5 2020-02-28 02:42:22 -05:00
Jay D Dee
81b50c3c71 v3.12.4.4 2020-02-25 14:07:32 -05:00
Jay D Dee
0e1e88f53e v3.12.4.3 2020-02-24 21:35:19 -05:00
Jay D Dee
45c77a5c81 v3.12.4.2 2020-02-23 15:31:06 -05:00
9 changed files with 724 additions and 621 deletions

View File

@@ -37,25 +37,25 @@ Requirements
------------ ------------
1. A x86_64 architecture CPU with a minimum of SSE2 support. This includes 1. A x86_64 architecture CPU with a minimum of SSE2 support. This includes
Intel Core2 and newer and AMD equivalents. In order to take advantage of AES_NI Intel Core2 and newer and AMD equivalents. Further optimizations are available
optimizations a CPU with AES_NI is required. This includes Intel Westmere on some algoritms for CPUs with AES, AVX, AVX2, SHA, AVX512 and VAES.
and newer and AMD equivalents. Further optimizations are available on some
algoritms for CPUs with AVX and AVX2, Sandybridge and Haswell respectively.
Older CPUs are supported by cpuminer-multi by TPruvot but at reduced Older CPUs are supported by cpuminer-multi by TPruvot but at reduced
performance. performance.
ARM CPUs are not supported. ARM and Aarch64 CPUs are not supported.
2. 64 bit Linux OS. Ubuntu and Fedora based distributions, including Mint and 2. 64 bit Linux or Windows OS. Ubuntu and Fedora based distributions,
Centos, are known to work and have all dependencies in their repositories. including Mint and Centos, are known to work and have all dependencies
Others may work but may require more effort. Older versions such as Centos 6 in their repositories. Others may work but may require more effort. Older
don't work due to missing features. versions such as Centos 6 don't work due to missing features.
64 bit Windows OS is supported with mingw_w64 and msys or pre-built binaries. 64 bit Windows OS is supported with mingw_w64 and msys or pre-built binaries.
MacOS, OSx and Android are not supported. MacOS, OSx and Android are not supported.
3. Stratum pool. Some algos may work wallet mining using getwork or GBT. YMMV. 3. Stratum pool supporting stratum+tcp:// or stratum+ssl:// protocols or
RPC getwork using http:// or https://.
GBT is YMMV.
Supported Algorithms Supported Algorithms
-------------------- --------------------
@@ -152,6 +152,27 @@ Supported Algorithms
yespower-b2b generic yespower + blake2b yespower-b2b generic yespower + blake2b
zr5 Ziftr zr5 Ziftr
Many variations of scrypt based algos can be mine by specifying their
parameters:
scryptn2: --algo scrypt --param-n 1048576
cpupower: --algo yespower --param-key "CPUpower: The number of CPU working or available for proof-of-work mining"
power2b: --algo yespower-b2b --param-n 2048 --param-r 32 --param-key "Now I am become Death, the destroyer of worlds"
sugarchain: --algo yespower --param-n 2048 -param-r 32 --param-key "Satoshi Nakamoto 31/Oct/2008 Proof-of-work is essentially one-CPU-one-vote"
yespoweriots: --algo yespower --param-n 2048 --param-key "Iots is committed to the development of IOT"
yespowerlitb: --algo yespower --param-n 2048 --param-r 32 --param-key "LITBpower: The number of LITB working or available for proof-of-work mini"
yespoweric: --algo yespower --param-n 2048 --param-r 32 --param-key "IsotopeC"
yespowerurx: --algo yespower --param-n 2048 --param-r 32 --param-key "UraniumX"
yespowerltncg: --algo yespower --param-n 2048 --param-r 32 --param-key "LTNCGYES"
Errata Errata
------ ------

View File

@@ -65,6 +65,77 @@ If not what makes it happen or not happen?
Change Log Change Log
---------- ----------
v3.12.6
Issue #246: improved stale share detection for getwork.
Improved precision of target_to_diff conversion from 4 digits to 20+.
Display hash and target debug data for all rejected shares.
A graphical representation of CPU affinity is displayed when using --threads.
Added highest and lowest accepted share to summary log.
Other small changes to logs to improve consistency and clarity.
v3.12.5
Issues #246 & #251: fixed incorrect share diff for stratum and getwork,
fixed incorrect target diff for getwork. Stats should now be correct for
getwork as well as stratum.
Getwork: reduce stale blocks, faster response to new work.
Added ntime to new job/work logs.
README.md now lists the parameters for yespower variations that don't have
a specific algo name.
v3.12.4.6
Issue #246: fixed getwork repeated new block logs with same height. New work
for the same block is now reported as "New work" instead of New block".
Also added a check that work is new before generating "New work" log.
Added target diff to getwork new block log.
Changed share ratio in share result log to simple fraction, no longer %.
Added debug log to display mininginfo, use -D.
v3.12.4.5
Issue #246: better stale share detection for getwork, and enhanced logging
of stale shares for stratum & getwork.
Issue #251: fixed incorrect share difficulty and share ratio in share
result log.
Changed submit log to include share diff and block height.
Small cosmetic changes to logs.
v3.12.4.4
Issue #246: Fixed net hashrate in getwork block log,
removed duplicate getwork block log,
other small tweaks to stats logs for getwork.
Issue #248: Fixed chronic stale shares with scrypt:1048576 (scryptn2).
v3.12.4.3
Fixed segfault in new block log for getwork.
Disabled silent discarding of stale work after the submit is logged.
v3.12.4.2
Issue #245: fixed getwork stale shares, solo mining with getwork now works.
Issue #246: implemented block and summary logs for getwork.
v3.12.4.1 v3.12.4.1
Issue #245: fix scantime when mining solo with getwork. Issue #245: fix scantime when mining solo with getwork.

View File

@@ -311,7 +311,7 @@ bool register_m7m_algo( algo_gate_t *gate )
{ {
gate->optimizations = SHA_OPT; gate->optimizations = SHA_OPT;
init_m7m_ctx(); init_m7m_ctx();
gate->scanhash = (void*)scanhash_m7m_hash; gate->scanhash = (void*)&scanhash_m7m_hash;
gate->build_stratum_request = (void*)&std_be_build_stratum_request; gate->build_stratum_request = (void*)&std_be_build_stratum_request;
gate->work_decode = (void*)&std_be_work_decode; gate->work_decode = (void*)&std_be_work_decode;
gate->submit_getwork_result = (void*)&std_be_submit_getwork_result; gate->submit_getwork_result = (void*)&std_be_submit_getwork_result;

View File

@@ -380,7 +380,7 @@ static inline void PBKDF2_SHA256_128_32_8way(uint32_t *tstate,
#endif /* HAVE_SHA256_8WAY */ #endif /* HAVE_SHA256_8WAY */
#if defined(USE_ASM) && defined(__x86_64__) //#if defined(USE_ASM) && defined(__x86_64__)
#define SCRYPT_MAX_WAYS 12 #define SCRYPT_MAX_WAYS 12
#define HAVE_SCRYPT_3WAY 1 #define HAVE_SCRYPT_3WAY 1
@@ -394,113 +394,6 @@ void scrypt_core_3way(uint32_t *X, uint32_t *V, int N);
void scrypt_core_6way(uint32_t *X, uint32_t *V, int N); void scrypt_core_6way(uint32_t *X, uint32_t *V, int N);
#endif #endif
#elif defined(USE_ASM) && defined(__i386__)
#define SCRYPT_MAX_WAYS 4
#define scrypt_best_throughput() 1
void scrypt_core(uint32_t *X, uint32_t *V, int N);
#elif defined(USE_ASM) && defined(__arm__) && defined(__APCS_32__)
void scrypt_core(uint32_t *X, uint32_t *V, int N);
#if defined(__ARM_NEON__)
#undef HAVE_SHA256_4WAY
#define SCRYPT_MAX_WAYS 3
#define HAVE_SCRYPT_3WAY 1
#define scrypt_best_throughput() 3
void scrypt_core_3way(uint32_t *X, uint32_t *V, int N);
#endif
#else
static inline void xor_salsa8(uint32_t B[16], const uint32_t Bx[16])
{
uint32_t x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15;
int i;
x00 = (B[ 0] ^= Bx[ 0]);
x01 = (B[ 1] ^= Bx[ 1]);
x02 = (B[ 2] ^= Bx[ 2]);
x03 = (B[ 3] ^= Bx[ 3]);
x04 = (B[ 4] ^= Bx[ 4]);
x05 = (B[ 5] ^= Bx[ 5]);
x06 = (B[ 6] ^= Bx[ 6]);
x07 = (B[ 7] ^= Bx[ 7]);
x08 = (B[ 8] ^= Bx[ 8]);
x09 = (B[ 9] ^= Bx[ 9]);
x10 = (B[10] ^= Bx[10]);
x11 = (B[11] ^= Bx[11]);
x12 = (B[12] ^= Bx[12]);
x13 = (B[13] ^= Bx[13]);
x14 = (B[14] ^= Bx[14]);
x15 = (B[15] ^= Bx[15]);
for (i = 0; i < 8; i += 2) {
#define R(a, b) (((a) << (b)) | ((a) >> (32 - (b))))
/* Operate on columns. */
x04 ^= R(x00+x12, 7); x09 ^= R(x05+x01, 7);
x14 ^= R(x10+x06, 7); x03 ^= R(x15+x11, 7);
x08 ^= R(x04+x00, 9); x13 ^= R(x09+x05, 9);
x02 ^= R(x14+x10, 9); x07 ^= R(x03+x15, 9);
x12 ^= R(x08+x04,13); x01 ^= R(x13+x09,13);
x06 ^= R(x02+x14,13); x11 ^= R(x07+x03,13);
x00 ^= R(x12+x08,18); x05 ^= R(x01+x13,18);
x10 ^= R(x06+x02,18); x15 ^= R(x11+x07,18);
/* Operate on rows. */
x01 ^= R(x00+x03, 7); x06 ^= R(x05+x04, 7);
x11 ^= R(x10+x09, 7); x12 ^= R(x15+x14, 7);
x02 ^= R(x01+x00, 9); x07 ^= R(x06+x05, 9);
x08 ^= R(x11+x10, 9); x13 ^= R(x12+x15, 9);
x03 ^= R(x02+x01,13); x04 ^= R(x07+x06,13);
x09 ^= R(x08+x11,13); x14 ^= R(x13+x12,13);
x00 ^= R(x03+x02,18); x05 ^= R(x04+x07,18);
x10 ^= R(x09+x08,18); x15 ^= R(x14+x13,18);
#undef R
}
B[ 0] += x00;
B[ 1] += x01;
B[ 2] += x02;
B[ 3] += x03;
B[ 4] += x04;
B[ 5] += x05;
B[ 6] += x06;
B[ 7] += x07;
B[ 8] += x08;
B[ 9] += x09;
B[10] += x10;
B[11] += x11;
B[12] += x12;
B[13] += x13;
B[14] += x14;
B[15] += x15;
}
static inline void scrypt_core(uint32_t *X, uint32_t *V, int N)
{
int i;
for (i = 0; i < N; i++) {
memcpy(&V[i * 32], X, 128);
xor_salsa8(&X[0], &X[16]);
xor_salsa8(&X[16], &X[0]);
}
for (i = 0; i < N; i++) {
uint32_t j = 32 * (X[16] & (N - 1));
for (uint8_t k = 0; k < 32; k++)
X[k] ^= V[j + k];
xor_salsa8(&X[0], &X[16]);
xor_salsa8(&X[16], &X[0]);
}
}
#endif
#ifndef SCRYPT_MAX_WAYS #ifndef SCRYPT_MAX_WAYS
#define SCRYPT_MAX_WAYS 1 #define SCRYPT_MAX_WAYS 1
#define scrypt_best_throughput() 1 #define scrypt_best_throughput() 1
@@ -511,8 +404,8 @@ unsigned char *scrypt_buffer_alloc(int N)
return (uchar*) malloc((size_t)N * SCRYPT_MAX_WAYS * 128 + 63); return (uchar*) malloc((size_t)N * SCRYPT_MAX_WAYS * 128 + 63);
} }
static void scrypt_1024_1_1_256(const uint32_t *input, uint32_t *output, static bool scrypt_1024_1_1_256(const uint32_t *input, uint32_t *output,
uint32_t *midstate, unsigned char *scratchpad, int N) uint32_t *midstate, unsigned char *scratchpad, int N, int thr_id )
{ {
uint32_t tstate[8], ostate[8]; uint32_t tstate[8], ostate[8];
uint32_t X[32]; uint32_t X[32];
@@ -527,11 +420,13 @@ static void scrypt_1024_1_1_256(const uint32_t *input, uint32_t *output,
scrypt_core(X, V, N); scrypt_core(X, V, N);
PBKDF2_SHA256_128_32(tstate, ostate, X, output); PBKDF2_SHA256_128_32(tstate, ostate, X, output);
return true;
} }
#ifdef HAVE_SHA256_4WAY #ifdef HAVE_SHA256_4WAY
static void scrypt_1024_1_1_256_4way(const uint32_t *input, static bool scrypt_1024_1_1_256_4way(const uint32_t *input,
uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N) uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N,
int thrid )
{ {
uint32_t _ALIGN(128) tstate[4 * 8]; uint32_t _ALIGN(128) tstate[4 * 8];
uint32_t _ALIGN(128) ostate[4 * 8]; uint32_t _ALIGN(128) ostate[4 * 8];
@@ -545,32 +440,43 @@ static void scrypt_1024_1_1_256_4way(const uint32_t *input,
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
W[4 * i + k] = input[k * 20 + i]; W[4 * i + k] = input[k * 20 + i];
for (i = 0; i < 8; i++)
for (i = 0; i < 8; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
tstate[4 * i + k] = midstate[i]; tstate[4 * i + k] = midstate[i];
HMAC_SHA256_80_init_4way(W, tstate, ostate);
PBKDF2_SHA256_80_128_4way(tstate, ostate, W, W); HMAC_SHA256_80_init_4way(W, tstate, ostate);
for (i = 0; i < 32; i++)
PBKDF2_SHA256_80_128_4way(tstate, ostate, W, W);
for (i = 0; i < 32; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
X[k * 32 + i] = W[4 * i + k]; X[k * 32 + i] = W[4 * i + k];
scrypt_core(X + 0 * 32, V, N);
scrypt_core(X + 0 * 32, V, N);
scrypt_core(X + 1 * 32, V, N); scrypt_core(X + 1 * 32, V, N);
scrypt_core(X + 2 * 32, V, N); scrypt_core(X + 2 * 32, V, N);
scrypt_core(X + 3 * 32, V, N); scrypt_core(X + 3 * 32, V, N);
for (i = 0; i < 32; i++)
for (i = 0; i < 32; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
W[4 * i + k] = X[k * 32 + i]; W[4 * i + k] = X[k * 32 + i];
PBKDF2_SHA256_128_32_4way(tstate, ostate, W, W);
for (i = 0; i < 8; i++) PBKDF2_SHA256_128_32_4way(tstate, ostate, W, W);
for (i = 0; i < 8; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
output[k * 8 + i] = W[4 * i + k]; output[k * 8 + i] = W[4 * i + k];
return true;
} }
#endif /* HAVE_SHA256_4WAY */ #endif /* HAVE_SHA256_4WAY */
#ifdef HAVE_SCRYPT_3WAY #ifdef HAVE_SCRYPT_3WAY
static void scrypt_1024_1_1_256_3way(const uint32_t *input, static bool scrypt_1024_1_1_256_3way(const uint32_t *input,
uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N) uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N,
int thrid )
{ {
uint32_t _ALIGN(64) tstate[3 * 8], ostate[3 * 8]; uint32_t _ALIGN(64) tstate[3 * 8], ostate[3 * 8];
uint32_t _ALIGN(64) X[3 * 32]; uint32_t _ALIGN(64) X[3 * 32];
@@ -581,23 +487,34 @@ static void scrypt_1024_1_1_256_3way(const uint32_t *input,
memcpy(tstate + 0, midstate, 32); memcpy(tstate + 0, midstate, 32);
memcpy(tstate + 8, midstate, 32); memcpy(tstate + 8, midstate, 32);
memcpy(tstate + 16, midstate, 32); memcpy(tstate + 16, midstate, 32);
HMAC_SHA256_80_init(input + 0, tstate + 0, ostate + 0);
HMAC_SHA256_80_init(input + 0, tstate + 0, ostate + 0);
HMAC_SHA256_80_init(input + 20, tstate + 8, ostate + 8); HMAC_SHA256_80_init(input + 20, tstate + 8, ostate + 8);
HMAC_SHA256_80_init(input + 40, tstate + 16, ostate + 16); HMAC_SHA256_80_init(input + 40, tstate + 16, ostate + 16);
PBKDF2_SHA256_80_128(tstate + 0, ostate + 0, input + 0, X + 0);
if ( work_restart[thrid].restart ) return false;
PBKDF2_SHA256_80_128(tstate + 0, ostate + 0, input + 0, X + 0);
PBKDF2_SHA256_80_128(tstate + 8, ostate + 8, input + 20, X + 32); PBKDF2_SHA256_80_128(tstate + 8, ostate + 8, input + 20, X + 32);
PBKDF2_SHA256_80_128(tstate + 16, ostate + 16, input + 40, X + 64); PBKDF2_SHA256_80_128(tstate + 16, ostate + 16, input + 40, X + 64);
scrypt_core_3way(X, V, N); if ( work_restart[thrid].restart ) return false;
PBKDF2_SHA256_128_32(tstate + 0, ostate + 0, X + 0, output + 0); scrypt_core_3way(X, V, N);
if ( work_restart[thrid].restart ) return false;
PBKDF2_SHA256_128_32(tstate + 0, ostate + 0, X + 0, output + 0);
PBKDF2_SHA256_128_32(tstate + 8, ostate + 8, X + 32, output + 8); PBKDF2_SHA256_128_32(tstate + 8, ostate + 8, X + 32, output + 8);
PBKDF2_SHA256_128_32(tstate + 16, ostate + 16, X + 64, output + 16); PBKDF2_SHA256_128_32(tstate + 16, ostate + 16, X + 64, output + 16);
return true;
} }
#ifdef HAVE_SHA256_4WAY #ifdef HAVE_SHA256_4WAY
static void scrypt_1024_1_1_256_12way(const uint32_t *input, static bool scrypt_1024_1_1_256_12way(const uint32_t *input,
uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N) uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N,
int thrid )
{ {
uint32_t _ALIGN(128) tstate[12 * 8]; uint32_t _ALIGN(128) tstate[12 * 8];
uint32_t _ALIGN(128) ostate[12 * 8]; uint32_t _ALIGN(128) ostate[12 * 8];
@@ -612,43 +529,60 @@ static void scrypt_1024_1_1_256_12way(const uint32_t *input,
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
W[128 * j + 4 * i + k] = input[80 * j + k * 20 + i]; W[128 * j + 4 * i + k] = input[80 * j + k * 20 + i];
for (j = 0; j < 3; j++)
for (j = 0; j < 3; j++)
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
tstate[32 * j + 4 * i + k] = midstate[i]; tstate[32 * j + 4 * i + k] = midstate[i];
HMAC_SHA256_80_init_4way(W + 0, tstate + 0, ostate + 0);
HMAC_SHA256_80_init_4way(W + 0, tstate + 0, ostate + 0);
HMAC_SHA256_80_init_4way(W + 128, tstate + 32, ostate + 32); HMAC_SHA256_80_init_4way(W + 128, tstate + 32, ostate + 32);
HMAC_SHA256_80_init_4way(W + 256, tstate + 64, ostate + 64); HMAC_SHA256_80_init_4way(W + 256, tstate + 64, ostate + 64);
PBKDF2_SHA256_80_128_4way(tstate + 0, ostate + 0, W + 0, W + 0);
if ( work_restart[thrid].restart ) return false;
PBKDF2_SHA256_80_128_4way(tstate + 0, ostate + 0, W + 0, W + 0);
PBKDF2_SHA256_80_128_4way(tstate + 32, ostate + 32, W + 128, W + 128); PBKDF2_SHA256_80_128_4way(tstate + 32, ostate + 32, W + 128, W + 128);
PBKDF2_SHA256_80_128_4way(tstate + 64, ostate + 64, W + 256, W + 256); PBKDF2_SHA256_80_128_4way(tstate + 64, ostate + 64, W + 256, W + 256);
for (j = 0; j < 3; j++)
if ( work_restart[thrid].restart ) return false;
for (j = 0; j < 3; j++)
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
X[128 * j + k * 32 + i] = W[128 * j + 4 * i + k]; X[128 * j + k * 32 + i] = W[128 * j + 4 * i + k];
scrypt_core_3way(X + 0 * 96, V, N);
scrypt_core_3way(X + 0 * 96, V, N);
scrypt_core_3way(X + 1 * 96, V, N); scrypt_core_3way(X + 1 * 96, V, N);
scrypt_core_3way(X + 2 * 96, V, N); scrypt_core_3way(X + 2 * 96, V, N);
scrypt_core_3way(X + 3 * 96, V, N); scrypt_core_3way(X + 3 * 96, V, N);
for (j = 0; j < 3; j++)
if ( work_restart[thrid].restart ) return false;
for (j = 0; j < 3; j++)
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
W[128 * j + 4 * i + k] = X[128 * j + k * 32 + i]; W[128 * j + 4 * i + k] = X[128 * j + k * 32 + i];
PBKDF2_SHA256_128_32_4way(tstate + 0, ostate + 0, W + 0, W + 0);
PBKDF2_SHA256_128_32_4way(tstate + 0, ostate + 0, W + 0, W + 0);
PBKDF2_SHA256_128_32_4way(tstate + 32, ostate + 32, W + 128, W + 128); PBKDF2_SHA256_128_32_4way(tstate + 32, ostate + 32, W + 128, W + 128);
PBKDF2_SHA256_128_32_4way(tstate + 64, ostate + 64, W + 256, W + 256); PBKDF2_SHA256_128_32_4way(tstate + 64, ostate + 64, W + 256, W + 256);
for (j = 0; j < 3; j++)
for (j = 0; j < 3; j++)
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
output[32 * j + k * 8 + i] = W[128 * j + 4 * i + k]; output[32 * j + k * 8 + i] = W[128 * j + 4 * i + k];
return true;
} }
#endif /* HAVE_SHA256_4WAY */ #endif /* HAVE_SHA256_4WAY */
#endif /* HAVE_SCRYPT_3WAY */ #endif /* HAVE_SCRYPT_3WAY */
#ifdef HAVE_SCRYPT_6WAY #ifdef HAVE_SCRYPT_6WAY
static void scrypt_1024_1_1_256_24way(const uint32_t *input, static bool scrypt_1024_1_1_256_24way( const uint32_t *input,
uint32_t *output, uint32_t *midstate, unsigned char *scratchpad, int N) uint32_t *output, uint32_t *midstate,
unsigned char *scratchpad, int N, int thrid )
{ {
uint32_t _ALIGN(128) tstate[24 * 8]; uint32_t _ALIGN(128) tstate[24 * 8];
uint32_t _ALIGN(128) ostate[24 * 8]; uint32_t _ALIGN(128) ostate[24 * 8];
@@ -657,41 +591,57 @@ static void scrypt_1024_1_1_256_24way(const uint32_t *input,
uint32_t *V; uint32_t *V;
int i, j, k; int i, j, k;
V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); V = (uint32_t *)( ( (uintptr_t)(scratchpad) + 63 ) & ~ (uintptr_t)(63) );
for (j = 0; j < 3; j++) for ( j = 0; j < 3; j++ )
for (i = 0; i < 20; i++) for ( i = 0; i < 20; i++ )
for (k = 0; k < 8; k++) for ( k = 0; k < 8; k++ )
W[8 * 32 * j + 8 * i + k] = input[8 * 20 * j + k * 20 + i]; W[8 * 32 * j + 8 * i + k] = input[8 * 20 * j + k * 20 + i];
for (j = 0; j < 3; j++)
for (i = 0; i < 8; i++) for ( j = 0; j < 3; j++ )
for (k = 0; k < 8; k++) for ( i = 0; i < 8; i++ )
for ( k = 0; k < 8; k++ )
tstate[8 * 8 * j + 8 * i + k] = midstate[i]; tstate[8 * 8 * j + 8 * i + k] = midstate[i];
HMAC_SHA256_80_init_8way(W + 0, tstate + 0, ostate + 0);
HMAC_SHA256_80_init_8way(W + 256, tstate + 64, ostate + 64); HMAC_SHA256_80_init_8way( W + 0, tstate + 0, ostate + 0 );
HMAC_SHA256_80_init_8way(W + 512, tstate + 128, ostate + 128); HMAC_SHA256_80_init_8way( W + 256, tstate + 64, ostate + 64 );
PBKDF2_SHA256_80_128_8way(tstate + 0, ostate + 0, W + 0, W + 0); HMAC_SHA256_80_init_8way( W + 512, tstate + 128, ostate + 128 );
PBKDF2_SHA256_80_128_8way(tstate + 64, ostate + 64, W + 256, W + 256);
PBKDF2_SHA256_80_128_8way(tstate + 128, ostate + 128, W + 512, W + 512); if ( work_restart[thrid].restart ) return false;
for (j = 0; j < 3; j++)
for (i = 0; i < 32; i++) PBKDF2_SHA256_80_128_8way( tstate + 0, ostate + 0, W + 0, W + 0 );
for (k = 0; k < 8; k++) PBKDF2_SHA256_80_128_8way( tstate + 64, ostate + 64, W + 256, W + 256 );
PBKDF2_SHA256_80_128_8way( tstate + 128, ostate + 128, W + 512, W + 512 );
if ( work_restart[thrid].restart ) return false;
for ( j = 0; j < 3; j++ )
for ( i = 0; i < 32; i++ )
for ( k = 0; k < 8; k++ )
X[8 * 32 * j + k * 32 + i] = W[8 * 32 * j + 8 * i + k]; X[8 * 32 * j + k * 32 + i] = W[8 * 32 * j + 8 * i + k];
scrypt_core_6way(X + 0 * 32, V, N);
scrypt_core_6way(X + 6 * 32, V, N); scrypt_core_6way( X + 0 * 32, V, N );
scrypt_core_6way(X + 12 * 32, V, N); scrypt_core_6way( X + 6 * 32, V, N );
scrypt_core_6way(X + 18 * 32, V, N); scrypt_core_6way( X + 12 * 32, V, N );
for (j = 0; j < 3; j++) scrypt_core_6way( X + 18 * 32, V, N );
for (i = 0; i < 32; i++)
for (k = 0; k < 8; k++) if ( work_restart[thrid].restart ) return false;
for ( j = 0; j < 3; j++ )
for ( i = 0; i < 32; i++ )
for ( k = 0; k < 8; k++ )
W[8 * 32 * j + 8 * i + k] = X[8 * 32 * j + k * 32 + i]; W[8 * 32 * j + 8 * i + k] = X[8 * 32 * j + k * 32 + i];
PBKDF2_SHA256_128_32_8way(tstate + 0, ostate + 0, W + 0, W + 0);
PBKDF2_SHA256_128_32_8way(tstate + 64, ostate + 64, W + 256, W + 256); PBKDF2_SHA256_128_32_8way( tstate + 0, ostate + 0, W + 0, W + 0 );
PBKDF2_SHA256_128_32_8way(tstate + 128, ostate + 128, W + 512, W + 512); PBKDF2_SHA256_128_32_8way( tstate + 64, ostate + 64, W + 256, W + 256 );
for (j = 0; j < 3; j++) PBKDF2_SHA256_128_32_8way( tstate + 128, ostate + 128, W + 512, W + 512 );
for (i = 0; i < 8; i++)
for (k = 0; k < 8; k++) for ( j = 0; j < 3; j++ )
for ( i = 0; i < 8; i++ )
for ( k = 0; k < 8; k++ )
output[8 * 8 * j + k * 8 + i] = W[8 * 32 * j + 8 * i + k]; output[8 * 8 * j + k * 8 + i] = W[8 * 32 * j + 8 * i + k];
return true;
} }
#endif /* HAVE_SCRYPT_6WAY */ #endif /* HAVE_SCRYPT_6WAY */
@@ -703,7 +653,6 @@ extern int scanhash_scrypt( struct work *work, uint32_t max_nonce,
uint32_t data[SCRYPT_MAX_WAYS * 20], hash[SCRYPT_MAX_WAYS * 8]; uint32_t data[SCRYPT_MAX_WAYS * 20], hash[SCRYPT_MAX_WAYS * 8];
uint32_t midstate[8]; uint32_t midstate[8];
uint32_t n = pdata[19] - 1; uint32_t n = pdata[19] - 1;
const uint32_t Htarg = ptarget[7];
int thr_id = mythr->id; // thr_id arg is deprecated int thr_id = mythr->id; // thr_id arg is deprecated
int throughput = scrypt_best_throughput(); int throughput = scrypt_best_throughput();
int i; int i;
@@ -714,6 +663,8 @@ extern int scanhash_scrypt( struct work *work, uint32_t max_nonce,
throughput *= 4; throughput *= 4;
#endif #endif
// applog(LOG_INFO,"Scrypt thoughput %d",throughput);
for (i = 0; i < throughput; i++) for (i = 0; i < throughput; i++)
memcpy(data + i * 20, pdata, 80); memcpy(data + i * 20, pdata, 80);
@@ -721,46 +672,50 @@ extern int scanhash_scrypt( struct work *work, uint32_t max_nonce,
sha256_transform(midstate, data, 0); sha256_transform(midstate, data, 0);
do { do {
bool rc = true;
for (i = 0; i < throughput; i++) for (i = 0; i < throughput; i++)
data[i * 20 + 19] = ++n; data[i * 20 + 19] = ++n;
#if defined(HAVE_SHA256_4WAY) #if defined(HAVE_SHA256_4WAY)
if (throughput == 4) if (throughput == 4)
scrypt_1024_1_1_256_4way(data, hash, midstate, rc = scrypt_1024_1_1_256_4way(data, hash, midstate,
scratchbuf, scratchbuf_size ); scratchbuf, scratchbuf_size, thr_id );
else else
#endif #endif
#if defined(HAVE_SCRYPT_3WAY) && defined(HAVE_SHA256_4WAY) #if defined(HAVE_SCRYPT_3WAY) && defined(HAVE_SHA256_4WAY)
if (throughput == 12) if (throughput == 12)
scrypt_1024_1_1_256_12way(data, hash, midstate, rc = scrypt_1024_1_1_256_12way(data, hash, midstate,
scratchbuf, scratchbuf_size ); scratchbuf, scratchbuf_size, thr_id );
else else
#endif #endif
#if defined(HAVE_SCRYPT_6WAY) #if defined(HAVE_SCRYPT_6WAY)
if (throughput == 24) if (throughput == 24)
scrypt_1024_1_1_256_24way(data, hash, midstate, rc = scrypt_1024_1_1_256_24way(data, hash, midstate,
scratchbuf, scratchbuf_size ); scratchbuf, scratchbuf_size, thr_id );
else else
#endif #endif
#if defined(HAVE_SCRYPT_3WAY) #if defined(HAVE_SCRYPT_3WAY)
if (throughput == 3) if (throughput == 3)
scrypt_1024_1_1_256_3way(data, hash, midstate, rc = scrypt_1024_1_1_256_3way(data, hash, midstate,
scratchbuf, scratchbuf_size ); scratchbuf, scratchbuf_size, thr_id );
else else
#endif #endif
scrypt_1024_1_1_256(data, hash, midstate, scratchbuf, rc = scrypt_1024_1_1_256(data, hash, midstate, scratchbuf,
scratchbuf_size ); scratchbuf_size, thr_id );
for (i = 0; i < throughput; i++) { if ( rc )
if (unlikely(hash[i * 8 + 7] <= Htarg && fulltest(hash + i * 8, ptarget))) { for ( i = 0; i < throughput; i++ )
{
if ( unlikely( valid_hash( hash + i * 8, ptarget ) ) )
{
pdata[19] = data[i * 20 + 19]; pdata[19] = data[i * 20 + 19];
submit_solution( work, hash, mythr ); submit_solution( work, hash + i * 8, mythr );
} }
}
} while ( likely( n < max_nonce && !(*restart) ) ); }
} while ( likely( ( n < ( max_nonce - throughput ) ) && !(*restart) ) );
*hashes_done = n - pdata[19] + 1; *hashes_done = n - pdata[19];
pdata[19] = n; pdata[19] = n;
return 0; return 0;
} }
@@ -779,7 +734,6 @@ bool register_scrypt_algo( algo_gate_t* gate )
gate->optimizations = SSE2_OPT | AVX2_OPT; gate->optimizations = SSE2_OPT | AVX2_OPT;
gate->miner_thread_init =(void*)&scrypt_miner_thread_init; gate->miner_thread_init =(void*)&scrypt_miner_thread_init;
gate->scanhash = (void*)&scanhash_scrypt; gate->scanhash = (void*)&scanhash_scrypt;
// gate->hash = (void*)&scrypt_1024_1_1_256_24way;
opt_target_factor = 65536.0; opt_target_factor = 65536.0;
if ( !opt_param_n ) if ( !opt_param_n )

20
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for cpuminer-opt 3.12.4.1. # Generated by GNU Autoconf 2.69 for cpuminer-opt 3.12.6.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='cpuminer-opt' PACKAGE_NAME='cpuminer-opt'
PACKAGE_TARNAME='cpuminer-opt' PACKAGE_TARNAME='cpuminer-opt'
PACKAGE_VERSION='3.12.4.1' PACKAGE_VERSION='3.12.6'
PACKAGE_STRING='cpuminer-opt 3.12.4.1' PACKAGE_STRING='cpuminer-opt 3.12.6'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@@ -1332,7 +1332,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures cpuminer-opt 3.12.4.1 to adapt to many kinds of systems. \`configure' configures cpuminer-opt 3.12.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1404,7 +1404,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of cpuminer-opt 3.12.4.1:";; short | recursive ) echo "Configuration of cpuminer-opt 3.12.6:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1509,7 +1509,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
cpuminer-opt configure 3.12.4.1 cpuminer-opt configure 3.12.6
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2012,7 +2012,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by cpuminer-opt $as_me 3.12.4.1, which was It was created by cpuminer-opt $as_me 3.12.6, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -2993,7 +2993,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='cpuminer-opt' PACKAGE='cpuminer-opt'
VERSION='3.12.4.1' VERSION='3.12.6'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -6690,7 +6690,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by cpuminer-opt $as_me 3.12.4.1, which was This file was extended by cpuminer-opt $as_me 3.12.6, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -6756,7 +6756,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
cpuminer-opt config.status 3.12.4.1 cpuminer-opt config.status 3.12.6
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,4 +1,4 @@
AC_INIT([cpuminer-opt], [3.12.4.1]) AC_INIT([cpuminer-opt], [3.12.6])
AC_PREREQ([2.59c]) AC_PREREQ([2.59c])
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM

File diff suppressed because it is too large Load Diff

29
miner.h
View File

@@ -312,6 +312,20 @@ int varint_encode( unsigned char *p, uint64_t n );
size_t address_to_script( unsigned char *out, size_t outsz, const char *addr ); size_t address_to_script( unsigned char *out, size_t outsz, const char *addr );
int timeval_subtract( struct timeval *result, struct timeval *x, int timeval_subtract( struct timeval *result, struct timeval *x,
struct timeval *y); struct timeval *y);
// Bitcoin formula for converting difficulty to an equivalent
// number of hashes.
//
// https://en.bitcoin.it/wiki/Difficulty
//
// hash = diff * 2**32
//
// diff_to_hash = 2**32 = 0x100000000 = 4294967296 = exp32;
const double exp32; // 2**32
const double exp48; // 2**48
const double exp64; // 2**64
bool fulltest( const uint32_t *hash, const uint32_t *target ); bool fulltest( const uint32_t *hash, const uint32_t *target );
bool valid_hash( const void*, const void* ); bool valid_hash( const void*, const void* );
@@ -332,11 +346,15 @@ struct thr_info {
//struct thr_info *thr_info; //struct thr_info *thr_info;
bool submit_solution( struct work *work, const void *hash, void test_hash_and_submit( struct work *work, const void *hash,
struct thr_info *thr ); struct thr_info *thr );
bool submit_lane_solution( struct work *work, const void *hash,
struct thr_info *thr, const int lane );
bool submit_solution( struct work *work, const void *hash,
struct thr_info *thr );
// deprecated
bool submit_lane_solution( struct work *work, const void *hash,
struct thr_info *thr, const int lane );
bool submit_work( struct thr_info *thr, const struct work *work_in ); bool submit_work( struct thr_info *thr, const struct work *work_in );
@@ -378,6 +396,7 @@ struct work {
size_t xnonce2_len; size_t xnonce2_len;
unsigned char *xnonce2; unsigned char *xnonce2;
bool sapling; bool sapling;
bool stale;
// x16rt // x16rt
uint32_t merkleroothash[8]; uint32_t merkleroothash[8];
@@ -854,7 +873,7 @@ Options:\n\
zr5 Ziftr\n\ zr5 Ziftr\n\
-N, --param-n N parameter for scrypt based algos\n\ -N, --param-n N parameter for scrypt based algos\n\
-R, --patam-r R parameter for scrypt based algos\n\ -R, --patam-r R parameter for scrypt based algos\n\
-K, --param-key Key parameter for algos that use it\n\ -K, --param-key Key (pers) parameter for algos that use it\n\
-o, --url=URL URL of mining server\n\ -o, --url=URL URL of mining server\n\
-O, --userpass=U:P username:password pair for mining server\n\ -O, --userpass=U:P username:password pair for mining server\n\
-u, --user=USERNAME username for mining server\n\ -u, --user=USERNAME username for mining server\n\

91
util.c
View File

@@ -983,6 +983,7 @@ int timeval_subtract(struct timeval *result, struct timeval *x,
return x->tv_sec < y->tv_sec; return x->tv_sec < y->tv_sec;
} }
// deprecated, use test_hash_and_submit
// Use this when deinterleaved // Use this when deinterleaved
// do 64 bit test 4 iterations // do 64 bit test 4 iterations
inline bool valid_hash( const void *hash, const void *target ) inline bool valid_hash( const void *hash, const void *target )
@@ -999,6 +1000,7 @@ inline bool valid_hash( const void *hash, const void *target )
return true; return true;
} }
// deprecated, use test_hash_and_submit
bool fulltest( const uint32_t *hash, const uint32_t *target ) bool fulltest( const uint32_t *hash, const uint32_t *target )
{ {
int i; int i;
@@ -1041,35 +1043,43 @@ bool fulltest( const uint32_t *hash, const uint32_t *target )
void diff_to_target(uint32_t *target, double diff) void diff_to_target(uint32_t *target, double diff)
{ {
uint64_t m; uint64_t m;
int k; int k;
const double exp64 = (double)0xffffffffffffffff + 1.;
for ( k = 3; k > 0 && diff > 1.0; k-- )
diff /= exp64;
// for (k = 6; k > 0 && diff > 1.0; k--) for (k = 6; k > 0 && diff > 1.0; k--)
// diff /= 4294967296.0; diff /= exp32;
m = (uint64_t)( 0xffff0000 / diff );
if unlikely( m == 0 && k == 3 ) // diff /= 4294967296.0;
memset( target, 0xff, 32 );
else // m = (uint64_t)(4294901760.0 / diff);
{
memset( target, 0, 32 ); m = (uint64_t)(exp32 / diff);
((uint64_t*)target)[k] = m;
// target[k] = (uint32_t)m; if (m == 0 && k == 6)
// target[k + 1] = (uint32_t)(m >> 32); memset(target, 0xff, 32);
} else {
memset(target, 0, 32);
target[k] = (uint32_t)m;
target[k + 1] = (uint32_t)(m >> 32);
}
} }
// Only used by stratum pools // deprecated
void work_set_target(struct work* work, double diff) void work_set_target(struct work* work, double diff)
{ {
diff_to_target( work->target, diff ); diff_to_target( work->target, diff );
work->targetdiff = diff; work->targetdiff = diff;
} }
// Only used by longpoll pools double target_to_diff( uint32_t* target )
{
uint64_t *targ = (uint64_t*)target;
// extract 64 bits from target[ 240:176 ]
uint64_t m = ( targ[3] << 16 ) | ( targ[2] >> 48 );
return m ? (exp48-1.) / (double)m : 0.;
}
/*
double target_to_diff(uint32_t* target) double target_to_diff(uint32_t* target)
{ {
uchar* tgt = (uchar*) target; uchar* tgt = (uchar*) target;
@@ -1083,11 +1093,13 @@ double target_to_diff(uint32_t* target)
(uint64_t)tgt[23] << 8 | (uint64_t)tgt[23] << 8 |
(uint64_t)tgt[22] << 0; (uint64_t)tgt[22] << 0;
if (!m) if (!m)
return 0.; return 0.;
else else
return (double)0x0000ffff00000000/m; return (double)0x0000ffff00000000/m;
} }
*/
#ifdef WIN32 #ifdef WIN32
#define socket_blocks() (WSAGetLastError() == WSAEWOULDBLOCK) #define socket_blocks() (WSAGetLastError() == WSAEWOULDBLOCK)
@@ -1546,35 +1558,44 @@ bool stratum_authorize(struct stratum_ctx *sctx, const char *user, const char *p
ret = true; ret = true;
if (!opt_extranonce) if ( !opt_extranonce )
goto out; goto out;
// subscribe to extranonce (optional) // subscribe to extranonce (optional)
sprintf(s, "{\"id\": 3, \"method\": \"mining.extranonce.subscribe\", \"params\": []}"); sprintf(s, "{\"id\": 3, \"method\": \"mining.extranonce.subscribe\", \"params\": []}");
if (!stratum_send_line(sctx, s)) if ( !stratum_send_line( sctx, s ) )
goto out; goto out;
if (!socket_full(sctx->sock, 3)) { if ( !socket_full( sctx->sock, 3 ) )
applog(LOG_WARNING, "stratum extranonce subscribe timed out"); {
goto out; applog( LOG_WARNING, "Extranonce disabled, subscribe timed out" );
opt_extranonce = false;
goto out;
} }
if ( !opt_quiet )
applog( LOG_INFO, "Extranonce subscription enabled" );
sret = stratum_recv_line(sctx); sret = stratum_recv_line( sctx );
if (sret) { if ( sret )
json_t *extra = JSON_LOADS(sret, &err); {
if (!extra) { json_t *extra = JSON_LOADS( sret, &err );
if ( !extra )
{
applog(LOG_WARNING, "JSON decode failed(%d): %s", err.line, err.text); applog(LOG_WARNING, "JSON decode failed(%d): %s", err.line, err.text);
} else { }
if (json_integer_value(json_object_get(extra, "id")) != 3) { else
{
if ( json_integer_value(json_object_get( extra, "id" ) ) != 3 )
{
// we receive a standard method if extranonce is ignored // we receive a standard method if extranonce is ignored
if (!stratum_handle_method(sctx, sret)) if ( !stratum_handle_method( sctx, sret ) )
applog(LOG_WARNING, "Stratum answer id is not correct!"); applog( LOG_WARNING, "Stratum answer id is not correct!" );
} }
res_val = json_object_get(extra, "result"); res_val = json_object_get( extra, "result" );
// if (opt_debug && (!res_val || json_is_false(res_val))) // if (opt_debug && (!res_val || json_is_false(res_val)))
// applog(LOG_DEBUG, "extranonce subscribe not supported"); // applog(LOG_DEBUG, "extranonce subscribe not supported");
json_decref(extra); json_decref( extra );
} }
free(sret); free(sret);
} }