Support work without midstate or hash1, which are deprecated in bitcoind 0.5+
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
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;
}