Skip to content

Commit

Permalink
add x11evo algo
Browse files Browse the repository at this point in the history
Signed-off-by: Tanguy Pruvot <[email protected]>
  • Loading branch information
tpruvot committed May 31, 2016
1 parent b971285 commit 22dd788
Show file tree
Hide file tree
Showing 9 changed files with 277 additions and 1 deletion.
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ cpuminer_SOURCES = \
algo/skein.c \
algo/skein2.c \
algo/s3.c \
algo/x11evo.c \
algo/x11.c \
algo/x13.c \
algo/x14.c \
Expand Down
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Version 1.3 (Tanguy Pruvot)
- Add decred algo
- Add x11evo algo
- Enhance Blake2-S
- Stratum benchmarks support

Version 1.2 (Tanguy Pruvot)
- Add cryptonight-light (Aeon)
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Algorithms
*__skein2__ (Woodcoin)
*__s3__ (OneCoin)
*__vanilla__ (Blake-256 8-rounds - double sha256 [VNL])
*__x11evo__ (Revolver [XRE])
*__x11__ (Darkcoin [DRK], Hirocoin, Limecoin, ...)
*__x13__ (Sherlockcoin, [ACE], [B2B], [GRC], [XHC], ...)
*__x14__ (X14, Webcoin [WEB])
Expand Down Expand Up @@ -91,7 +92,7 @@ _OR_
* make

#### Note for Debian/Ubuntu users:
* apt-get install autoconf pkg-config libcurl4-openssl-dev libjansson-dev libssl-dev libgmp-dev
* apt-get install automake autoconf pkg-config libcurl4-openssl-dev libjansson-dev libssl-dev libgmp-dev

#### Notes for AIX users:
* To build a 64-bit binary, export OBJECT_MODE=64
Expand Down
256 changes: 256 additions & 0 deletions algo/x11evo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
/**
* X11EVO algo implementation
*
* Trivial implementation by tpruvot@github May 2016
*/
#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>

enum Algo {
BLAKE = 0,
BMW,
GROESTL,
SKEIN,
JH,
KECCAK,
LUFFA,
CUBEHASH,
SHAVITE,
SIMD,
ECHO,
HASH_FUNC_COUNT
};

static void swap8(uint8_t *a, uint8_t *b)
{
uint8_t t = *a;
*a = *b;
*b = t;
}

static void initPerm(uint8_t n[], int count)
{
for (int i = 0; i < count; i++)
n[i] = i;
}

static int nextPerm(uint8_t n[], int count)
{
int tail, i, j;

if (count <= 1)
return 0;

for (i = count - 1; i>0 && n[i - 1] >= n[i]; i--);
tail = i;

if (tail > 0) {
for (j = count - 1; j>tail && n[j] <= n[tail - 1]; j--);
swap8(&n[tail - 1], &n[j]);
}

for (i = tail, j = count - 1; i<j; i++, j--)
swap8(&n[i], &n[j]);

return (tail != 0);
}

static void getAlgoString(char *str, int seq)
{
uint8_t algoList[HASH_FUNC_COUNT];
char *sptr;

initPerm(algoList, HASH_FUNC_COUNT);

for (int k = 0; k < seq; k++) {
nextPerm(algoList, HASH_FUNC_COUNT);
}

sptr = str;
for (int j = 0; j < HASH_FUNC_COUNT; j++) {
if (algoList[j] >= 10)
sprintf(sptr, "%c", 'A' + (algoList[j] - 10));
else
sprintf(sptr, "%u", (uint32_t) algoList[j]);
sptr++;
}
*sptr = '\0';
}

static __thread uint32_t s_ntime = 0;
static char hashOrder[HASH_FUNC_COUNT + 1] = { 0 };
static int s_sequence = -1;

#define INITIAL_DATE 0x57254700
static inline int getCurrentAlgoSeq(uint32_t current_time)
{
// change once per day
return (int) (current_time - INITIAL_DATE) / (60 * 60 * 24);
}

static void evo_twisted_code(uint32_t ntime, char *permstr)
{
int seq = getCurrentAlgoSeq(ntime);
if (s_sequence != seq) {
getAlgoString(permstr, seq);
s_sequence = seq;
}
}

void x11evo_hash(void *output, const void *input)
{
uint32_t hash[64/4];
uint32_t len = 80;

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;

if (s_sequence == -1) {
uint32_t *data = (uint32_t*) input;
const uint32_t ntime = data[17];
evo_twisted_code(ntime, hashOrder);
}

void *in = (void*) input;
int size = len;

const int hashes = (int) strlen(hashOrder);

for (int i = 0; i < hashes; i++)
{
const char elem = hashOrder[i];
uint8_t algo = elem >= 'A' ? elem - 'A' + 10 : elem - '0';

if (i > 0) {
in = (void*) hash;
size = 64;
}

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;
}
}

memcpy(output, hash, 32);
}

int scanhash_x11evo(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);

if (s_ntime != pdata[17] || s_sequence == -1) {
uint32_t ntime = swab32(pdata[17]);
evo_twisted_code(ntime, hashOrder);
s_ntime = ntime;
if (opt_debug) applog(LOG_DEBUG, "evo hash order %s (%08x)", hashOrder, ntime);
}

if (opt_benchmark)
ptarget[7] = 0x0cff;

for (int k=0; k < 19; k++)
be32enc(&endiandata[k], pdata[k]);

do {
be32enc(&endiandata[19], nonce);
x11evo_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;
}
7 changes: 7 additions & 0 deletions cpu-miner.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ enum algos {
ALGO_SKEIN2, /* Double skein (Woodcoin) */
ALGO_S3, /* S3 */
ALGO_VANILLA, /* Vanilla (Blake256 8-rounds - double sha256) */
ALGO_X11EVO, /* Permuted X11 */
ALGO_X11, /* X11 */
ALGO_X13, /* X13 */
ALGO_X14, /* X14 */
Expand Down Expand Up @@ -157,6 +158,7 @@ static const char *algo_names[] = {
"skein2",
"s3",
"vanilla",
"x11evo",
"x11",
"x13",
"x14",
Expand Down Expand Up @@ -302,6 +304,7 @@ Options:\n\
skein2 Double Skein (Woodcoin)\n\
s3 S3\n\
vanilla Blake-256 8-rounds\n\
x11evo Permuted x11\n\
x11 X11\n\
x13 X13\n\
x14 X14\n\
Expand Down Expand Up @@ -2043,6 +2046,7 @@ static void *miner_thread(void *userdata)
case ALGO_GROESTL:
case ALGO_MYR_GR:
case ALGO_SIB:
case ALGO_X11EVO:
case ALGO_X11:
case ALGO_X13:
case ALGO_X14:
Expand Down Expand Up @@ -2189,6 +2193,9 @@ static void *miner_thread(void *userdata)
case ALGO_VANILLA:
rc = scanhash_blakecoin(thr_id, &work, max_nonce, &hashes_done);
break;
case ALGO_X11EVO:
rc = scanhash_x11evo(thr_id, &work, max_nonce, &hashes_done);
break;
case ALGO_X11:
rc = scanhash_x11(thr_id, &work, max_nonce, &hashes_done);
break;
Expand Down
1 change: 1 addition & 0 deletions cpuminer.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@
<ClCompile Include="algo\sibcoin.c" />
<ClCompile Include="algo\skein.c" />
<ClCompile Include="algo\skein2.c" />
<ClCompile Include="algo\x11evo.c" />
<ClCompile Include="algo\x11.c" />
<ClCompile Include="algo\x13.c" />
<ClCompile Include="algo\x14.c" />
Expand Down
3 changes: 3 additions & 0 deletions cpuminer.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,9 @@
<ClCompile Include="algo\skein.c">
<Filter>algo</Filter>
</ClCompile>
<ClCompile Include="algo\x11evo.c">
<Filter>algo</Filter>
</ClCompile>
<ClCompile Include="algo\x11.c">
<Filter>algo</Filter>
</ClCompile>
Expand Down
2 changes: 2 additions & 0 deletions miner.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ int scanhash_sib(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *ha
int scanhash_skein(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
int scanhash_skein2(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
int scanhash_s3(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
int scanhash_x11evo(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
int scanhash_x11(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done);
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);
Expand Down Expand Up @@ -508,6 +509,7 @@ void sibhash(void *output, const void *input);
void skeinhash(void *state, const void *input);
void skein2hash(void *state, const void *input);
void s3hash(void *output, const void *input);
void x11evo_hash(void *output, const void *input);
void x11hash(void *output, const void *input);
void x13hash(void *output, const void *input);
void x14hash(void *output, const void *input);
Expand Down
3 changes: 3 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -2404,6 +2404,9 @@ void print_hash_tests(void)
s3hash(&hash[0], &buf[0]);
printpfx("s3", hash);

x11evo_hash(&hash[0], &buf[0]);
printpfx("x11evo", hash);

x11hash(&hash[0], &buf[0]);
printpfx("x11", hash);

Expand Down

0 comments on commit 22dd788

Please sign in to comment.