[Pkg-bitcoin-commits] [libblkmaker] 01/01: Imported Upstream version 0.5.3
Dmitry Smirnov
onlyjob at moszumanska.debian.org
Sun Apr 17 11:01:41 UTC 2016
This is an automated email from the git hooks/post-receive script.
onlyjob pushed a commit to branch upstream
in repository libblkmaker.
commit 469fdb7 (upstream)
Author: Dmitry Smirnov <onlyjob at member.fsf.org>
Date: Sun Apr 17 10:59:07 2016
Imported Upstream version 0.5.3
---
blkmaker.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++--------
blkmaker.h | 2 +-
blkmaker_jansson.c | 25 +++++++++++----
blkmaker_jansson.h | 1 +
blktemplate.c | 5 ++-
blktemplate.h | 7 +++-
configure.ac | 4 +--
private.h | 2 +-
8 files changed, 111 insertions(+), 29 deletions(-)
diff --git a/blkmaker.c b/blkmaker.c
index 7bc1421..98bc7cc 100644
--- a/blkmaker.c
+++ b/blkmaker.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2014 Luke Dashjr
+ * Copyright 2012-2016 Luke Dashjr
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the standard MIT license. See COPYING for more details.
@@ -47,6 +47,8 @@ bool _blkmk_dblsha256(void *hash, const void *data, size_t datasz) {
#define dblsha256 _blkmk_dblsha256
+#define max_varint_size (9)
+
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)))
{
@@ -93,7 +95,7 @@ uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const s
for (unsigned i = 0; i < tmpl->aux_count; ++i)
{
struct blkaux_t * const aux = &tmpl->auxs[i];
- if ((size_t)data[41] + aux->datasz > 100)
+ if ((size_t)data[41] + aux->datasz > libblkmaker_coinbase_size_limit)
{
free(data);
return 0;
@@ -118,6 +120,11 @@ uint64_t blkmk_init_generation3(blktemplate_t * const tmpl, const void * const s
memset(&data[off], 0, 4); // lock time
off += 4;
+ if (tmpl->txns_datasz + off > tmpl->sizelimit) {
+ free(data);
+ return 0;
+ }
+
struct blktxn_t *txn = calloc(1, sizeof(*tmpl->cbtxn));
if (!txn)
{
@@ -254,8 +261,12 @@ bool _blkmk_append_cb(blktemplate_t * const tmpl, void * const vout, const void
unsigned char *in = tmpl->cbtxn->data;
size_t insz = tmpl->cbtxn->datasz;
- if (in[cbScriptSigLen] > 100 - appendsz)
+ if (in[cbScriptSigLen] > libblkmaker_coinbase_size_limit - appendsz)
+ return false;
+
+ if (tmpl->cbtxn->datasz + tmpl->txns_datasz + appendsz > tmpl->sizelimit) {
return false;
+ }
int cbPostScriptSig = cbScriptSigLen + 1 + in[cbScriptSigLen];
if (appended_at_offset)
@@ -284,15 +295,25 @@ ssize_t blkmk_append_coinbase_safe2(blktemplate_t * const tmpl, const void * con
return -1;
size_t datasz = tmpl->cbtxn->datasz;
+ if (extranoncesz == sizeof(unsigned int)) {
+ ++extranoncesz;
+ } else
if (!merkle_only)
{
if (extranoncesz < sizeof(unsigned int))
extranoncesz = sizeof(unsigned int);
- else
- if (extranoncesz == sizeof(unsigned int))
- ++extranoncesz;
}
- size_t availsz = 100 - extranoncesz - tmpl->cbtxn->data[cbScriptSigLen];
+ size_t availsz = libblkmaker_coinbase_size_limit - extranoncesz - tmpl->cbtxn->data[cbScriptSigLen];
+ {
+ const size_t current_blocksize = tmpl->cbtxn->datasz + tmpl->txns_datasz;
+ if (current_blocksize > tmpl->sizelimit) {
+ return false;
+ }
+ const size_t availsz2 = tmpl->sizelimit - current_blocksize;
+ if (availsz2 < availsz) {
+ availsz = availsz2;
+ }
+ }
if (appendsz > availsz)
return availsz;
@@ -480,31 +501,76 @@ char varintEncode(unsigned char *out, uint64_t n) {
return L;
}
-char *blkmk_assemble_submission_(blktemplate_t * const tmpl, const unsigned char * const data, const unsigned int dataid, blknonce_t nonce, const bool foreign)
+static char *blkmk_assemble_submission2_internal(blktemplate_t * const tmpl, const unsigned char * const data, const void * const extranonce, const size_t extranoncesz, blknonce_t nonce, const bool foreign)
{
- unsigned char blk[80 + 8 + 1000000];
+ const bool incl_gentxn = (foreign || (!(tmpl->mutations & BMAb_TRUNCATE && !extranoncesz)));
+ const bool incl_alltxn = (foreign || !(tmpl->mutations & BMAb_COINBASE));
+
+ size_t blkbuf_sz = libblkmaker_blkheader_size;
+ if (incl_gentxn) {
+ blkbuf_sz += max_varint_size + tmpl->cbtxn->datasz;
+ if (incl_alltxn) {
+ blkbuf_sz += tmpl->txns_datasz;
+ }
+ }
+
+ unsigned char * const blk = malloc(blkbuf_sz);
+ if (!blk) {
+ return NULL;
+ }
+
memcpy(blk, data, 76);
nonce = htonl(nonce);
memcpy(&blk[76], &nonce, 4);
size_t offs = 80;
- if (foreign || (!(tmpl->mutations & BMAb_TRUNCATE && !dataid)))
- {
+ if (incl_gentxn) {
offs += varintEncode(&blk[offs], 1 + tmpl->txncount);
- if (!_blkmk_extranonce(tmpl, &blk[offs], dataid, &offs))
- return NULL;
+ // Essentially _blkmk_extranonce
+ if (extranoncesz) {
+ if (!_blkmk_append_cb(tmpl, &blk[offs], extranonce, extranoncesz, NULL)) {
+ free(blk);
+ return NULL;
+ }
+
+ offs += tmpl->cbtxn->datasz + extranoncesz;
+ } else {
+ memcpy(&blk[offs], tmpl->cbtxn->data, tmpl->cbtxn->datasz);
+ offs += tmpl->cbtxn->datasz;
+ }
- if (foreign || !(tmpl->mutations & BMAb_COINBASE))
+ if (incl_alltxn) {
for (unsigned long i = 0; i < tmpl->txncount; ++i)
{
memcpy(&blk[offs], tmpl->txns[i].data, tmpl->txns[i].datasz);
offs += tmpl->txns[i].datasz;
}
+ }
}
char *blkhex = malloc((offs * 2) + 1);
_blkmk_bin2hex(blkhex, blk, offs);
+ free(blk);
return blkhex;
}
+
+char *blkmk_assemble_submission2_(blktemplate_t * const tmpl, const unsigned char * const data, const void *extranonce, size_t extranoncesz, const unsigned int dataid, const blknonce_t nonce, const bool foreign)
+{
+ if (dataid) {
+ if (extranoncesz) {
+ // Cannot specify both!
+ return NULL;
+ }
+ extranonce = &dataid;
+ extranoncesz = sizeof(dataid);
+ } else if (extranoncesz == sizeof(unsigned int)) {
+ // Avoid overlapping with blkmk_get_data use
+ unsigned char extended_extranonce[extranoncesz + 1];
+ memcpy(extended_extranonce, extranonce, extranoncesz);
+ extended_extranonce[extranoncesz] = 0;
+ return blkmk_assemble_submission2_internal(tmpl, data, extended_extranonce, extranoncesz + 1, nonce, foreign);
+ }
+ return blkmk_assemble_submission2_internal(tmpl, data, extranonce, extranoncesz, nonce, foreign);
+}
diff --git a/blkmaker.h b/blkmaker.h
index 9759da2..b1f4d0f 100644
--- a/blkmaker.h
+++ b/blkmaker.h
@@ -11,7 +11,7 @@
extern "C" {
#endif
-#define BLKMAKER_VERSION (6L)
+#define BLKMAKER_VERSION (7L)
#define BLKMAKER_MAX_BLOCK_VERSION (4)
extern bool (*blkmk_sha256_impl)(void *hash_out, const void *data, size_t datasz);
diff --git a/blkmaker_jansson.c b/blkmaker_jansson.c
index fcf803f..73adb72 100644
--- a/blkmaker_jansson.c
+++ b/blkmaker_jansson.c
@@ -1,11 +1,12 @@
/*
- * Copyright 2012-2014 Luke Dashjr
+ * Copyright 2012-2016 Luke Dashjr
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the standard MIT license. See COPYING for more details.
*/
#define _BSD_SOURCE
+#define _DEFAULT_SOURCE
#include <stdlib.h>
#include <string.h>
@@ -213,9 +214,15 @@ 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 = calloc(txns, sizeof(*tmpl->txns));
+ tmpl->txns_datasz = 0;
for (size_t i = 0; i < txns; ++i)
- if ((s = parse_txn(&tmpl->txns[i], json_array_get(v, i))))
+ {
+ struct blktxn_t * const txn = &tmpl->txns[i];
+ if ((s = parse_txn(txn, json_array_get(v, i)))) {
return s;
+ }
+ tmpl->txns_datasz += txn->datasz;
+ }
if ((v = json_object_get(json, "coinbasetxn")) && json_is_object(v))
{
@@ -305,7 +312,7 @@ json_t *blktmpl_propose_jansson(blktemplate_t * const tmpl, const uint32_t caps,
uint8_t sdata[0x4c];
if (!blkmk_sample_data_(tmpl, sdata, dataid))
goto err;
- char *blkhex = blkmk_assemble_submission_(tmpl, sdata, dataid, 0, foreign);
+ char *blkhex = blkmk_assemble_submission2_(tmpl, sdata, NULL, 0, dataid, 0, foreign);
if (!blkhex)
goto err;
if (!(ja = json_string(blkhex)))
@@ -322,8 +329,8 @@ err:
}
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);
+json_t *_blkmk_submit_jansson(blktemplate_t *tmpl, const unsigned char *data, const void * const extranonce, const size_t extranoncesz, unsigned int dataid, blknonce_t nonce, bool foreign) {
+ char *blkhex = blkmk_assemble_submission2_(tmpl, data, extranonce, extranoncesz, dataid, nonce, foreign);
if (!blkhex)
return NULL;
@@ -372,9 +379,13 @@ err:
}
json_t *blkmk_submit_jansson(blktemplate_t *tmpl, const unsigned char *data, unsigned int dataid, blknonce_t nonce) {
- return _blkmk_submit_jansson(tmpl, data, dataid, nonce, false);
+ return _blkmk_submit_jansson(tmpl, data, NULL, 0, dataid, nonce, false);
}
json_t *blkmk_submit_foreign_jansson(blktemplate_t *tmpl, const unsigned char *data, unsigned int dataid, blknonce_t nonce) {
- return _blkmk_submit_jansson(tmpl, data, dataid, nonce, true);
+ return _blkmk_submit_jansson(tmpl, data, NULL, 0, dataid, nonce, true);
+}
+
+json_t *blkmk_submitm_jansson(blktemplate_t * const tmpl, const unsigned char *data, const void * const extranonce, const size_t extranoncesz, const blknonce_t nonce, const bool foreign) {
+ return _blkmk_submit_jansson(tmpl, data, extranonce, extranoncesz, 0, nonce, foreign);
}
diff --git a/blkmaker_jansson.h b/blkmaker_jansson.h
index 08a5d6e..6308488 100644
--- a/blkmaker_jansson.h
+++ b/blkmaker_jansson.h
@@ -14,6 +14,7 @@ extern const char *blktmpl_add_jansson(blktemplate_t *, const json_t *, time_t t
extern json_t *blktmpl_propose_jansson(blktemplate_t *, uint32_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);
+extern json_t *blkmk_submitm_jansson(blktemplate_t *, const unsigned char *data, const void *extranonce, size_t extranoncesz, blknonce_t, bool foreign);
#ifdef __cplusplus
}
diff --git a/blktemplate.c b/blktemplate.c
index 32875c2..055cc69 100644
--- a/blktemplate.c
+++ b/blktemplate.c
@@ -1,16 +1,15 @@
/*
- * Copyright 2012-2013 Luke Dashjr
+ * Copyright 2012-2016 Luke Dashjr
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the standard MIT license. See COPYING for more details.
*/
-#define _BSD_SOURCE
-
#include <limits.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
+#include <strings.h>
#include <blktemplate.h>
diff --git a/blktemplate.h b/blktemplate.h
index 7bed8ec..c7a3abf 100644
--- a/blktemplate.h
+++ b/blktemplate.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 Luke Dashjr
+ * Copyright 2012-2016 Luke Dashjr
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the standard MIT license. See COPYING for more details.
@@ -24,6 +24,9 @@ typedef uint32_t blktime_t;
typedef int16_t blktime_diff_t;
typedef uint32_t blknonce_t;
+#define libblkmaker_blkheader_size (80)
+#define libblkmaker_coinbase_size_limit (100)
+
struct blktxn_t {
unsigned char *data;
size_t datasz;
@@ -134,6 +137,8 @@ typedef struct {
unsigned aux_count;
struct blkaux_t *auxs;
+
+ unsigned long txns_datasz;
} blktemplate_t;
extern blktemplate_t *blktmpl_create();
diff --git a/configure.ac b/configure.ac
index 41da415..67e3d9e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@ dnl * under the terms of the standard MIT license. See COPYING for more details
AC_INIT(
[libblkmaker],
- [0.5.2],
+ [0.5.3],
[luke_libblkmaker at dashjr.org],
[libblkmaker],
[http://gitorious.org/bitcoin/libblkmaker])
@@ -19,7 +19,7 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
LT_INIT([disable-static])
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-AC_SUBST([LIBBLKMAKER_SO_VERSION], [6:2:0])
+AC_SUBST([LIBBLKMAKER_SO_VERSION], [7:0:1])
AC_SUBST([LIBBLKMAKER_API_VERSION], [0.1])
AC_CONFIG_FILES([Makefile
diff --git a/private.h b/private.h
index f149223..550c35d 100644
--- a/private.h
+++ b/private.h
@@ -9,7 +9,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);
+extern char *blkmk_assemble_submission2_(blktemplate_t *, const unsigned char *data, const void *extranonce, size_t extranoncesz, unsigned int dataid, blknonce_t nonce, bool foreign);
// blktemplate.c
extern void _blktxn_free(struct blktxn_t *);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-bitcoin/libblkmaker.git
More information about the Pkg-bitcoin-commits
mailing list