Browse Source

Support for fractional diffs and the classic just-below-1 share all FFs diff target.

Con Kolivas 13 years ago
parent
commit
b3864d1a94
3 changed files with 33 additions and 27 deletions
  1. 17 7
      cgminer.c
  2. 2 2
      miner.h
  3. 14 18
      util.c

+ 17 - 7
cgminer.c

@@ -5078,17 +5078,27 @@ static void gen_hash(unsigned char *data, unsigned char *hash, int len)
  * 0x00000000ffff0000000000000000000000000000000000000000000000000000
  * 0x00000000ffff0000000000000000000000000000000000000000000000000000
  * so we use a big endian 64 bit unsigned integer centred on the 5th byte to
  * 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 */
  * 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];
 	unsigned char rtarget[32], target[32];
+	double d64;
 	uint64_t *data64, h64;
 	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) {
 	if (opt_debug) {
 		char *htarget = bin2hex(target, 32);
 		char *htarget = bin2hex(target, 32);
 
 

+ 2 - 2
miner.h

@@ -821,7 +821,7 @@ struct stratum_work {
 	bool clean;
 	bool clean;
 
 
 	int merkles;
 	int merkles;
-	int diff;
+	double diff;
 };
 };
 
 
 #define RECVSIZE 8192
 #define RECVSIZE 8192
@@ -966,7 +966,7 @@ struct work {
 	char 		job_id[64];
 	char 		job_id[64];
 	char		nonce2[64];
 	char		nonce2[64];
 	char		ntime[16];
 	char		ntime[16];
-	int		sdiff;
+	double		sdiff;
 
 
 	bool		gbt;
 	bool		gbt;
 	char		gbt_coinbase[512];
 	char		gbt_coinbase[512];

+ 14 - 18
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)
 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;
 		return false;
 
 
 	mutex_lock(&pool->pool_lock);
 	mutex_lock(&pool->pool_lock);
 	pool->swork.diff = diff;
 	pool->swork.diff = diff;
 	mutex_unlock(&pool->pool_lock);
 	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;
 	return true;
 }
 }
@@ -1266,24 +1266,20 @@ bool auth_stratum(struct pool *pool)
 	sprintf(s, "{\"id\": %d, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
 	sprintf(s, "{\"id\": %d, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
 		swork_id++, pool->rpc_user, pool->rpc_pass);
 		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);
 		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);
 			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);
 	val = JSON_LOADS(sret, &err);
 	free(sret);
 	free(sret);
 	res_val = json_object_get(val, "result");
 	res_val = json_object_get(val, "result");