Browse Source

neoscrypt: handle both getwork data sizes FTC/ORB

only affect solo mining, this patch should handle more weird cases

also set getblocktemplate param type to an empty object (ORB)
2upstream
Tanguy Pruvot 9 years ago
parent
commit
2ebcd1fbd5
  1. 35
      ccminer.cpp

35
ccminer.cpp

@ -628,24 +628,33 @@ static bool work_decode(const json_t *val, struct work *work)
int i; int i;
switch (opt_algo) { switch (opt_algo) {
case ALGO_NEOSCRYPT:
case ALGO_ZR5: case ALGO_ZR5:
data_size = 80; data_size = 80;
break; break;
case ALGO_NEOSCRYPT:
data_size = 84; // typo in FTC wallet ? and clones..
break;
default: default:
data_size = 128; // sizeof(work->data); data_size = 128; // sizeof(work->data);
} }
adata_sz = data_size / 4; // sizeof(uint32_t); adata_sz = data_size / 4; // sizeof(uint32_t);
if (unlikely(!jobj_binary(val, "data", work->data, data_size))) { if (!jobj_binary(val, "data", work->data, data_size)) {
applog(LOG_ERR, "JSON inval data"); json_t *obj = json_object_get(val, "data");
return false; int len = obj ? (int) strlen(json_string_value(obj)) : 0;
if (!len || len > sizeof(work->data)*2) {
applog(LOG_ERR, "JSON invalid data (len %d <> %d)", len/2, data_size);
return false;
} else {
data_size = len / 2;
if (!jobj_binary(val, "data", work->data, data_size)) {
applog(LOG_ERR, "JSON invalid data (len %d)", data_size);
return false;
}
}
} }
if (unlikely(!jobj_binary(val, "target", work->target, target_size))) {
applog(LOG_ERR, "JSON inval target"); if (!jobj_binary(val, "target", work->target, target_size)) {
applog(LOG_ERR, "JSON invalid target");
return false; return false;
} }
@ -690,7 +699,7 @@ static bool work_decode(const json_t *val, struct work *work)
break; break;
} }
hex2bin((uchar*)work->txs[tx].data, hexstr, min(txlen, POK_MAX_TX_SZ)); hex2bin((uchar*)work->txs[tx].data, hexstr, min(txlen, POK_MAX_TX_SZ));
work->txs[tx].len = txlen; work->txs[tx].len = (uint32_t) (txlen);
totlen += txlen; totlen += txlen;
} }
if (opt_debug) if (opt_debug)
@ -979,9 +988,9 @@ static bool gbt_work_decode(const json_t *val, struct work *work)
#define GBT_CAPABILITIES "[\"coinbasetxn\", \"coinbasevalue\", \"longpoll\", \"workid\"]" #define GBT_CAPABILITIES "[\"coinbasetxn\", \"coinbasevalue\", \"longpoll\", \"workid\"]"
static const char *gbt_req = static const char *gbt_req =
"{\"method\": \"getblocktemplate\", \"params\": [" "{\"method\": \"getblocktemplate\", \"params\": [{"
// "{\"capabilities\": " GBT_CAPABILITIES "}" // "\"capabilities\": " GBT_CAPABILITIES ""
"], \"id\":9}\r\n"; "}], \"id\":9}\r\n";
static bool get_blocktemplate(CURL *curl, struct work *work) static bool get_blocktemplate(CURL *curl, struct work *work)
{ {
@ -1037,7 +1046,7 @@ static bool get_mininginfo(CURL *curl, struct work *work)
if (res) { if (res) {
json_t *key = json_object_get(res, "difficulty"); json_t *key = json_object_get(res, "difficulty");
if (key) { if (key) {
if (!json_is_real(key)) if (json_is_object(key))
key = json_object_get(key, "proof-of-work"); key = json_object_get(key, "proof-of-work");
if (json_is_real(key)) if (json_is_real(key))
net_diff = json_real_value(key); net_diff = json_real_value(key);

Loading…
Cancel
Save