diff --git a/stratum/algos/exosis.c b/stratum/algos/exosis.c new file mode 100644 index 0000000..48a5477 --- /dev/null +++ b/stratum/algos/exosis.c @@ -0,0 +1,157 @@ +#include +#include +#include + +#define HASH_FUNC_BASE_TIMESTAMP 1538556426 // Exosis: Genesis Timestamp +#define HASH_FUNC_COUNT 8 +#define HASH_FUNC_COUNT_PERMUTATIONS 40320 + +#include +#include +#include +#include +#include +#include +#include +#include + + +#define _ALIGN(x) __attribute__ ((aligned(x))) + +// helpers +inline void swap(int *a, int *b) { + int c = *a; + *a = *b; + *b = c; +} + +static void reverse(int *pbegin, int *pend) { + while ( (pbegin != pend) && (pbegin != --pend) ) + swap(pbegin++, pend); +} + +static void next_permutation(int *pbegin, int *pend) { + if (pbegin == pend) + return; + + int *i = pbegin; + ++i; + if (i == pend) + return; + + i = pend; + --i; + + while (1) { + int *j = i; + --i; + + if (*i < *j) { + int *k = pend; + + while (!(*i < *--k)) + /* pass */; + + swap(i, k); + reverse(j, pend); + return; // true + } + + if (i == pbegin) { + reverse(pbegin, pend); + return; // false + } + } +} +// helpers + +void exosis_hash(const char* input, char* output, uint32_t len) +{ + uint32_t _ALIGN(64) hash[16 * HASH_FUNC_COUNT]; + uint32_t *hashA, *hashB; + uint32_t dataLen = 64; + uint32_t *work_data = (uint32_t *)input; + const uint32_t timestamp = work_data[17]; + + 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_luffa; + sph_cubehash512_context ctx_cubehash; + + // We want to permute algorithms. To get started we + // initialize an array with a sorted sequence of unique + // integers where every integer represents its own algorithm. + uint32_t permutation[HASH_FUNC_COUNT]; + for (uint32_t i = 0; i < HASH_FUNC_COUNT; i++) { + permutation[i]=i; + } + + // Compute the next permuation + uint32_t steps = (timestamp - HASH_FUNC_BASE_TIMESTAMP) % HASH_FUNC_COUNT_PERMUTATIONS; + for (uint32_t i = 0; i < steps; i++) { + next_permutation(permutation, permutation + HASH_FUNC_COUNT); + } + + for (uint32_t i = 0; i < HASH_FUNC_COUNT; i++) { + if (i == 0) { + dataLen = len; + hashA = work_data; + } else { + dataLen = 64; + hashA = &hash[16 * (i - 1)]; + } + hashB = &hash[16 * i]; + + switch(permutation[i]) { + case 0: + sph_blake512_init(&ctx_blake); + sph_blake512(&ctx_blake, hashA, dataLen); + sph_blake512_close(&ctx_blake, hashB); + break; + case 1: + sph_bmw512_init(&ctx_bmw); + sph_bmw512(&ctx_bmw, hashA, dataLen); + sph_bmw512_close(&ctx_bmw, hashB); + break; + case 2: + sph_groestl512_init(&ctx_groestl); + sph_groestl512(&ctx_groestl, hashA, dataLen); + sph_groestl512_close(&ctx_groestl, hashB); + break; + case 3: + sph_skein512_init(&ctx_skein); + sph_skein512(&ctx_skein, hashA, dataLen); + sph_skein512_close(&ctx_skein, hashB); + break; + case 4: + sph_jh512_init(&ctx_jh); + sph_jh512(&ctx_jh, hashA, dataLen); + sph_jh512_close(&ctx_jh, hashB); + break; + case 5: + sph_keccak512_init(&ctx_keccak); + sph_keccak512(&ctx_keccak, hashA, dataLen); + sph_keccak512_close(&ctx_keccak, hashB); + break; + case 6: + sph_luffa512_init(&ctx_luffa); + sph_luffa512(&ctx_luffa, hashA, dataLen); + sph_luffa512_close(&ctx_luffa, hashB); + break; + case 7: + sph_cubehash512_init(&ctx_cubehash); + sph_cubehash512(&ctx_cubehash, hashA, dataLen); + sph_cubehash512_close(&ctx_cubehash, hashB); + break; + default: + break; + } + } + + memcpy(output, &hash[16 * (HASH_FUNC_COUNT - 1)], 32); +} + diff --git a/stratum/algos/exosis.h b/stratum/algos/exosis.h new file mode 100644 index 0000000..fcda523 --- /dev/null +++ b/stratum/algos/exosis.h @@ -0,0 +1,16 @@ +#ifndef EXOSIS_H +#define EXOSIS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void exosis_hash(const char* input, char* output, uint32_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/stratum/algos/makefile b/stratum/algos/makefile index 6199ef2..6e23863 100644 --- a/stratum/algos/makefile +++ b/stratum/algos/makefile @@ -11,7 +11,7 @@ LDFLAGS=-O2 -lgmp SOURCES=lyra2re.c lyra2v2.c Lyra2.c lyra2z.c Lyra2-z.c Sponge.c allium.c \ c11.c x11.c x12.c x13.c hsr14.c sm3.c x14.c x15.c x17.c \ x22i.c SWIFFTX/SWIFFTX.c \ - blake.c blakecoin.c blake2s.c jha.c keccak.c lbry.c tribus.c \ + blake.c blakecoin.c blake2s.c jha.c keccak.c lbry.c tribus.c exosis.c \ deep.c fresh.c groestl.c neoscrypt.c nist5.c quark.c qubit.c skein.c skein2.c \ bitcore.c timetravel.c x11evo.c x16r.c x16s.c xevan.c bastion.c hmq17.c sonoa.c \ bmw.c luffa.c pentablake.c vitalium.c whirlpool.c whirlpoolx.c zr5.c \ diff --git a/stratum/config.sample/exosis.conf b/stratum/config.sample/exosis.conf new file mode 100644 index 0000000..3d54269 --- /dev/null +++ b/stratum/config.sample/exosis.conf @@ -0,0 +1,15 @@ +[TCP] +server = yaamp.com +port = 3557 +password = tu8tu5 + +[SQL] +host = yaampdb +database = yaamp +username = root +password = patofpaq + +[STRATUM] +algo = exosis +difficulty = 0.125 +max_ttf = 50000 diff --git a/stratum/stratum.cpp b/stratum/stratum.cpp index b5714c2..fa770df 100644 --- a/stratum/stratum.cpp +++ b/stratum/stratum.cpp @@ -129,6 +129,7 @@ YAAMP_ALGO g_algos[] = {"x16s", x16s_hash, 0x100, 0, 0}, {"timetravel", timetravel_hash, 0x100, 0, 0}, {"bitcore", timetravel10_hash, 0x100, 0, 0}, + {"exosis", exosis_hash, 0x100, 0, 0}, {"hsr", hsr_hash, 1, 0, 0}, {"hmq1725", hmq17_hash, 0x10000, 0, 0}, diff --git a/stratum/stratum.h b/stratum/stratum.h index f8bb179..5ed1b5a 100644 --- a/stratum/stratum.h +++ b/stratum/stratum.h @@ -209,3 +209,4 @@ void sha256_double_hash_hex(const char *input, char *output, unsigned int len); #include "algos/aergo.h" #include "algos/hex.h" #include "algos/argon2d-dyn.h" +#include "algos/exosis.h" diff --git a/web/yaamp/core/functions/yaamp.php b/web/yaamp/core/functions/yaamp.php index c98c04a..6c5d730 100755 --- a/web/yaamp/core/functions/yaamp.php +++ b/web/yaamp/core/functions/yaamp.php @@ -19,6 +19,7 @@ function yaamp_get_algos() 'blake2s', 'decred', 'deep', + 'exosis', 'hmq1725', 'keccak', 'keccakc', @@ -165,6 +166,7 @@ function getAlgoColors($algo) 'bastion' => '#e0b0b0', 'blake' => '#f0f0f0', 'blakecoin' => '#f0f0f0', + 'exosis' => '#49CCFE', 'groestl' => '#d0a0a0', 'jha' => '#a0d0c0', 'dmd-gr' => '#a0c0f0', @@ -225,6 +227,7 @@ function getAlgoPort($algo) 'scrypt' => 3433, 'timetravel' => 3555, 'bitcore' => 3556, + 'exosis' => 3557, 'c11' => 3573, 'deep' => 3535, 'x11' => 3533,