Export BIP 22 long polling information (and accept lpid to make requests)

This commit is contained in:
Luke Dashjr
2012-09-15 02:28:50 +00:00
parent f8e3b7061b
commit 905105615f
5 changed files with 43 additions and 6 deletions

View File

@@ -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);

View File

@@ -5,7 +5,7 @@
#include <blktemplate.h>
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);

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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