]> Git Repo - cpuminer-multi.git/commitdiff
x16r algo: beware, this algo hashrate is not constant
authorTanguy Pruvot <[email protected]>
Fri, 12 Jan 2018 16:27:59 +0000 (17:27 +0100)
committerTanguy Pruvot <[email protected]>
Tue, 16 Jan 2018 11:27:35 +0000 (12:27 +0100)
unlike timetravel, a fast algo can be used 16 times in theory

Signed-off-by: Tanguy Pruvot <[email protected]>
Makefile.am
NEWS
README.md
algo/x16r.c [new file with mode: 0644]
cpu-miner.c
cpuminer.vcxproj
cpuminer.vcxproj.filters
miner.h
util.c

index 3e0294aedc4a66f5aa044e1ebd81108567af169e..0cc6ff1a17ce08a47b6729eea7336b00869de4a4 100644 (file)
@@ -99,6 +99,7 @@ cpuminer_SOURCES = \
   algo/x13.c \
   algo/x14.c \
   algo/x15.c \
+  algo/x16r.c \
   algo/x17.c \
   algo/xevan.c \
   algo/yescrypt.c \
diff --git a/NEWS b/NEWS
index 0509caf8281e05bc307e47996c3de1a3d34f9d56..b941ab9201b9290884b41366afff105f52804781 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,6 @@
 Version 1.3.3
 - Add tribus algo
+- Add x16r algo
 
 Version 1.3.2
 - Add bitcore algo
index c81eeef3dd75f380f7bfa2af0a87da04e82ebd69..250774ae12d309041ae4892ed63e51f4faf141e6 100644 (file)
--- a/README.md
+++ b/README.md
@@ -62,6 +62,7 @@ Algorithms
  * ✓ __x13__ (Sherlockcoin, [ACE], [B2B], [GRC], [XHC], ...)
  * ✓ __x14__ (X14, Webcoin [WEB])
  * ✓ __x15__ (RadianceCoin [RCE])
+ * ✓ __x16r__ (Ravencoin [RVN])
  * ✓ __x17__ (Verge [XVG])
  * ✓ __yescrypt__ (GlobalBoostY [BSTY], Unitus [UIS], MyriadCoin [MYR])
  * ✓ __zr5__ (Ziftrcoin [ZRC])
diff --git a/algo/x16r.c b/algo/x16r.c
new file mode 100644 (file)
index 0000000..f6f3608
--- /dev/null
@@ -0,0 +1,230 @@
+/**
+ * x16r algo implementation
+ *
+ * Implementation by tpruvot@github Jan 2018
+ */
+#include "miner.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sha3/sph_blake.h>
+#include <sha3/sph_bmw.h>
+#include <sha3/sph_groestl.h>
+#include <sha3/sph_jh.h>
+#include <sha3/sph_keccak.h>
+#include <sha3/sph_skein.h>
+#include <sha3/sph_luffa.h>
+#include <sha3/sph_cubehash.h>
+#include <sha3/sph_shavite.h>
+#include <sha3/sph_simd.h>
+#include <sha3/sph_echo.h>
+#include <sha3/sph_hamsi.h>
+#include <sha3/sph_fugue.h>
+#include <sha3/sph_shabal.h>
+#include <sha3/sph_whirlpool.h>
+#include <sha3/sph_sha2.h>
+
+enum Algo {
+       BLAKE = 0,
+       BMW,
+       GROESTL,
+       JH,
+       KECCAK,
+       SKEIN,
+       LUFFA,
+       CUBEHASH,
+       SHAVITE,
+       SIMD,
+       ECHO,
+       HAMSI,
+       FUGUE,
+       SHABAL,
+       WHIRLPOOL,
+       SHA512,
+       HASH_FUNC_COUNT
+};
+
+static __thread uint32_t s_ntime = UINT32_MAX;
+static __thread char hashOrder[HASH_FUNC_COUNT + 1] = { 0 };
+
+static void getAlgoString(const uint8_t* prevblock, char *output)
+{
+       char *sptr = output;
+       for (int j = 0; j < HASH_FUNC_COUNT; j++) {
+               uint8_t b = (15 - j) >> 1; // 16 first ascii hex chars (lsb in uint256)
+               uint8_t algoDigit = (j & 1) ? prevblock[b] & 0xF : prevblock[b] >> 4;
+               if (algoDigit >= 10)
+                       sprintf(sptr, "%c", 'A' + (algoDigit - 10));
+               else
+                       sprintf(sptr, "%u", (uint32_t) algoDigit);
+               sptr++;
+       }
+       *sptr = '\0';
+}
+
+void x16r_hash(void* output, const void* input)
+{
+       uint32_t _ALIGN(128) hash[64/4];
+
+       sph_blake512_context     ctx_blake;
+       sph_bmw512_context       ctx_bmw;
+       sph_groestl512_context   ctx_groestl;
+       sph_skein512_context     ctx_skein;
+       sph_jh512_context        ctx_jh;
+       sph_keccak512_context    ctx_keccak;
+       sph_luffa512_context     ctx_luffa1;
+       sph_cubehash512_context  ctx_cubehash1;
+       sph_shavite512_context   ctx_shavite1;
+       sph_simd512_context      ctx_simd1;
+       sph_echo512_context      ctx_echo1;
+       sph_hamsi512_context     ctx_hamsi1;
+       sph_fugue512_context     ctx_fugue1;
+       sph_shabal512_context    ctx_shabal1;
+       sph_whirlpool_context    ctx_whirlpool1;
+       sph_sha512_context       ctx_sha512;
+
+       void *in = (void*) input;
+       int size = 80;
+
+       if (s_ntime == UINT32_MAX) {
+               const uint8_t* in8 = (uint8_t*) input;
+               getAlgoString(&in8[4], hashOrder);
+       }
+
+       for (int i = 0; i < 16; i++)
+       {
+               const char elem = hashOrder[i];
+               const uint8_t algo = elem >= 'A' ? elem - 'A' + 10 : elem - '0';
+
+               switch (algo) {
+               case BLAKE:
+                       sph_blake512_init(&ctx_blake);
+                       sph_blake512(&ctx_blake, in, size);
+                       sph_blake512_close(&ctx_blake, hash);
+                       break;
+               case BMW:
+                       sph_bmw512_init(&ctx_bmw);
+                       sph_bmw512(&ctx_bmw, in, size);
+                       sph_bmw512_close(&ctx_bmw, hash);
+                       break;
+               case GROESTL:
+                       sph_groestl512_init(&ctx_groestl);
+                       sph_groestl512(&ctx_groestl, in, size);
+                       sph_groestl512_close(&ctx_groestl, hash);
+                       break;
+               case SKEIN:
+                       sph_skein512_init(&ctx_skein);
+                       sph_skein512(&ctx_skein, in, size);
+                       sph_skein512_close(&ctx_skein, hash);
+                       break;
+               case JH:
+                       sph_jh512_init(&ctx_jh);
+                       sph_jh512(&ctx_jh, in, size);
+                       sph_jh512_close(&ctx_jh, hash);
+                       break;
+               case KECCAK:
+                       sph_keccak512_init(&ctx_keccak);
+                       sph_keccak512(&ctx_keccak, in, size);
+                       sph_keccak512_close(&ctx_keccak, hash);
+                       break;
+               case LUFFA:
+                       sph_luffa512_init(&ctx_luffa1);
+                       sph_luffa512(&ctx_luffa1, in, size);
+                       sph_luffa512_close(&ctx_luffa1, hash);
+                       break;
+               case CUBEHASH:
+                       sph_cubehash512_init(&ctx_cubehash1);
+                       sph_cubehash512(&ctx_cubehash1, in, size);
+                       sph_cubehash512_close(&ctx_cubehash1, hash);
+                       break;
+               case SHAVITE:
+                       sph_shavite512_init(&ctx_shavite1);
+                       sph_shavite512(&ctx_shavite1, in, size);
+                       sph_shavite512_close(&ctx_shavite1, hash);
+                       break;
+               case SIMD:
+                       sph_simd512_init(&ctx_simd1);
+                       sph_simd512(&ctx_simd1, in, size);
+                       sph_simd512_close(&ctx_simd1, hash);
+                       break;
+               case ECHO:
+                       sph_echo512_init(&ctx_echo1);
+                       sph_echo512(&ctx_echo1, in, size);
+                       sph_echo512_close(&ctx_echo1, hash);
+                       break;
+               case HAMSI:
+                       sph_hamsi512_init(&ctx_hamsi1);
+                       sph_hamsi512(&ctx_hamsi1, in, size);
+                       sph_hamsi512_close(&ctx_hamsi1, hash);
+                       break;
+               case FUGUE:
+                       sph_fugue512_init(&ctx_fugue1);
+                       sph_fugue512(&ctx_fugue1, in, size);
+                       sph_fugue512_close(&ctx_fugue1, hash);
+                       break;
+               case SHABAL:
+                       sph_shabal512_init(&ctx_shabal1);
+                       sph_shabal512(&ctx_shabal1, in, size);
+                       sph_shabal512_close(&ctx_shabal1, hash);
+                       break;
+               case WHIRLPOOL:
+                       sph_whirlpool_init(&ctx_whirlpool1);
+                       sph_whirlpool(&ctx_whirlpool1, in, size);
+                       sph_whirlpool_close(&ctx_whirlpool1, hash);
+                       break;
+               case SHA512:
+                       sph_sha512_init(&ctx_sha512);
+                       sph_sha512(&ctx_sha512,(const void*) in, size);
+                       sph_sha512_close(&ctx_sha512,(void*) hash);
+                       break;
+               }
+               in = (void*) hash;
+               size = 64;
+       }
+       memcpy(output, hash, 32);
+}
+
+int scanhash_x16r(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done)
+{
+       uint32_t _ALIGN(128) hash32[8];
+       uint32_t _ALIGN(128) endiandata[20];
+       uint32_t *pdata = work->data;
+       uint32_t *ptarget = work->target;
+       const uint32_t Htarg = ptarget[7];
+       const uint32_t first_nonce = pdata[19];
+       uint32_t nonce = first_nonce;
+       volatile uint8_t *restart = &(work_restart[thr_id].restart);
+
+       for (int k=0; k < 19; k++)
+               be32enc(&endiandata[k], pdata[k]);
+
+       if (s_ntime != pdata[17]) {
+               uint32_t ntime = swab32(pdata[17]);
+               getAlgoString((const char*) (&endiandata[1]), hashOrder);
+               s_ntime = ntime;
+               if (opt_debug && !thr_id) applog(LOG_DEBUG, "hash order %s (%08x)", hashOrder, ntime);
+       }
+
+       if (opt_benchmark)
+               ptarget[7] = 0x0cff;
+
+       do {
+               be32enc(&endiandata[19], nonce);
+               x16r_hash(hash32, endiandata);
+
+               if (hash32[7] <= Htarg && fulltest(hash32, ptarget)) {
+                       work_set_target_ratio(work, hash32);
+                       pdata[19] = nonce;
+                       *hashes_done = pdata[19] - first_nonce;
+                       return 1;
+               }
+               nonce++;
+
+       } while (nonce < max_nonce && !(*restart));
+
+       pdata[19] = nonce;
+       *hashes_done = pdata[19] - first_nonce + 1;
+       return 0;
+}
index 9730fb62ba483c24cd698ea6e51d0a7fa4fcf9d4..53d1cc0d4d6f771debdea0d70d35e4e3144161b0 100644 (file)
@@ -124,6 +124,7 @@ enum algos {
        ALGO_X13,         /* X13 */
        ALGO_X14,         /* X14 */
        ALGO_X15,         /* X15 */
+       ALGO_X16R,
        ALGO_X17,         /* X17 */
        ALGO_XEVAN,
        ALGO_YESCRYPT,
@@ -179,6 +180,7 @@ static const char *algo_names[] = {
        "x13",
        "x14",
        "x15",
+       "x16r",
        "x17",
        "xevan",
        "yescrypt",
@@ -332,6 +334,7 @@ Options:\n\
                           x13          X13\n\
                           x14          X14\n\
                           x15          X15\n\
+                          x16r         X16R (Raven)\n\
                           x17          X17\n\
                           xevan        Xevan (BitSend)\n\
                           yescrypt     Yescrypt\n\
@@ -1800,6 +1803,7 @@ static void stratum_gen_work(struct stratum_ctx *sctx, struct work *work)
                        case ALGO_TIMETRAVEL:
                        case ALGO_BITCORE:
                        case ALGO_XEVAN:
+                       case ALGO_X16R:
                                work_set_target(work, sctx->job.diff / (256.0 * opt_diff_factor));
                                break;
                        case ALGO_KECCAK:
@@ -2144,6 +2148,7 @@ static void *miner_thread(void *userdata)
                        case ALGO_LBRY:
                        case ALGO_TRIBUS:
                        case ALGO_X15:
+                       case ALGO_X16R:
                        case ALGO_X17:
                        case ALGO_ZR5:
                                max64 = 0x1ffff;
@@ -2322,6 +2327,9 @@ static void *miner_thread(void *userdata)
                case ALGO_X15:
                        rc = scanhash_x15(thr_id, &work, max_nonce, &hashes_done);
                        break;
+               case ALGO_X16R:
+                       rc = scanhash_x16r(thr_id, &work, max_nonce, &hashes_done);
+                       break;
                case ALGO_X17:
                        rc = scanhash_x17(thr_id, &work, max_nonce, &hashes_done);
                        break;
index 141e9f080662b6eaa6a7f6073fce97ac71f1de15..aace24d93ae346dc3561ee5b10f354213e752d75 100644 (file)
     <ClCompile Include="algo\x13.c" />
     <ClCompile Include="algo\x14.c" />
     <ClCompile Include="algo\x15.c" />
+    <ClCompile Include="algo\x16r.c" />
     <ClCompile Include="algo\x17.c" />
     <ClCompile Include="algo\xevan.c" />
     <ClCompile Include="algo\yescrypt.c" />
index 707b9869f7a8b62b1c130dd62829aa524f4b973d..72321286882f754f6d8a8771be0461d330f059ee 100644 (file)
     <ClCompile Include="algo\x15.c">
       <Filter>algo</Filter>
     </ClCompile>
+    <ClCompile Include="algo\x16r.c">
+      <Filter>algo</Filter>
+    </ClCompile>
     <ClCompile Include="algo\x17.c">
       <Filter>algo</Filter>
     </ClCompile>
diff --git a/miner.h b/miner.h
index 45e9431c5bce7209936c7a17b251f598236ef3c6..e48bf7feb5b8f88d3308f81fb654e0ec9a67dea8 100644 (file)
--- a/miner.h
+++ b/miner.h
@@ -247,6 +247,7 @@ int scanhash_x11(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *ha
 int scanhash_x13(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
 int scanhash_x14(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
 int scanhash_x15(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
+int scanhash_x16r(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
 int scanhash_x17(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
 int scanhash_xevan(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
 int scanhash_yescrypt(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
@@ -533,6 +534,7 @@ void x11hash(void *output, const void *input);
 void x13hash(void *output, const void *input);
 void x14hash(void *output, const void *input);
 void x15hash(void *output, const void *input);
+void x16r_hash(void *output, const void *input);
 void x17hash(void *output, const void *input);
 void zr5hash(void *output, const void *input);
 void yescrypthash(void *output, const void *input);
diff --git a/util.c b/util.c
index 5cecf84316c984141684657bb472679e49867e11..1f987bf201a27bb452e35cf75d63e4b6ed8fba17 100644 (file)
--- a/util.c
+++ b/util.c
@@ -2456,6 +2456,9 @@ void print_hash_tests(void)
        x15hash(&hash[0], &buf[0]);
        printpfx("x15", hash);
 
+       x16r_hash(&hash[0], &buf[0]);
+       printpfx("x16r", hash);
+
        x17hash(&hash[0], &buf[0]);
        printpfx("x17", hash);
 
This page took 0.03883 seconds and 4 git commands to generate.