Browse Source

Implement rudimentary untested address to script transaction support in the generation code

master
Con Kolivas 10 years ago
parent
commit
2aa93069cc
  1. 4
      src/libckpool.c
  2. 30
      src/stratifier.c

4
src/libckpool.c

@ -1503,7 +1503,7 @@ static const int b58tobin_tbl[] = {
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
};
/* b58bin should always be at least 21 bytes long and already checked to be
/* b58bin should always be at least 24 bytes long and already checked to be
* valid. */
void b58tobin(char *b58bin, const char *b58)
{
@ -1632,7 +1632,7 @@ void address_to_pubkeytxn(char *pkh, const char *addr)
void address_to_scripttxn(char *pkh, const char *addr)
{
char b58bin[23] = {};
char b58bin[25] = {};
b58tobin(b58bin, addr);
pkh[0] = 0xa9;

30
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
@ -4490,20 +4492,28 @@ int stratifier(proc_instance_t *pi)
LOGEMERG("Fatal: btcaddress invalid according to bitcoind");
goto out;
}
if (script_address(ckp->btcaddress)) {
LOGEMERG("Fatal: btcaddress valid but unsupported M of N 3x address");
goto out;
}
/* Store this for use elsewhere */
hex2bin(scriptsig_header_bin, scriptsig_header, 41);
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;
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);
}
}
}
randomiser = ((int64_t)time(NULL)) << 32;
/* Set the initial id to time as high bits so as to not send the same

Loading…
Cancel
Save