This commit is contained in:
Jay D Dee
2019-07-17 17:54:38 -04:00
parent e2d5762ef2
commit 6f49ba09b7
34 changed files with 1930 additions and 382 deletions

94
util.c
View File

@@ -668,6 +668,15 @@ err_out:
return cfg;
}
void cbin2hex(char *out, const char *in, size_t len)
{
if (out) {
unsigned int i;
for (i = 0; i < len; i++)
sprintf(out + (i * 2), "%02x", (uint8_t)in[i]);
}
}
void bin2hex(char *s, const unsigned char *p, size_t len)
{
for (size_t i = 0; i < len; i++)
@@ -1693,35 +1702,47 @@ static uint32_t getblocheight(struct stratum_ctx *sctx)
static bool stratum_notify(struct stratum_ctx *sctx, json_t *params)
{
const char *job_id, *prevhash, *coinb1, *coinb2, *version, *nbits, *stime;
const char *extradata = NULL;
const char *denom10 = NULL, *denom100 = NULL, *denom1000 = NULL,
*denom10000 = NULL, *prooffullnode = NULL;
const char *extradata = NULL;
size_t coinb1_size, coinb2_size;
bool clean, ret = false;
int merkle_count, i, p = 0;
json_t *merkle_arr;
uchar **merkle = NULL;
int jsize = json_array_size(params);
bool has_claim = ( opt_algo == ALGO_LBRY ) && ( jsize == 10 );
bool has_roots = ( opt_algo == ALGO_PHI2 ) && ( jsize == 10 );
job_id = json_string_value(json_array_get(params, p++));
bool has_claim = ( opt_algo == ALGO_LBRY ) && ( jsize == 10 );
bool has_roots = ( opt_algo == ALGO_PHI2 ) && ( jsize == 10 );
bool is_veil = ( opt_algo == ALGO_X16RT_VEIL );
job_id = json_string_value(json_array_get(params, p++));
prevhash = json_string_value(json_array_get(params, p++));
if ( has_claim )
{
extradata = json_string_value(json_array_get(params, p++));
if ( !extradata || strlen( extradata ) != 64 )
{
applog(LOG_ERR, "Stratum notify: invalid claim parameter");
goto out;
}
}
else if ( has_roots )
{
extradata = json_string_value(json_array_get(params, p++));
if ( !extradata || strlen( extradata ) != 128 )
{
applog(LOG_ERR, "Stratum notify: invalid UTXO root parameter");
goto out;
}
}
if ( has_claim )
{
extradata = json_string_value(json_array_get(params, p++));
if ( !extradata || strlen( extradata ) != 64 )
{
applog(LOG_ERR, "Stratum notify: invalid claim parameter");
goto out;
}
}
else if ( has_roots )
{
extradata = json_string_value(json_array_get(params, p++));
if ( !extradata || strlen( extradata ) != 128 )
{
applog(LOG_ERR, "Stratum notify: invalid UTXO root parameter");
goto out;
}
}
if ( is_veil )
{
denom10 = json_string_value(json_array_get(params, p++));
denom100 = json_string_value(json_array_get(params, p++));
denom1000 = json_string_value(json_array_get(params, p++));
denom10000 = json_string_value(json_array_get(params, p++));
prooffullnode = json_string_value(json_array_get(params, p++));
}
coinb1 = json_string_value(json_array_get(params, p++));
coinb2 = json_string_value(json_array_get(params, p++));
@@ -1733,7 +1754,7 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params)
nbits = json_string_value(json_array_get(params, p++));
stime = json_string_value(json_array_get(params, p++));
clean = json_is_true(json_array_get(params, p)); p++;
if (!job_id || !prevhash || !coinb1 || !coinb2 || !version || !nbits || !stime ||
strlen(prevhash) != 64 || strlen(version) != 8 ||
strlen(nbits) != 8 || strlen(stime) != 8) {
@@ -1741,8 +1762,22 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params)
goto out;
}
merkle = (uchar**) malloc(merkle_count * sizeof(char *));
for (i = 0; i < merkle_count; i++) {
if ( is_veil )
{
if ( !denom10 || !denom100 || !denom1000 || !denom10000
|| !prooffullnode || strlen(denom10) != 64 || strlen(denom100) != 64
|| strlen(denom1000) != 64 || strlen(denom10000) != 64
|| strlen(prooffullnode) != 64 )
{
applog(LOG_ERR, "Stratum notify: invalid veil parameters");
goto out;
}
}
if ( merkle_count )
merkle = (uchar**) malloc(merkle_count * sizeof(char *));
for ( i = 0; i < merkle_count; i++ )
{
const char *s = json_string_value(json_array_get(merkle_arr, i));
if (!s || strlen(s) != 64) {
while (i--)
@@ -1774,6 +1809,15 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params)
if (has_claim) hex2bin(sctx->job.extra, extradata, 32);
if (has_roots) hex2bin(sctx->job.extra, extradata, 64);
if ( is_veil )
{
hex2bin(sctx->job.denom10, denom10, 32);
hex2bin(sctx->job.denom100, denom100, 32);
hex2bin(sctx->job.denom1000, denom1000, 32);
hex2bin(sctx->job.denom10000, denom10000, 32);
hex2bin(sctx->job.proofoffullnode, prooffullnode, 32);
}
sctx->bloc_height = getblocheight(sctx);
for (i = 0; i < sctx->job.merkle_count; i++)