From 905105615fdde07d1e65ab5f40c21b557aa05c6c Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sat, 15 Sep 2012 02:28:50 +0000 Subject: [PATCH] Export BIP 22 long polling information (and accept lpid to make requests) --- blkmaker_jansson.c | 31 +++++++++++++++++++++++++++---- blkmaker_jansson.h | 2 +- blktemplate.c | 12 ++++++++++++ blktemplate.h | 2 ++ example.c | 2 +- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index 02c4aef..85c543d 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -14,7 +14,7 @@ # error "Jansson 2.0 with long long support required!" #endif -json_t *blktmpl_request_jansson(gbt_capabilities_t caps) { +json_t *blktmpl_request_jansson(gbt_capabilities_t caps, const char *lpid) { json_t *req, *jcaps, *jstr, *reqf, *reqa; if (!(req = json_object())) return NULL; @@ -46,6 +46,13 @@ json_t *blktmpl_request_jansson(gbt_capabilities_t caps) { goto err; if (json_object_set_new(req, "maxversion", jstr)) goto err; + if (lpid) + { + if (!(jstr = json_string(lpid))) + goto err; + if (json_object_set_new(req, "longpollid", jstr)) + goto err; + } if (!(jstr = json_string("getblocktemplate"))) goto err; if (json_object_set_new(reqf, "method", jstr)) @@ -120,6 +127,20 @@ static bool my_hex2bin(void *o, const char *x, size_t len) { tmpl->key = json_integer_value(v); \ } while(0) +#define GETSTR(key, skey) do { \ + if ((v = json_object_get(json, #key)) && json_is_string(v)) \ + if (!(tmpl->skey = strdup(json_string_value(v)))) \ + return "Error copying '" #key "'"; \ +} while(0) + +#define GETBOOL(key, skey, def) do { \ + if ((v = json_object_get(json, #key)) && json_is_boolean(v)) \ + tmpl->skey = json_is_true(v); \ + else \ + if (def) \ + tmpl->skey = true; \ +} while(0) + static const char *parse_txn(struct blktxn_t *txn, json_t *txnj) { json_t *vv; @@ -191,9 +212,11 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t if ((v = json_object_get(json, "coinbasevalue")) && json_is_number(v)) tmpl->cbvalue = json_integer_value(v); - if ((v = json_object_get(json, "workid")) && json_is_string(v)) - if (!(tmpl->workid = strdup(json_string_value(v)))) - return "Error copying 'workid'"; + GETSTR(workid, workid); + + GETSTR(longpollid, lp.id); + GETSTR(longpolluri, lp.uri); + GETBOOL(submitold, submitold, true); v = json_object_get(json, "transactions"); size_t txns = tmpl->txncount = json_array_size(v); diff --git a/blkmaker_jansson.h b/blkmaker_jansson.h index 9830283..2cf0ddb 100644 --- a/blkmaker_jansson.h +++ b/blkmaker_jansson.h @@ -5,7 +5,7 @@ #include -extern json_t *blktmpl_request_jansson(gbt_capabilities_t extracaps); +extern json_t *blktmpl_request_jansson(gbt_capabilities_t extracaps, const char *lpid); extern const char *blktmpl_add_jansson(blktemplate_t *, const json_t *, time_t time_rcvd); extern json_t *blkmk_submit_jansson(blktemplate_t *, const unsigned char *data, unsigned int dataid, blknonce_t); diff --git a/blktemplate.c b/blktemplate.c index 016a2a3..3cf8431 100644 --- a/blktemplate.c +++ b/blktemplate.c @@ -70,6 +70,16 @@ gbt_capabilities_t blktmpl_addcaps(const blktemplate_t *tmpl) { return GBT_CBTXN | GBT_WORKID | BMM_TIMEINC | BMM_CBAPPEND; } +const struct blktmpl_longpoll_req *blktmpl_get_longpoll(blktemplate_t *tmpl) { + if (!tmpl->lp.id) + return NULL; + return &tmpl->lp; +} + +bool blktmpl_get_submitold(blktemplate_t *tmpl) { + return tmpl->submitold; +} + static void blktxn_free(struct blktxn_t *bt) { free(bt->data); @@ -90,5 +100,7 @@ void blktmpl_free(blktemplate_t *tmpl) { free(tmpl->auxnames); free(tmpl->auxdata); free(tmpl->workid); + free(tmpl->lp.id); + free(tmpl->lp.uri); free(tmpl); } diff --git a/blktemplate.h b/blktemplate.h index 1cf7405..b5f579b 100644 --- a/blktemplate.h +++ b/blktemplate.h @@ -116,6 +116,8 @@ typedef struct { extern blktemplate_t *blktmpl_create(); extern gbt_capabilities_t blktmpl_addcaps(const blktemplate_t *); +extern const struct blktmpl_longpoll_req *blktmpl_get_longpoll(blktemplate_t *); +extern bool blktmpl_get_submitold(blktemplate_t *tmpl); extern void blktmpl_free(blktemplate_t *); #endif diff --git a/example.c b/example.c index a98332e..04fd264 100644 --- a/example.c +++ b/example.c @@ -34,7 +34,7 @@ int main(int argc, char**argv) { tmpl = blktmpl_create(); assert(tmpl); - req = blktmpl_request_jansson(blktmpl_addcaps(tmpl)); + req = blktmpl_request_jansson(blktmpl_addcaps(tmpl), NULL); assert(req); // send req to server and parse response into req