diff --git a/blkmaker.c b/blkmaker.c index 1bb6e28..ac5fee5 100644 --- a/blkmaker.c +++ b/blkmaker.c @@ -41,16 +41,14 @@ bool _blkmk_dblsha256(void *hash, const void *data, size_t datasz) { #define dblsha256 _blkmk_dblsha256 -uint64_t blkmk_init_generation2(blktemplate_t *tmpl, void *script, size_t scriptsz, bool *out_newcb) { - if (tmpl->cbtxn) +uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const script, const size_t scriptsz, bool * const inout_newcb) { + if (tmpl->cbtxn && !(*inout_newcb && (tmpl->mutations & BMM_GENERATE))) { - if (out_newcb) - *out_newcb = false; + *inout_newcb = false; return 0; } - if (out_newcb) - *out_newcb = true; + *inout_newcb = true; size_t datasz = 62 + sizeof(blkheight_t) + scriptsz; unsigned char *data = malloc(datasz); @@ -101,6 +99,11 @@ uint64_t blkmk_init_generation2(blktemplate_t *tmpl, void *script, size_t script txn->data = data; txn->datasz = off; + if (tmpl->cbtxn) + { + _blktxn_free(tmpl->cbtxn); + free(tmpl->cbtxn); + } tmpl->cbtxn = txn; tmpl->mutations |= BMM_CBAPPEND | BMM_CBSET | BMM_GENERATE; @@ -108,6 +111,14 @@ uint64_t blkmk_init_generation2(blktemplate_t *tmpl, void *script, size_t script return tmpl->cbvalue; } +uint64_t blkmk_init_generation2(blktemplate_t *tmpl, void *script, size_t scriptsz, bool *out_newcb) { + bool tmp; + if (!out_newcb) + out_newcb = &tmp; + *out_newcb = false; + blkmk_init_generation3(tmpl, script, scriptsz, out_newcb); +} + uint64_t blkmk_init_generation(blktemplate_t *tmpl, void *script, size_t scriptsz) { return blkmk_init_generation2(tmpl, script, scriptsz, NULL); } diff --git a/blkmaker.h b/blkmaker.h index 83b6025..f9d7827 100644 --- a/blkmaker.h +++ b/blkmaker.h @@ -14,6 +14,7 @@ extern bool (*blkmk_sha256_impl)(void *hash_out, const void *data, size_t datasz extern uint64_t blkmk_init_generation(blktemplate_t *, void *script, size_t scriptsz); extern uint64_t blkmk_init_generation2(blktemplate_t *, void *script, size_t scriptsz, bool *out_newcb); +extern uint64_t blkmk_init_generation3(blktemplate_t *, const void *script, size_t scriptsz, bool *inout_newcb); extern ssize_t blkmk_append_coinbase_safe(blktemplate_t *, const void *append, size_t appendsz); extern bool _blkmk_extranonce(blktemplate_t *tmpl, void *vout, unsigned int workid, size_t *offs); extern size_t blkmk_get_data(blktemplate_t *, void *buf, size_t bufsz, time_t usetime, int16_t *out_expire, unsigned int *out_dataid); diff --git a/blktemplate.c b/blktemplate.c index ea4c87d..1dd61a2 100644 --- a/blktemplate.c +++ b/blktemplate.c @@ -93,12 +93,12 @@ bool blktmpl_get_submitold(blktemplate_t *tmpl) { return tmpl->submitold; } -static -void blktxn_free(struct blktxn_t *bt) { +void _blktxn_free(struct blktxn_t *bt) { free(bt->data); free(bt->hash); free(bt->depends); } +#define blktxn_free _blktxn_free void blktmpl_free(blktemplate_t *tmpl) { for (unsigned long i = 0; i < tmpl->txncount; ++i) diff --git a/private.h b/private.h index 02a298b..33e4c7f 100644 --- a/private.h +++ b/private.h @@ -7,6 +7,9 @@ // blkmaker.c extern bool _blkmk_dblsha256(void *hash, const void *data, size_t datasz); +// blktemplate.c +extern void _blktxn_free(struct blktxn_t *); + // hex.c extern void _blkmk_bin2hex(char *out, const void *data, size_t datasz); extern bool _blkmk_hex2bin(void *o, const char *x, size_t len);