Commit 7adb7a30e6a2d095cd1fbdfe4f13e9b7dd2a705f

Con Kolivas 2012-10-15T23:10:24

Display correct share hash and share difficulty with scrypt mining.

diff --git a/cgminer.c b/cgminer.c
index a945465..1385a56 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -47,6 +47,7 @@
 #include "driver-cpu.h"
 #include "driver-opencl.h"
 #include "bench_block.h"
+#include "scrypt.h"
 
 #if defined(unix)
 	#include <errno.h>
@@ -1988,7 +1989,17 @@ static uint64_t share_diff(const struct work *work)
 	return ret;
 }
 
-static bool submit_upstream_work(const struct work *work, CURL *curl, bool resubmit)
+static uint32_t scrypt_diff(const struct work *work)
+{
+	const uint32_t scrypt_diffone = 0x0000fffful;
+	uint32_t d32 = work->outputhash;
+
+	if (unlikely(!d32))
+		d32 = 1;
+	return scrypt_diffone / d32;
+}
+
+static bool submit_upstream_work(struct work *work, CURL *curl, bool resubmit)
 {
 	char *hexstr = NULL;
 	json_t *val, *res, *err;
@@ -2046,13 +2057,19 @@ static bool submit_upstream_work(const struct work *work, CURL *curl, bool resub
 
 	if (!QUIET) {
 		int intdiff = floor(work->work_difficulty);
+		char diffdisp[16];
 
 		hash32 = (uint32_t *)(work->hash);
-		if (opt_scrypt)
-			sprintf(hashshow, "%08lx Diff %d", (unsigned long)(hash32[7]), intdiff);
-		else {
+		if (opt_scrypt) {
+			uint32_t sharediff;
+
+			scrypt_outputhash(work);
+			sharediff = scrypt_diff(work);
+			suffix_string(sharediff, diffdisp, 0);
+
+			sprintf(hashshow, "%08lx Diff %s/%d", (unsigned long)work->outputhash, diffdisp, intdiff);
+		} else {
 			uint64_t sharediff = share_diff(work);
-			char diffdisp[16];
 
 			suffix_string(sharediff, diffdisp, 0);
 
diff --git a/miner.h b/miner.h
index 22618b2..73e6ec3 100644
--- a/miner.h
+++ b/miner.h
@@ -897,10 +897,10 @@ struct work {
 	unsigned char	target[32];
 	unsigned char	hash[32];
 
+	uint32_t	outputhash;
+
 	int		rolls;
 
-	uint32_t	output[1];
-	uint32_t	valid;
 	dev_blk_ctx	blk;
 
 	struct thr_info	*thr;
diff --git a/scrypt.c b/scrypt.c
index 652f3c3..e48996c 100644
--- a/scrypt.c
+++ b/scrypt.c
@@ -405,6 +405,18 @@ static uint32_t scrypt_1024_1_1_256_sp(const uint32_t* input, char* scratchpad)
 	return PBKDF2_SHA256_80_128_32(input, X);
 }
 
+void scrypt_outputhash(struct work *work)
+{
+	uint32_t data[20];
+	char *scratchbuf;
+	uint32_t *nonce = (uint32_t *)(work->data + 76);
+
+	be32enc_vect(data, (const uint32_t *)work->data, 19);
+	data[19] = htobe32(*nonce);
+	scratchbuf = alloca(131584);
+	work->outputhash = scrypt_1024_1_1_256_sp(data, scratchbuf);
+}
+
 /* Used externally as confirmation of correct OCL code */
 bool scrypt_test(unsigned char *pdata, const unsigned char *ptarget, uint32_t nonce)
 {
diff --git a/scrypt.h b/scrypt.h
index 4ea3abd..a5efb10 100644
--- a/scrypt.h
+++ b/scrypt.h
@@ -1,9 +1,13 @@
 #ifndef SCRYPT_H
 #define SCRYPT_H
 
+#include "miner.h"
+
 #ifdef USE_SCRYPT
 extern bool scrypt_test(unsigned char *pdata, const unsigned char *ptarget,
 			uint32_t nonce);
+extern void scrypt_outputhash(struct work *work);
+
 #else /* USE_SCRYPT */
 static inline bool scrypt_test(__maybe_unused unsigned char *pdata,
 			       __maybe_unused const unsigned char *ptarget,
@@ -11,6 +15,10 @@ static inline bool scrypt_test(__maybe_unused unsigned char *pdata,
 {
 	return false;
 }
+
+static inline void scrypt_outputhash(struct work *work)
+{
+}
 #endif /* USE_SCRYPT */
 
 #endif /* SCRYPT_H */