Merge branch 'master' into segwit

This commit is contained in:
Luke Dashjr
2016-07-26 04:23:36 +00:00
2 changed files with 30 additions and 11 deletions

View File

@@ -220,8 +220,9 @@ uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const s
memset(&data[off], 0, 4); // lock time
off += 4;
const int16_t sigops_counted = blkmk_count_sigops(script, scriptsz);
if (tmpl->txns_datasz + off > tmpl->sizelimit
|| (tmpl->txns_sigops >= 0 && tmpl->txns_sigops + blkmk_count_sigops(script, scriptsz) > tmpl->sigoplimit)) {
|| (tmpl->txns_sigops >= 0 && tmpl->txns_sigops + sigops_counted > tmpl->sigoplimit)) {
free(data);
return 0;
}
@@ -236,6 +237,7 @@ uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const s
txn->data = data;
txn->datasz = off;
txn->sigops_ = sigops_counted;
if (tmpl->cbtxn)
{
@@ -425,7 +427,7 @@ bool _blkmk_witness_mrklroot(blktemplate_t * const tmpl) {
static const int cbScriptSigLen = 4 + 1 + 36;
static
bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void * const append, const size_t appendsz, size_t * const appended_at_offset) {
bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void * const append, const size_t appendsz, size_t * const appended_at_offset, int16_t * const sigops_counted_p) {
unsigned char *out = vout;
unsigned char *in = tmpl->cbtxn->data;
size_t insz = tmpl->cbtxn->datasz;
@@ -437,6 +439,7 @@ bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void
return false;
}
const int16_t orig_scriptSig_sigops = blkmk_count_sigops(&in[cbScriptSigLen + 1], in[cbScriptSigLen]);
int cbPostScriptSig = cbScriptSigLen + 1 + in[cbScriptSigLen];
if (appended_at_offset)
*appended_at_offset = cbPostScriptSig;
@@ -455,6 +458,21 @@ bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void
out[cbScriptSigLen] += appendsz;
memcpy(outExtranonce, append, appendsz);
const int16_t sigops_counted = (tmpl->cbtxn->sigops_ - orig_scriptSig_sigops) + blkmk_count_sigops(&out[cbScriptSigLen + 1], out[cbScriptSigLen]);
if (tmpl->txns_sigops >= 0 && tmpl->txns_sigops + sigops_counted > tmpl->sigoplimit) {
// Overflowed :(
if (out == in) {
// Revert it!
out[cbScriptSigLen] -= appendsz;
memmove(&out[cbPostScriptSig], outPostScriptSig, insz - cbPostScriptSig);
}
return false;
}
if (sigops_counted_p) {
*sigops_counted_p = sigops_counted;
}
return true;
}
@@ -491,7 +509,7 @@ ssize_t blkmk_append_coinbase_safe2(blktemplate_t * const tmpl, const void * con
return -2;
tmpl->cbtxn->data = newp;
if (!_blkmk_append_cb(tmpl, newp, append, appendsz, NULL))
if (!_blkmk_append_cb(tmpl, newp, append, appendsz, NULL, &tmpl->cbtxn->sigops_))
return -3;
tmpl->cbtxn->datasz += appendsz;
@@ -513,7 +531,7 @@ bool _blkmk_extranonce(blktemplate_t *tmpl, void *vout, unsigned int workid, siz
return true;
}
if (!_blkmk_append_cb(tmpl, vout, &workid, sizeof(workid), NULL))
if (!_blkmk_append_cb(tmpl, vout, &workid, sizeof(workid), NULL, NULL))
return false;
*offs += insz + sizeof(workid);
@@ -665,7 +683,7 @@ bool blkmk_get_mdata(blktemplate_t * const tmpl, void * const buf, const size_t
return false;
unsigned char dummy[extranoncesz];
memset(dummy, 0, extranoncesz);
if (!_blkmk_append_cb(tmpl, *out_cbtxn, dummy, extranoncesz, cbextranonceoffset))
if (!_blkmk_append_cb(tmpl, *out_cbtxn, dummy, extranoncesz, cbextranonceoffset, NULL))
{
free(*out_cbtxn);
return false;
@@ -736,7 +754,7 @@ static char *blkmk_assemble_submission2_internal(blktemplate_t * const tmpl, con
size_t cbtxnlen = 0;
// Essentially _blkmk_extranonce
if (extranoncesz) {
if (!_blkmk_append_cb(tmpl, &blk[offs], extranonce, extranoncesz, NULL)) {
if (!_blkmk_append_cb(tmpl, &blk[offs], extranonce, extranoncesz, NULL, NULL)) {
free(blk);
return NULL;
}

View File

@@ -324,7 +324,7 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t
v = json_object_get(json, "transactions");
size_t txns = tmpl->txncount = json_array_size(v);
tmpl->txns = malloc(txns * sizeof(*tmpl->txns));
tmpl->txns = calloc(txns, sizeof(*tmpl->txns));
tmpl->txns_datasz = 0;
tmpl->txns_sigops = 0;
for (size_t i = 0; i < txns; ++i)
@@ -341,12 +341,11 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t
} else {
tmpl->txns_sigops += txn->sigops_;
}
tmpl->txns_sigops += txn->sigops_;
}
if ((v = json_object_get(json, "coinbasetxn")) && json_is_object(v))
{
tmpl->cbtxn = malloc(sizeof(*tmpl->cbtxn));
tmpl->cbtxn = calloc(1, sizeof(*tmpl->cbtxn));
if ((s = parse_txn(tmpl->cbtxn, v, 0)))
return s;
}
@@ -354,7 +353,7 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t
if ((v = json_object_get(json, "coinbaseaux")) && json_is_object(v))
{
tmpl->aux_count = json_object_size(v);
tmpl->auxs = malloc(tmpl->aux_count * sizeof(*tmpl->auxs));
tmpl->auxs = calloc(tmpl->aux_count, sizeof(*tmpl->auxs));
unsigned i = 0;
for (void *iter = json_object_iter(v); iter; (iter = json_object_iter_next(v, iter)), ++i)
{
@@ -368,7 +367,9 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t
.data = malloc(sz),
.datasz = sz,
};
my_hex2bin(tmpl->auxs[i].data, s, sz);
if (!my_hex2bin(tmpl->auxs[i].data, s, sz)) {
return "Error decoding 'coinbaseaux' data";
}
}
}