From 1188bd94c4533888f62cd384d1e3424383649624 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 26 Jan 2019 14:04:18 +0300 Subject: [PATCH 1/6] `masternode` is an array now --- stratum/coinbase.cpp | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index 9bf0a2bd3..eded5520d 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -411,19 +411,37 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * } } } - if (masternode_enabled && masternode) { - bool started = json_get_bool(json_result, "masternode_payments_started"); - const char *payee = json_get_string(masternode, "payee"); - json_int_t amount = json_get_int(masternode, "amount"); - if (payee && amount && started) { - npayees++; - available -= amount; - base58_decode(payee, script_payee); - bool masternode_use_p2sh = (strcmp(coind->symbol, "MAC") == 0); - if(masternode_use_p2sh) - p2sh_pack_tx(coind, script_dests, amount, script_payee); - else - job_pack_tx(coind, script_dests, amount, script_payee); + bool started = json_get_bool(json_result, "masternode_payments_started"); + if (masternode_enabled && masternode && started) { + if (json_is_array(masternode)) { + for(int i = 0; i < masternode->u.array.length; i++) { + const char *payee = json_get_string(masternode->u.array.values[i], "payee"); + json_int_t amount = json_get_int(masternode->u.array.values[i], "amount"); + if (payee && amount) { + npayees++; + available -= amount; + base58_decode(payee, script_payee); + bool masternode_use_p2sh = (strcmp(coind->symbol, "MAC") == 0); + if(masternode_use_p2sh) + p2sh_pack_tx(coind, script_dests, amount, script_payee); + else + job_pack_tx(coind, script_dests, amount, script_payee); + //debuglog("%s masternode %s %u\n", coind->symbol, payee, amount); + } + } + } else { + const char *payee = json_get_string(masternode, "payee"); + json_int_t amount = json_get_int(masternode, "amount"); + if (payee && amount) { + npayees++; + available -= amount; + base58_decode(payee, script_payee); + bool masternode_use_p2sh = (strcmp(coind->symbol, "MAC") == 0); + if(masternode_use_p2sh) + p2sh_pack_tx(coind, script_dests, amount, script_payee); + else + job_pack_tx(coind, script_dests, amount, script_payee); + } } } sprintf(payees, "%02x", npayees); From 1f67daf4e7a74fd371ab271a41dc7e70825232a9 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 26 Jan 2019 14:05:05 +0300 Subject: [PATCH 2/6] When `coinbase_payload` is specified it must be a coinbase special tx --- stratum/coinbase.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index eded5520d..0cc10e049 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -93,6 +93,9 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * char eversion1[32] = "01000000"; if(coind->txmessage) strcpy(eversion1, "02000000"); + const char *coinbase_payload = json_get_string(json_result, "coinbase_payload"); + if(coinbase_payload && strlen(coinbase_payload) > 0) + strcpy(eversion1, "03000500"); char script1[4*1024]; sprintf(script1, "%s%s%s08", eheight, templ->flags, etime); From a06d0688ffaff74fab245a89d115abd5318288b8 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 26 Jan 2019 14:05:21 +0300 Subject: [PATCH 3/6] Serialize `coinbase_payload` into coinbase tx --- stratum/coinbase.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index 0cc10e049..89a10af09 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -453,6 +453,9 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * strcat(templ->coinb2, script_dests); job_pack_tx(coind, templ->coinb2, available, NULL); strcat(templ->coinb2, "00000000"); // locktime + if(coinbase_payload && strlen(coinbase_payload) > 0) + strcat(templ->coinb2, coinbase_payload); + coind->reward = (double)available/100000000*coind->reward_mul; //debuglog("%s total %u available %u\n", coind->symbol, templ->value, available); //debuglog("%s %d dests %s\n", coind->symbol, npayees, script_dests); From b3b2d8ea271ccf675be6fba9ddf503477823f1c7 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 26 Jan 2019 14:47:52 +0300 Subject: [PATCH 4/6] Use `script` instead of `payee` if available This allows both p2pkh and p2psh in mn payouts and superblocks --- stratum/coinbase.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index 89a10af09..6aefca9a3 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -27,6 +27,19 @@ static void p2sh_pack_tx(YAAMP_COIND *coind, char *data, json_int_t amount, char strcat(data, coinb2_part); } +static void script_pack_tx(YAAMP_COIND *coind, char *data, json_int_t amount, const char *script) +{ + char evalue[32]; + char coinb2_part[256]; + char coinb2_len[4]; + encode_tx_value(evalue, amount); + sprintf(coinb2_part, "%s", script); + sprintf(coinb2_len, "%02x", (unsigned int)(strlen(coinb2_part) >> 1) & 0xFF); + strcat(data, evalue); + strcat(data, coinb2_len); + strcat(data, coinb2_part); +} + static void job_pack_tx(YAAMP_COIND *coind, char *data, json_int_t amount, char *key) { int ol = strlen(data); @@ -400,8 +413,14 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * if(superblocks_enabled && superblock) { for(int i = 0; i < superblock->u.array.length; i++) { const char *payee = json_get_string(superblock->u.array.values[i], "payee"); + const char *script = json_get_string(superblock->u.array.values[i], "script"); json_int_t amount = json_get_int(superblock->u.array.values[i], "amount"); - if (payee && amount) { + if (!amount) continue; + if (script) { + npayees++; + available -= amount; + script_pack_tx(coind, script_dests, amount, script); + } else if (payee) { npayees++; available -= amount; base58_decode(payee, script_payee); @@ -419,8 +438,14 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * if (json_is_array(masternode)) { for(int i = 0; i < masternode->u.array.length; i++) { const char *payee = json_get_string(masternode->u.array.values[i], "payee"); + const char *script = json_get_string(masternode->u.array.values[i], "script"); json_int_t amount = json_get_int(masternode->u.array.values[i], "amount"); - if (payee && amount) { + if (!amount) continue; + if (script) { + npayees++; + available -= amount; + script_pack_tx(coind, script_dests, amount, script); + } else if (payee) { npayees++; available -= amount; base58_decode(payee, script_payee); From 53236df0e868a8a279996ac2bcb9bcdb59a433f4 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 6 Feb 2019 23:53:24 +0300 Subject: [PATCH 5/6] Add coinbase_payload size --- stratum/coinbase.cpp | 6 +++++- stratum/util.cpp | 20 ++++++++++++++++++++ stratum/util.h | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index 6aefca9a3..2184d1c38 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -478,8 +478,12 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * strcat(templ->coinb2, script_dests); job_pack_tx(coind, templ->coinb2, available, NULL); strcat(templ->coinb2, "00000000"); // locktime - if(coinbase_payload && strlen(coinbase_payload) > 0) + if(coinbase_payload && strlen(coinbase_payload) > 0) { + char coinbase_payload_size[18]; + ser_compactsize((unsigned int)(strlen(coinbase_payload_size) >> 1), coinbase_payload_size); + strcat(templ->coinb2, coinbase_payload_size); strcat(templ->coinb2, coinbase_payload); + } coind->reward = (double)available/100000000*coind->reward_mul; //debuglog("%s total %u available %u\n", coind->symbol, templ->value, available); diff --git a/stratum/util.cpp b/stratum/util.cpp index 92f284a80..3687d86da 100644 --- a/stratum/util.cpp +++ b/stratum/util.cpp @@ -479,6 +479,26 @@ void ser_number(int n, char *a) // printf("ser_number %d, %s\n", n, a); } +void ser_compactsize(uint64_t nSize, char *a) +{ + if (nSize < 253) + { + sprintf(a, "%02lx", nSize); + } + else if (nSize <= (unsigned short)-1) + { + sprintf(a, "%02x%04lx", 253, nSize); + } + else if (nSize <= (unsigned int)-1) + { + sprintf(a, "%02x%08lx", 254, nSize); + } + else + { + sprintf(a, "%02x%016lx", 255, nSize); + } +} + void ser_string_be(const char *input, char *output, int len) { for(int i=0; i Date: Mon, 8 Apr 2019 22:33:52 +0300 Subject: [PATCH 6/6] Apply review suggestion --- stratum/coinbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stratum/coinbase.cpp b/stratum/coinbase.cpp index 2184d1c38..e131b495b 100644 --- a/stratum/coinbase.cpp +++ b/stratum/coinbase.cpp @@ -480,7 +480,7 @@ void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value * strcat(templ->coinb2, "00000000"); // locktime if(coinbase_payload && strlen(coinbase_payload) > 0) { char coinbase_payload_size[18]; - ser_compactsize((unsigned int)(strlen(coinbase_payload_size) >> 1), coinbase_payload_size); + ser_compactsize((unsigned int)(strlen(coinbase_payload) >> 1), coinbase_payload_size); strcat(templ->coinb2, coinbase_payload_size); strcat(templ->coinb2, coinbase_payload); }