diff --git a/configure.ac b/configure.ac index b5f51ef0..41f9e748 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(ckpool, 0.8.7, kernel@kolivas.org) +AC_INIT(ckpool, 0.8.8, kernel@kolivas.org) AC_CANONICAL_SYSTEM AC_CONFIG_MACRO_DIR([m4]) diff --git a/src/libckpool.c b/src/libckpool.c index 09bfa9a2..398b1a1c 100644 --- a/src/libckpool.c +++ b/src/libckpool.c @@ -1619,9 +1619,8 @@ char *http_base64(const char *src) void address_to_pubkeytxn(char *pkh, const char *addr) { - char b58bin[25]; + char b58bin[25] = {}; - memset(b58bin, 0, 25); b58tobin(b58bin, addr); pkh[0] = 0x76; pkh[1] = 0xa9; @@ -1631,6 +1630,17 @@ void address_to_pubkeytxn(char *pkh, const char *addr) pkh[24] = 0xac; } +void address_to_scripttxn(char *pkh, const char *addr) +{ + char b58bin[25] = {}; + + b58tobin(b58bin, addr); + pkh[0] = 0xa9; + pkh[1] = 0x14; + memcpy(&pkh[2], &b58bin[1], 20); + pkh[22] = 0x87; +} + /* For encoding nHeight into coinbase, return how many bytes were used */ int ser_number(uchar *s, int32_t val) { diff --git a/src/libckpool.h b/src/libckpool.h index 0180606c..dc28e18d 100644 --- a/src/libckpool.h +++ b/src/libckpool.h @@ -537,6 +537,7 @@ int safecmp(const char *a, const char *b); bool cmdmatch(const char *buf, const char *cmd); void address_to_pubkeytxn(char *pkh, const char *addr); +void address_to_scripttxn(char *pkh, const char *addr); int ser_number(uchar *s, int32_t val); int get_sernumber(uchar *s); bool fulltest(const uchar *hash, const uchar *target); diff --git a/src/stratifier.c b/src/stratifier.c index c18ed5d0..0d3382de 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -330,7 +330,9 @@ static const char *ckdb_seq_names[] = { struct stratifier_data { char pubkeytxnbin[25]; + int pubkeytxnlen; char donkeytxnbin[25]; + int donkeytxnlen; pool_stats_t stats; /* Protects changes to pool stats */ @@ -542,18 +544,18 @@ static void generate_coinbase(const ckpool_t *ckp, workbase_t *wb) *u64 = htole64(g64); wb->coinb2len += 8; - wb->coinb2bin[wb->coinb2len++] = 25; - memcpy(wb->coinb2bin + wb->coinb2len, sdata->pubkeytxnbin, 25); - wb->coinb2len += 25; + wb->coinb2bin[wb->coinb2len++] = sdata->pubkeytxnlen; + memcpy(wb->coinb2bin + wb->coinb2len, sdata->pubkeytxnbin, sdata->pubkeytxnlen); + wb->coinb2len += sdata->pubkeytxnlen; if (ckp->donvalid) { u64 = (uint64_t *)&wb->coinb2bin[wb->coinb2len]; *u64 = htole64(d64); wb->coinb2len += 8; - wb->coinb2bin[wb->coinb2len++] = 25; - memcpy(wb->coinb2bin + wb->coinb2len, sdata->donkeytxnbin, 25); - wb->coinb2len += 25; + wb->coinb2bin[wb->coinb2len++] = sdata->donkeytxnlen; + memcpy(wb->coinb2bin + wb->coinb2len, sdata->donkeytxnbin, sdata->donkeytxnlen); + wb->coinb2len += sdata->donkeytxnlen; } wb->coinb2len += 4; // Blank lock @@ -4456,6 +4458,13 @@ static void read_poolstats(ckpool_t *ckp) } } +/* Braindead check to see if this btcaddress is an M of N script address which + * is currently unsupported as a generation address. */ +static bool script_address(const char *btcaddress) +{ + return btcaddress[0] == '3'; +} + int stratifier(proc_instance_t *pi) { pthread_t pth_blockupdate, pth_statsupdate, pth_heartbeat; @@ -4486,11 +4495,23 @@ int stratifier(proc_instance_t *pi) /* Store this for use elsewhere */ hex2bin(scriptsig_header_bin, scriptsig_header, 41); - address_to_pubkeytxn(sdata->pubkeytxnbin, ckp->btcaddress); + if (script_address(ckp->btcaddress)) { + address_to_scripttxn(sdata->pubkeytxnbin, ckp->btcaddress); + sdata->pubkeytxnlen = 23; + } else { + address_to_pubkeytxn(sdata->pubkeytxnbin, ckp->btcaddress); + sdata->pubkeytxnlen = 25; + } if (test_address(ckp, ckp->donaddress)) { ckp->donvalid = true; - address_to_pubkeytxn(sdata->donkeytxnbin, ckp->donaddress); + if (script_address(ckp->donaddress)) { + sdata->donkeytxnlen = 23; + address_to_scripttxn(sdata->donkeytxnbin, ckp->donaddress); + } else { + sdata->donkeytxnlen = 25; + address_to_pubkeytxn(sdata->donkeytxnbin, ckp->donaddress); + } } }