diff --git a/.gitignore b/.gitignore index c2e17c6..6200e5f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ autom4te.cache config.* ii ar-lib +compile diff --git a/blkmaker.c b/blkmaker.c index 7c51da3..4c18522 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -411,6 +411,17 @@ size_t blkmk_get_data(blktemplate_t *tmpl, void *buf, size_t bufsz, time_t useti if (bufsz < 76) return 76; + if (tmpl->cbtxn->datasz > cbScriptSigLen && tmpl->cbtxn->data[cbScriptSigLen] + sizeof(*out_dataid) < libblkmaker_coinbase_size_minimum) { + // Add some padding + const size_t padding_required = libblkmaker_coinbase_size_minimum - (tmpl->cbtxn->data[cbScriptSigLen] + sizeof(*out_dataid)); + uint8_t padding[padding_required]; + static const uint8_t opcode_nop = '\x61'; + memset(padding, opcode_nop, padding_required); + if (padding_required != blkmk_append_coinbase_safe2(tmpl, padding, padding_required, 0, false)) { + return 0; + } + } + unsigned char *cbuf = buf; *out_dataid = tmpl->next_dataid++; @@ -428,6 +439,7 @@ bool blkmk_get_mdata(blktemplate_t * const tmpl, void * const buf, const size_t && tmpl->cbtxn && blkmk_build_merkle_branches(tmpl) && bufsz >= 76 + && (tmpl->mutations & (BMM_CBAPPEND | BMM_CBSET)) )) return false; @@ -435,6 +447,10 @@ bool blkmk_get_mdata(blktemplate_t * const tmpl, void * const buf, const size_t // Avoid overlapping with blkmk_get_data use ++extranoncesz; + if (tmpl->cbtxn->datasz > cbScriptSigLen && tmpl->cbtxn->data[cbScriptSigLen] + extranoncesz < libblkmaker_coinbase_size_minimum) { + extranoncesz = libblkmaker_coinbase_size_minimum - tmpl->cbtxn->data[cbScriptSigLen]; + } + void ** const out_branches = _out_branches; void ** const out_cbtxn = _out_cbtxn; unsigned char *cbuf = buf; @@ -481,9 +497,8 @@ unsigned long blkmk_work_left(const blktemplate_t *tmpl) { if (!tmpl->version) return 0; if (!(tmpl->mutations & (BMM_CBAPPEND | BMM_CBSET))) - return 1; + return (tmpl->next_dataid) ? 0 : 1; return UINT_MAX - tmpl->next_dataid; - return BLKMK_UNLIMITED_WORK_COUNT; } static diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index d20695a..a0ba87e 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -286,6 +286,8 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t tmpl->cbtxn = calloc(1, sizeof(*tmpl->cbtxn)); if ((s = parse_txn(tmpl->cbtxn, v))) return s; + } else if (!tmpl->cbvalue) { + return "Missing either coinbasetxn or coinbasevalue"; } if ((v = json_object_get(json, "coinbaseaux")) && json_is_object(v)) @@ -383,7 +385,11 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t v = json_object_get(json, "vbrequired"); if (v && json_is_number(v)) { - tmpl->vbrequired = json_number_value(v); + double tmpd = json_number_value(v); + tmpl->vbrequired = tmpd; + if (tmpl->vbrequired != tmpd) { + return "Unparsable vbrequired"; + } } } else diff --git a/blktemplate.c b/blktemplate.c index 48e2f0f..25ad0c4 100644 --- a/blktemplate.c +++ b/blktemplate.c @@ -26,7 +26,7 @@ static const char *capnames[] = { "coinbase/append", "coinbase", - "generate", + "generation", "time/increment", "time/decrement", "transactions/add", @@ -53,6 +53,10 @@ gbt_capabilities_t blktmpl_getcapability(const char *n) { for (unsigned int i = 0; i < GBT_CAPABILITY_COUNT; ++i) if (capnames[i] && !strcasecmp(n, capnames[i])) return 1 << i; + if (!strcasecmp(n, "time")) { + // multi-capability + return BMM_TIMEINC | BMM_TIMEDEC; + } if (!strcasecmp(n, "transactions")) return BMM_TXNADD; // Odd one as it's overloaded w/"transactions/add" per spec return 0; diff --git a/blktemplate.h b/blktemplate.h index 7772b41..b23050b 100644 --- a/blktemplate.h +++ b/blktemplate.h @@ -25,6 +25,7 @@ typedef int16_t blktime_diff_t; typedef uint32_t blknonce_t; #define libblkmaker_blkheader_size (80) +#define libblkmaker_coinbase_size_minimum (4) #define libblkmaker_coinbase_size_limit (100) struct blktxn_t { @@ -88,6 +89,7 @@ typedef enum { extern const char *blktmpl_capabilityname(gbt_capabilities_t); #define BLKTMPL_LONGEST_CAPABILITY_NAME (16) +// ABI FIXME: return uint32_t since "time" can yield a combination gbt_capabilities_t extern gbt_capabilities_t blktmpl_getcapability(const char *);