Support for fractional diffs and the classic just-below-1 share all FFs diff target.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
diff --git a/cgminer.c b/cgminer.c
index baa380c..cdf15a9 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -5078,17 +5078,27 @@ static void gen_hash(unsigned char *data, unsigned char *hash, int len)
* 0x00000000ffff0000000000000000000000000000000000000000000000000000
* so we use a big endian 64 bit unsigned integer centred on the 5th byte to
* cover a huge range of difficulty targets, though not all 256 bits' worth */
-static void set_work_target(struct work *work, int diff)
+static void set_work_target(struct work *work, double diff)
{
unsigned char rtarget[32], target[32];
+ double d64;
uint64_t *data64, h64;
- h64 = diffone;
- h64 /= (uint64_t)diff;
- memset(rtarget, 0, 32);
- data64 = (uint64_t *)(rtarget + 4);
- *data64 = htobe64(h64);
- swab256(target, rtarget);
+ d64 = diffone;
+ d64 /= diff;
+ h64 = d64;
+
+ if (h64) {
+ memset(rtarget, 0, 32);
+ data64 = (uint64_t *)(rtarget + 4);
+ *data64 = htobe64(h64);
+ swab256(target, rtarget);
+ } else {
+ /* Support for the classic all FFs just-below-1 diff */
+ memset(target, 0xff, 28);
+ memset(&target[28], 0, 4);
+ }
+
if (opt_debug) {
char *htarget = bin2hex(target, 32);
diff --git a/miner.h b/miner.h
index 2b52eaa..6e33152 100644
--- a/miner.h
+++ b/miner.h
@@ -821,7 +821,7 @@ struct stratum_work {
bool clean;
int merkles;
- int diff;
+ double diff;
};
#define RECVSIZE 8192
@@ -966,7 +966,7 @@ struct work {
char job_id[64];
char nonce2[64];
char ntime[16];
- int sdiff;
+ double sdiff;
bool gbt;
char gbt_coinbase[512];
diff --git a/util.c b/util.c
index 072c5ce..d5c2e54 100644
--- a/util.c
+++ b/util.c
@@ -1131,17 +1131,17 @@ static bool parse_notify(struct pool *pool, json_t *val)
static bool parse_diff(struct pool *pool, json_t *val)
{
- int diff;
+ double diff;
- diff = json_integer_value(json_array_get(val, 0));
- if (diff < 1)
+ diff = json_number_value(json_array_get(val, 0));
+ if (diff == 0)
return false;
mutex_lock(&pool->pool_lock);
pool->swork.diff = diff;
mutex_unlock(&pool->pool_lock);
- applog(LOG_DEBUG, "Pool %d difficulty set to %d", pool->pool_no, diff);
+ applog(LOG_DEBUG, "Pool %d difficulty set to %f", pool->pool_no, diff);
return true;
}
@@ -1266,24 +1266,20 @@ bool auth_stratum(struct pool *pool)
sprintf(s, "{\"id\": %d, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
swork_id++, pool->rpc_user, pool->rpc_pass);
- /* Parse all data prior sending auth request */
- while (sock_full(pool, false)) {
+ if (!stratum_send(pool, s, strlen(s)))
+ goto out;
+
+ /* Parse all data in the queue and anything left should be auth */
+ while (42) {
sret = recv_line(pool);
- if (!parse_method(pool, sret)) {
- clear_sock(pool);
- applog(LOG_INFO, "Failed to parse stratum buffer");
+ if (!sret)
+ goto out;
+ if (parse_method(pool, sret))
free(sret);
- return ret;
- }
- free(sret);
+ else
+ break;
}
- if (!stratum_send(pool, s, strlen(s)))
- goto out;
-
- sret = recv_line(pool);
- if (!sret)
- goto out;
val = JSON_LOADS(sret, &err);
free(sret);
res_val = json_object_get(val, "result");