Commit e8720b908428fabac59da161b0648091179688b1

Luke Dashjr 2011-10-09T00:05:48

Support work without midstate or hash1, which are deprecated in bitcoind 0.5+

diff --git a/main.c b/main.c
index 2d0b9ae..24e0d13 100644
--- a/main.c
+++ b/main.c
@@ -1757,13 +1757,14 @@ static struct opt_table opt_cmdline_table[] = {
 };
 
 static bool jobj_binary(const json_t *obj, const char *key,
-			void *buf, size_t buflen)
+			void *buf, size_t buflen, bool required)
 {
 	const char *hexstr;
 	json_t *tmp;
 
 	tmp = json_object_get(obj, key);
 	if (unlikely(!tmp)) {
+		if (unlikely(required))
 		applog(LOG_ERR, "JSON key '%s' not found", key);
 		return false;
 	}
@@ -1780,23 +1781,33 @@ static bool jobj_binary(const json_t *obj, const char *key,
 
 static bool work_decode(const json_t *val, struct work *work)
 {
-	if (unlikely(!jobj_binary(val, "midstate",
-			 work->midstate, sizeof(work->midstate)))) {
-		applog(LOG_ERR, "JSON inval midstate");
+	if (unlikely(!jobj_binary(val, "data", work->data, sizeof(work->data), true))) {
+		applog(LOG_ERR, "JSON inval data");
 		goto err_out;
 	}
 
-	if (unlikely(!jobj_binary(val, "data", work->data, sizeof(work->data)))) {
-		applog(LOG_ERR, "JSON inval data");
-		goto err_out;
+	if (likely(!jobj_binary(val, "midstate",
+			 work->midstate, sizeof(work->midstate), false))) {
+		// Calculate it ourselves
+		union {
+			char c[64];
+			uint32_t i[16];
+		} data;
+		int swapcounter;
+		for (swapcounter = 0; swapcounter < 16; swapcounter++)
+			data.i[swapcounter] = swab32(((uint32_t*) (work->data))[swapcounter]);
+		sha2_context ctx;
+		sha2_starts( &ctx, 0 );
+		sha2_update( &ctx, data.c, 64 );
+		memcpy(work->midstate, ctx.state, sizeof(work->midstate));
 	}
 
-	if (unlikely(!jobj_binary(val, "hash1", work->hash1, sizeof(work->hash1)))) {
-		applog(LOG_ERR, "JSON inval hash1");
-		goto err_out;
+	if (likely(!jobj_binary(val, "hash1", work->hash1, sizeof(work->hash1), false))) {
+		// Always the same anyway
+		memcpy(work->hash1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0", 64);
 	}
 
-	if (unlikely(!jobj_binary(val, "target", work->target, sizeof(work->target)))) {
+	if (unlikely(!jobj_binary(val, "target", work->target, sizeof(work->target), true))) {
 		applog(LOG_ERR, "JSON inval target");
 		goto err_out;
 	}