@ -792,6 +792,8 @@ static bool submit_upstream_work(CURL *curl, struct work *work)
be32enc ( & nonce , work - > data [ 19 ] ) ;
be32enc ( & nonce , work - > data [ 19 ] ) ;
break ;
break ;
case ALGO_DECRED :
case ALGO_DECRED :
be32enc ( & ntime , work - > data [ 34 ] ) ;
be32enc ( & nonce , work - > data [ 35 ] ) ;
break ;
break ;
case ALGO_BLAKE :
case ALGO_BLAKE :
case ALGO_BLAKECOIN :
case ALGO_BLAKECOIN :
@ -821,7 +823,12 @@ static bool submit_upstream_work(CURL *curl, struct work *work)
}
}
ntimestr = bin2hex ( ( const uchar * ) ( & ntime ) , 4 ) ;
ntimestr = bin2hex ( ( const uchar * ) ( & ntime ) , 4 ) ;
xnonce2str = bin2hex ( work - > xnonce2 , work - > xnonce2_len ) ;
if ( opt_algo = = ALGO_DECRED ) {
xnonce2str = bin2hex ( ( const uchar * ) & work - > data [ 36 ] , stratum . xnonce1_size ) ;
} else {
xnonce2str = bin2hex ( work - > xnonce2 , work - > xnonce2_len ) ;
}
// store to keep/display the solved ratio/diff
// store to keep/display the solved ratio/diff
stratum . sharediff = work - > sharediff ;
stratum . sharediff = work - > sharediff ;
@ -833,17 +840,19 @@ static bool submit_upstream_work(CURL *curl, struct work *work)
applog ( LOG_DEBUG , " share diff: %.5f (x %.1f) " ,
applog ( LOG_DEBUG , " share diff: %.5f (x %.1f) " ,
stratum . sharediff , work - > shareratio ) ;
stratum . sharediff , work - > shareratio ) ;
if ( opt_algo = = ALGO_HEAVY ) {
switch ( opt_algo ) {
case ALGO_HEAVY :
be16enc ( & nvote , * ( ( uint16_t * ) & work - > data [ 20 ] ) ) ;
be16enc ( & nvote , * ( ( uint16_t * ) & work - > data [ 20 ] ) ) ;
nvotestr = bin2hex ( ( const uchar * ) ( & nvote ) , 2 ) ;
nvotestr = bin2hex ( ( const uchar * ) ( & nvote ) , 2 ) ;
sprintf ( s ,
sprintf ( s , " { \" method \" : \" mining.submit \" , \" params \" : [ "
" { \" method \" : \" mining.submit \" , \" params \" : [ \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" ], \" id \" :4} " ,
" \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" ], \" id \" :4} " ,
pool - > user , work - > job_id + 8 , xnonce2str , ntimestr , noncestr , nvotestr ) ;
pool - > user , work - > job_id + 8 , xnonce2str , ntimestr , noncestr , nvotestr ) ;
free ( nvotestr ) ;
free ( nvotestr ) ;
} else {
break ;
sprintf ( s ,
default :
" { \" method \" : \" mining.submit \" , \" params \" : [ \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" ], \" id \" :4} " ,
sprintf ( s , " { \" method \" : \" mining.submit \" , \" params \" : [ "
pool - > user , work - > job_id + 8 , xnonce2str , ntimestr , noncestr ) ;
" \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" ], \" id \" :4} " ,
pool - > user , work - > job_id + 8 , xnonce2str , ntimestr , noncestr ) ;
}
}
free ( xnonce2str ) ;
free ( xnonce2str ) ;
free ( ntimestr ) ;
free ( ntimestr ) ;
@ -1311,7 +1320,8 @@ err_out:
static bool stratum_gen_work ( struct stratum_ctx * sctx , struct work * work )
static bool stratum_gen_work ( struct stratum_ctx * sctx , struct work * work )
{
{
uchar merkle_root [ 64 ] ;
uchar merkle_root [ 64 ] ;
int i ;
uchar extraheader [ 256 ] = { 0 } ;
int i , headersize = 0 ;
if ( ! sctx - > job . job_id ) {
if ( ! sctx - > job . job_id ) {
// applog(LOG_WARNING, "stratum_gen_work: job not yet retrieved");
// applog(LOG_WARNING, "stratum_gen_work: job not yet retrieved");
@ -1333,6 +1343,11 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work)
/* Generate merkle root */
/* Generate merkle root */
switch ( opt_algo ) {
switch ( opt_algo ) {
case ALGO_DECRED :
memcpy ( merkle_root , sctx - > job . coinbase , 32 ) ;
memcpy ( extraheader , & sctx - > job . coinbase [ 32 ] , ( int ) sctx - > job . coinbase_size - 32 ) ;
headersize = ( int ) sctx - > job . coinbase_size - 32 ;
break ;
case ALGO_HEAVY :
case ALGO_HEAVY :
case ALGO_MJOLLNIR :
case ALGO_MJOLLNIR :
heavycoin_hash ( merkle_root , sctx - > job . coinbase , ( int ) sctx - > job . coinbase_size ) ;
heavycoin_hash ( merkle_root , sctx - > job . coinbase , ( int ) sctx - > job . coinbase_size ) ;
@ -1353,7 +1368,7 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work)
memcpy ( merkle_root + 32 , sctx - > job . merkle [ i ] , 32 ) ;
memcpy ( merkle_root + 32 , sctx - > job . merkle [ i ] , 32 ) ;
if ( opt_algo = = ALGO_HEAVY | | opt_algo = = ALGO_MJOLLNIR )
if ( opt_algo = = ALGO_HEAVY | | opt_algo = = ALGO_MJOLLNIR )
heavycoin_hash ( merkle_root , merkle_root , 64 ) ;
heavycoin_hash ( merkle_root , merkle_root , 64 ) ;
else
else if ( opt_algo ! = ALGO_DECRED )
sha256d ( merkle_root , merkle_root , 64 ) ;
sha256d ( merkle_root , merkle_root , 64 ) ;
}
}
@ -1367,8 +1382,25 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work)
work - > data [ 1 + i ] = le32dec ( ( uint32_t * ) sctx - > job . prevhash + i ) ;
work - > data [ 1 + i ] = le32dec ( ( uint32_t * ) sctx - > job . prevhash + i ) ;
for ( i = 0 ; i < 8 ; i + + )
for ( i = 0 ; i < 8 ; i + + )
work - > data [ 9 + i ] = be32dec ( ( uint32_t * ) merkle_root + i ) ;
work - > data [ 9 + i ] = be32dec ( ( uint32_t * ) merkle_root + i ) ;
work - > data [ 17 ] = le32dec ( sctx - > job . ntime ) ;
work - > data [ 18 ] = le32dec ( sctx - > job . nbits ) ;
if ( opt_algo = = ALGO_DECRED ) {
uint32_t * extradata = ( uint32_t * ) sctx - > xnonce1 ;
for ( i = 0 ; i < 8 ; i + + )
work - > data [ 1 + i ] = swab32 ( work - > data [ 1 + i ] ) ;
for ( i = 0 ; i < 8 ; i + + )
work - > data [ 9 + i ] = swab32 ( work - > data [ 9 + i ] ) ;
for ( i = 0 ; i < headersize / 4 ; i + + )
work - > data [ 17 + i ] = le32dec ( ( uint32_t * ) extraheader + i ) ;
for ( i = 0 ; i < sctx - > xnonce1_size / 4 ; i + + )
work - > data [ 36 + i ] = extradata [ i ] ;
work - > data [ 37 ] = ( rand ( ) * 4 ) < < 8 ;
for ( int i = 39 ; i < 45 ; i + + )
work - > data [ i ] = 0 ;
applog_hex ( work - > data , 180 ) ;
} else {
work - > data [ 17 ] = le32dec ( sctx - > job . ntime ) ;
work - > data [ 18 ] = le32dec ( sctx - > job . nbits ) ;
}
if ( opt_showdiff | | opt_max_diff > 0. )
if ( opt_showdiff | | opt_max_diff > 0. )
calc_network_diff ( work ) ;
calc_network_diff ( work ) ;
@ -1878,6 +1910,8 @@ static void *miner_thread(void *userdata)
rc = scanhash_c11 ( thr_id , & work , max_nonce , & hashes_done ) ;
rc = scanhash_c11 ( thr_id , & work , max_nonce , & hashes_done ) ;
break ;
break ;
case ALGO_DECRED :
case ALGO_DECRED :
if ( opt_debug ) applog ( LOG_BLUE , " version %x, nbits %x, ntime %x extra %x " ,
work . data [ 0 ] , work . data [ 29 ] , work . data [ 34 ] , work . data [ 38 ] ) ;
rc = scanhash_decred ( thr_id , & work , max_nonce , & hashes_done ) ;
rc = scanhash_decred ( thr_id , & work , max_nonce , & hashes_done ) ;
break ;
break ;
case ALGO_DEEP :
case ALGO_DEEP :
@ -2086,9 +2120,9 @@ static void *miner_thread(void *userdata)
continue ;
continue ;
}
}
// second nonce found, submit too (on pool only!)
// second nonce found, submit too (on pool only!) todo: work.nonces
if ( rc > 1 & & work . data [ 21 ] ) {
if ( rc > 1 & & work . data [ 21 ] ) {
work . data [ 19 ] = work . data [ 21 ] ;
work . data [ 19 ] = work . data [ 21 ] ; // nonceptr[0]
work . data [ 21 ] = 0 ;
work . data [ 21 ] = 0 ;
if ( opt_algo = = ALGO_ZR5 ) {
if ( opt_algo = = ALGO_ZR5 ) {
// todo: use + 4..6 index for pok to allow multiple nonces
// todo: use + 4..6 index for pok to allow multiple nonces
@ -3220,13 +3254,6 @@ int main(int argc, char *argv[])
cur_pooln = pool_get_first_valid ( 0 ) ;
cur_pooln = pool_get_first_valid ( 0 ) ;
pool_switch ( - 1 , cur_pooln ) ;
pool_switch ( - 1 , cur_pooln ) ;
if ( opt_algo = = ALGO_DECRED ) {
allow_gbt = false ;
want_stratum = have_stratum = false ;
allow_mininginfo = false ;
want_longpoll = true ;
}
flags = ! opt_benchmark & & strncmp ( rpc_url , " https: " , 6 )
flags = ! opt_benchmark & & strncmp ( rpc_url , " https: " , 6 )
? ( CURL_GLOBAL_ALL & ~ CURL_GLOBAL_SSL )
? ( CURL_GLOBAL_ALL & ~ CURL_GLOBAL_SSL )
: CURL_GLOBAL_ALL ;
: CURL_GLOBAL_ALL ;