From 1ff98a11993c0683567d5d47e21a02afaa63983a Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sat, 30 Jul 2016 22:19:35 +0000 Subject: [PATCH 1/7] gitignore autotools compile wrapper --- .gitignore | 1 + 1 file changed, 1 insertion(+) 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 From 723a7e543be5862dc5499f787cc99b3242fe8eb5 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Wed, 10 Aug 2016 22:04:41 +0000 Subject: [PATCH 2/7] Bugfix: Correctly parse "generation" and "time" mutations --- blktemplate.c | 6 +++++- blktemplate.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/blktemplate.c b/blktemplate.c index be4bfe6..5899bac 100644 --- a/blktemplate.c +++ b/blktemplate.c @@ -19,7 +19,7 @@ static const char *capnames[] = { "coinbase/append", "coinbase", - "generate", + "generation", "time/increment", "time/decrement", "transactions/add", @@ -46,6 +46,10 @@ gbt_capabilities_t blktmpl_getcapability(const char *n) { for (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 da737a4..209a1a3 100644 --- a/blktemplate.h +++ b/blktemplate.h @@ -65,6 +65,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 *); From ebd42b2461801828f344e564dd420189deb79e47 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 03:49:35 +0000 Subject: [PATCH 3/7] Bugfix: Correct blkmk_work_left for single-work templates that have been used --- blkmaker.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/blkmaker.c b/blkmaker.c index d5d84cf..ee2a8eb 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -126,7 +126,6 @@ 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; } From 4a01674cd089d3c6bfac6092d2e803c80ed15230 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 03:51:07 +0000 Subject: [PATCH 4/7] Bugfix: blkmk_get_mdata must fail if we cannot append the coinbase --- blkmaker.c | 1 + 1 file changed, 1 insertion(+) diff --git a/blkmaker.c b/blkmaker.c index a5035f3..c0c1457 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -339,6 +339,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; From 15745d4a5fa42ed50254a0430f0b0a0c960c42e8 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 05:49:43 +0000 Subject: [PATCH 5/7] Bugfix: Ensure coinbase is always at least 4 bytes long --- blkmaker.c | 15 +++++++++++++++ blktemplate.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/blkmaker.c b/blkmaker.c index 13810f7..b367e47 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -323,6 +323,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; my_htole32(&cbuf[0], tmpl->version); @@ -359,6 +370,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; diff --git a/blktemplate.h b/blktemplate.h index 8b832c5..eb7f73e 100644 --- a/blktemplate.h +++ b/blktemplate.h @@ -20,6 +20,8 @@ typedef uint32_t blktime_t; typedef int16_t blktime_diff_t; typedef uint32_t blknonce_t; +#define libblkmaker_coinbase_size_minimum (4) + struct blktxn_t { unsigned char *data; size_t datasz; From 2cad5fdadb7409be8e0011b55c014a010862115a Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 06:57:22 +0000 Subject: [PATCH 6/7] Bugfix: Refuse to accept a template with neither coinbasetxn nor coinbasevalue --- blkmaker_jansson.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index 06c97b3..08e2676 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -197,6 +197,8 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, json_t *json, time_t time_r 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"; } // TODO: coinbaseaux From 4be60421c81ece44c8cc0cf27a82b024eb359579 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Thu, 11 Aug 2016 06:57:42 +0000 Subject: [PATCH 7/7] Bugfix: Refuse to accept an unparsable vbrequired --- blkmaker_jansson.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c index cbce12f..d3507cf 100644 --- a/blkmaker_jansson.c +++ b/blkmaker_jansson.c @@ -305,7 +305,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