diff --git a/src/libckpool.c b/src/libckpool.c index c57bed58..3bfe9a52 100644 --- a/src/libckpool.c +++ b/src/libckpool.c @@ -2165,25 +2165,23 @@ double be256todouble(const uchar *target) /* Return a difficulty from a binary target */ double diff_from_target(uchar *target) { - double d64, dcut64; + double dcut64; - d64 = truediffone; dcut64 = le256todouble(target); - if (unlikely(!dcut64)) + if (unlikely(dcut64 <= 0)) dcut64 = 1; - return d64 / dcut64; + return truediffone / dcut64; } /* Return a difficulty from a binary big endian target */ double diff_from_betarget(uchar *target) { - double d64, dcut64; + double dcut64; - d64 = truediffone; dcut64 = be256todouble(target); - if (unlikely(!dcut64)) + if (unlikely(dcut64 <= 0)) dcut64 = 1; - return d64 / dcut64; + return truediffone / dcut64; } /* Return the network difficulty from the block header which is in packed form, diff --git a/src/stratifier.c b/src/stratifier.c index 5c332406..0d089631 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -81,7 +81,7 @@ struct pool_stats { double dsps1440; double dsps10080; - uint64_t network_diff; + double network_diff; int64_t best_diff; }; @@ -1031,10 +1031,12 @@ static void add_base(ckpool_t *ckp, sdata_t *sdata, workbase_t *wb, bool *new_bl ts_realtime(&wb->gentime); /* Stats network_diff is not protected by lock but is not a critical * value */ - stats->network_diff = wb->network_diff = diff_from_nbits(wb->headerbin + 72); + wb->network_diff = diff_from_nbits(wb->headerbin + 72); + if (wb->network_diff < 1) + wb->network_diff = 1; + stats->network_diff = wb->network_diff; if (stats->network_diff != old_diff) - LOGNOTICE("Network diff set to %.1ld%s", stats->network_diff, ckp->testnet ? " in testnet mode!": ""); - + LOGWARNING("Network diff set to %.1f%s", stats->network_diff, ckp->testnet ? " in testnet mode!": ""); len = strlen(ckp->logdir) + 8 + 1 + 16 + 1; wb->logdir = ckzalloc(len); @@ -5665,6 +5667,9 @@ static void add_submit(ckpool_t *ckp, stratum_instance_t *client, const double d /* Set to lower of optimal and network_diff */ optimal = MIN(optimal, network_diff); + if (unlikely(optimal < 1)) + return; + if (client->diff == optimal) return;