[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