From b549d6ce6b7587e88ec0bcc76b7650269e3620f7 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sun, 24 Aug 2014 20:01:14 +0000 Subject: [PATCH] blkmaker_jansson: Support for constructing BIP 23 block proposals --- blkmaker.c | 28 ++++++++++++++++++---------- blkmaker_jansson.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ blkmaker_jansson.h | 1 + private.h | 1 + 4 files changed, 64 insertions(+), 10 deletions(-) diff --git a/blkmaker.c b/blkmaker.c index 5ec6935..501f302 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -330,6 +330,23 @@ void blkmk_set_times(blktemplate_t *tmpl, void * const out_hdrbuf, const time_t } } +bool blkmk_sample_data_(blktemplate_t * const tmpl, uint8_t * const cbuf, const unsigned int dataid) { + my_htole32(&cbuf[0], tmpl->version); + memcpy(&cbuf[4], &tmpl->prevblk, 32); + + unsigned char cbtxndata[tmpl->cbtxn->datasz + sizeof(dataid)]; + size_t cbtxndatasz = 0; + if (!_blkmk_extranonce(tmpl, cbtxndata, dataid, &cbtxndatasz)) + return false; + if (!build_merkle_root(&cbuf[36], tmpl, cbtxndata, cbtxndatasz)) + return false; + + my_htole32(&cbuf[0x44], tmpl->curtime); + memcpy(&cbuf[72], &tmpl->diffbits, 4); + + return true; +} + size_t blkmk_get_data(blktemplate_t *tmpl, void *buf, size_t bufsz, time_t usetime, int16_t *out_expire, unsigned int *out_dataid) { if (!(blkmk_time_left(tmpl, usetime) && blkmk_work_left(tmpl) && tmpl->cbtxn)) return 0; @@ -338,19 +355,10 @@ size_t blkmk_get_data(blktemplate_t *tmpl, void *buf, size_t bufsz, time_t useti unsigned char *cbuf = buf; - my_htole32(&cbuf[0], tmpl->version); - memcpy(&cbuf[4], &tmpl->prevblk, 32); - - unsigned char cbtxndata[tmpl->cbtxn->datasz + sizeof(*out_dataid)]; - size_t cbtxndatasz = 0; *out_dataid = tmpl->next_dataid++; - if (!_blkmk_extranonce(tmpl, cbtxndata, *out_dataid, &cbtxndatasz)) + if (!blkmk_sample_data_(tmpl, cbuf, *out_dataid)) return 0; - if (!build_merkle_root(&cbuf[36], tmpl, cbtxndata, cbtxndatasz)) - return 0; - blkmk_set_times(tmpl, &cbuf[68], usetime, out_expire, false); - memcpy(&cbuf[72], &tmpl->diffbits, 4); // TEMPORARY HACK: memcpy(tmpl->_mrklroot, &cbuf[36], 32); diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index 8687cd1..668a47c 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -247,6 +247,50 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t return NULL; } +json_t *blktmpl_propose_jansson(blktemplate_t * const tmpl, const gbt_capabilities_t caps, const bool foreign) { + json_t *jreq = blktmpl_request_jansson(caps, NULL), *ja = NULL, *jparams; + if (!(jreq && json_is_object(jreq))) + goto err; + + jparams = json_array_get(json_object_get(jreq, "params"), 0); + if (!(jparams && json_is_object(jparams))) + goto err; + + if (!(ja = json_string("proposal"))) + goto err; + if (json_object_set_new(jparams, "mode", ja)) + goto err; + + if (tmpl->workid && !foreign) + { + if (!(ja = json_string(tmpl->workid))) + goto err; + if (json_object_set_new(jparams, "workid", ja)) + goto err; + } + ja = NULL; + + unsigned int dataid = (tmpl->mutations & (BMM_CBAPPEND | BMM_CBSET) ? 1 : 0); + + uint8_t sdata[0x4c]; + if (!blkmk_sample_data_(tmpl, sdata, dataid)) + goto err; + char *blkhex = blkmk_assemble_submission_(tmpl, sdata, dataid, 0, foreign); + if (!blkhex) + goto err; + if (!(ja = json_string(blkhex))) + goto err; + if (json_object_set_new(jparams, "data", ja)) + goto err; + + return jreq; + +err: + if (jreq) json_decref(jreq); + if (ja) json_decref(ja); + return NULL; +} + static json_t *_blkmk_submit_jansson(blktemplate_t *tmpl, const unsigned char *data, unsigned int dataid, blknonce_t nonce, bool foreign) { char *blkhex = blkmk_assemble_submission_(tmpl, data, dataid, nonce, foreign); diff --git a/blkmaker_jansson.h b/blkmaker_jansson.h index f475a77..04a92ee 100644 --- a/blkmaker_jansson.h +++ b/blkmaker_jansson.h @@ -11,6 +11,7 @@ extern "C" { 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 *blktmpl_propose_jansson(blktemplate_t *, gbt_capabilities_t caps, bool foreign); extern json_t *blkmk_submit_jansson(blktemplate_t *, const unsigned char *data, unsigned int dataid, blknonce_t); extern json_t *blkmk_submit_foreign_jansson(blktemplate_t *, const unsigned char *data, unsigned int dataid, blknonce_t); diff --git a/private.h b/private.h index 7bec518..cbeb423 100644 --- a/private.h +++ b/private.h @@ -8,6 +8,7 @@ // blkmaker.c extern bool _blkmk_dblsha256(void *hash, const void *data, size_t datasz); +extern bool blkmk_sample_data_(blktemplate_t *, uint8_t *, unsigned int dataid); extern char *blkmk_assemble_submission_(blktemplate_t *, const unsigned char *data, unsigned int dataid, blknonce_t nonce, bool foreign); // blktemplate.c