Merge branch 'proposals'
This commit is contained in:
92
blkmaker.c
92
blkmaker.c
@@ -13,6 +13,12 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <arpa/inet.h>
|
||||
#else
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include <blkmaker.h>
|
||||
#include <blktemplate.h>
|
||||
|
||||
@@ -347,6 +353,23 @@ void blkmk_set_times(blktemplate_t *tmpl, void * const out_hdrbuf, const time_t
|
||||
}
|
||||
}
|
||||
|
||||
bool blkmk_sample_data_(blktemplate_t * const tmpl, uint8_t * const cbuf, const unsigned int dataid) {
|
||||
my_htole32(&cbuf[0], tmpl->version);
|
||||
memcpy(&cbuf[4], &tmpl->prevblk, 32);
|
||||
|
||||
unsigned char cbtxndata[tmpl->cbtxn->datasz + sizeof(dataid)];
|
||||
size_t cbtxndatasz = 0;
|
||||
if (!_blkmk_extranonce(tmpl, cbtxndata, dataid, &cbtxndatasz))
|
||||
return false;
|
||||
if (!build_merkle_root(&cbuf[36], tmpl, cbtxndata, cbtxndatasz))
|
||||
return false;
|
||||
|
||||
my_htole32(&cbuf[0x44], tmpl->curtime);
|
||||
memcpy(&cbuf[72], &tmpl->diffbits, 4);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t blkmk_get_data(blktemplate_t *tmpl, void *buf, size_t bufsz, time_t usetime, int16_t *out_expire, unsigned int *out_dataid) {
|
||||
if (!(blkmk_time_left(tmpl, usetime) && blkmk_work_left(tmpl) && tmpl->cbtxn))
|
||||
return 0;
|
||||
@@ -355,19 +378,10 @@ size_t blkmk_get_data(blktemplate_t *tmpl, void *buf, size_t bufsz, time_t useti
|
||||
|
||||
unsigned char *cbuf = buf;
|
||||
|
||||
my_htole32(&cbuf[0], tmpl->version);
|
||||
memcpy(&cbuf[4], &tmpl->prevblk, 32);
|
||||
|
||||
unsigned char cbtxndata[tmpl->cbtxn->datasz + sizeof(*out_dataid)];
|
||||
size_t cbtxndatasz = 0;
|
||||
*out_dataid = tmpl->next_dataid++;
|
||||
if (!_blkmk_extranonce(tmpl, cbtxndata, *out_dataid, &cbtxndatasz))
|
||||
if (!blkmk_sample_data_(tmpl, cbuf, *out_dataid))
|
||||
return 0;
|
||||
if (!build_merkle_root(&cbuf[36], tmpl, cbtxndata, cbtxndatasz))
|
||||
return 0;
|
||||
|
||||
blkmk_set_times(tmpl, &cbuf[68], usetime, out_expire, false);
|
||||
memcpy(&cbuf[72], &tmpl->diffbits, 4);
|
||||
|
||||
// TEMPORARY HACK:
|
||||
memcpy(tmpl->_mrklroot, &cbuf[36], 32);
|
||||
@@ -439,3 +453,61 @@ unsigned long blkmk_work_left(const blktemplate_t *tmpl) {
|
||||
return UINT_MAX - tmpl->next_dataid;
|
||||
return BLKMK_UNLIMITED_WORK_COUNT;
|
||||
}
|
||||
|
||||
static
|
||||
char varintEncode(unsigned char *out, uint64_t n) {
|
||||
if (n < 0xfd)
|
||||
{
|
||||
out[0] = n;
|
||||
return 1;
|
||||
}
|
||||
char L;
|
||||
if (n <= 0xffff)
|
||||
{
|
||||
out[0] = '\xfd';
|
||||
L = 3;
|
||||
}
|
||||
else
|
||||
if (n <= 0xffffffff)
|
||||
{
|
||||
out[0] = '\xfe';
|
||||
L = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
out[0] = '\xff';
|
||||
L = 9;
|
||||
}
|
||||
for (unsigned char i = 1; i < L; ++i)
|
||||
out[i] = (n >> ((i - 1) * 8)) % 256;
|
||||
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)
|
||||
{
|
||||
unsigned char blk[80 + 8 + 1000000];
|
||||
memcpy(blk, data, 76);
|
||||
nonce = htonl(nonce);
|
||||
memcpy(&blk[76], &nonce, 4);
|
||||
size_t offs = 80;
|
||||
|
||||
if (foreign || (!(tmpl->mutations & BMAb_TRUNCATE && !dataid)))
|
||||
{
|
||||
offs += varintEncode(&blk[offs], 1 + tmpl->txncount);
|
||||
|
||||
if (!_blkmk_extranonce(tmpl, &blk[offs], dataid, &offs))
|
||||
return NULL;
|
||||
|
||||
if (foreign || !(tmpl->mutations & BMAb_COINBASE))
|
||||
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);
|
||||
|
||||
return blkhex;
|
||||
}
|
||||
|
||||
@@ -10,12 +10,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <arpa/inet.h>
|
||||
#else
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
#include <blkmaker.h>
|
||||
@@ -272,66 +266,61 @@ const char *blktmpl_add_jansson(blktemplate_t *tmpl, const json_t *json, time_t
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static
|
||||
char varintEncode(unsigned char *out, uint64_t n) {
|
||||
if (n < 0xfd)
|
||||
json_t *blktmpl_propose_jansson(blktemplate_t * const tmpl, const gbt_capabilities_t caps, const bool foreign) {
|
||||
json_t *jreq = blktmpl_request_jansson(caps, NULL), *ja = NULL, *jparams;
|
||||
if (!(jreq && json_is_object(jreq)))
|
||||
goto err;
|
||||
|
||||
jparams = json_array_get(json_object_get(jreq, "params"), 0);
|
||||
if (!(jparams && json_is_object(jparams)))
|
||||
goto err;
|
||||
|
||||
if (!(ja = json_string("proposal")))
|
||||
goto err;
|
||||
if (json_object_set_new(jparams, "mode", ja))
|
||||
goto err;
|
||||
|
||||
if (tmpl->workid && !foreign)
|
||||
{
|
||||
out[0] = n;
|
||||
return 1;
|
||||
if (!(ja = json_string(tmpl->workid)))
|
||||
goto err;
|
||||
if (json_object_set_new(jparams, "workid", ja))
|
||||
goto err;
|
||||
}
|
||||
char L;
|
||||
if (n <= 0xffff)
|
||||
{
|
||||
out[0] = '\xfd';
|
||||
L = 3;
|
||||
}
|
||||
else
|
||||
if (n <= 0xffffffff)
|
||||
{
|
||||
out[0] = '\xfe';
|
||||
L = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
out[0] = '\xff';
|
||||
L = 9;
|
||||
}
|
||||
for (unsigned char i = 1; i < L; ++i)
|
||||
out[i] = (n >> ((i - 1) * 8)) % 256;
|
||||
return L;
|
||||
}
|
||||
ja = NULL;
|
||||
|
||||
unsigned int dataid = (tmpl->mutations & (BMM_CBAPPEND | BMM_CBSET) ? 1 : 0);
|
||||
|
||||
uint8_t sdata[0x4c];
|
||||
if (!blkmk_sample_data_(tmpl, sdata, dataid))
|
||||
goto err;
|
||||
char *blkhex = blkmk_assemble_submission_(tmpl, sdata, dataid, 0, foreign);
|
||||
if (!blkhex)
|
||||
goto err;
|
||||
if (!(ja = json_string(blkhex)))
|
||||
goto err;
|
||||
if (json_object_set_new(jparams, "data", ja))
|
||||
goto err;
|
||||
|
||||
return jreq;
|
||||
|
||||
#define my_bin2hex _blkmk_bin2hex
|
||||
err:
|
||||
if (jreq) json_decref(jreq);
|
||||
if (ja) json_decref(ja);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static
|
||||
json_t *_blkmk_submit_jansson(blktemplate_t *tmpl, const unsigned char *data, unsigned int dataid, blknonce_t nonce, bool foreign) {
|
||||
unsigned char blk[80 + 8 + 1000000];
|
||||
memcpy(blk, data, 76);
|
||||
nonce = htonl(nonce);
|
||||
memcpy(&blk[76], &nonce, 4);
|
||||
size_t offs = 80;
|
||||
|
||||
if (foreign || (!(tmpl->mutations & BMAb_TRUNCATE && !dataid)))
|
||||
{
|
||||
offs += varintEncode(&blk[offs], 1 + tmpl->txncount);
|
||||
|
||||
if (!_blkmk_extranonce(tmpl, &blk[offs], dataid, &offs))
|
||||
return NULL;
|
||||
|
||||
if (foreign || !(tmpl->mutations & BMAb_COINBASE))
|
||||
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[(offs * 2) + 1];
|
||||
my_bin2hex(blkhex, blk, offs);
|
||||
char *blkhex = blkmk_assemble_submission_(tmpl, data, dataid, nonce, foreign);
|
||||
if (!blkhex)
|
||||
return NULL;
|
||||
|
||||
json_t *rv = json_array(), *ja, *jb;
|
||||
jb = NULL;
|
||||
if (!(ja = json_string(blkhex)))
|
||||
ja = json_string(blkhex);
|
||||
free(blkhex);
|
||||
if (!ja)
|
||||
goto err;
|
||||
if (json_array_append_new(rv, ja))
|
||||
goto err;
|
||||
|
||||
@@ -11,6 +11,7 @@ extern "C" {
|
||||
|
||||
extern json_t *blktmpl_request_jansson(gbt_capabilities_t extracaps, const char *lpid);
|
||||
extern const char *blktmpl_add_jansson(blktemplate_t *, const json_t *, time_t time_rcvd);
|
||||
extern json_t *blktmpl_propose_jansson(blktemplate_t *, gbt_capabilities_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);
|
||||
|
||||
|
||||
@@ -4,8 +4,12 @@
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <blktemplate.h>
|
||||
|
||||
// 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);
|
||||
|
||||
// blktemplate.c
|
||||
extern void _blktxn_free(struct blktxn_t *);
|
||||
|
||||
Reference in New Issue
Block a user