Skip to content

Commit

Permalink
Merge pull request #5 from jasonbcox/p2sh-outputs
Browse files Browse the repository at this point in the history
Add support for p2sh coinbase outputs
  • Loading branch information
haipome committed Jun 28, 2021
2 parents 441df70 + 79d4baf commit 4891c9c
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 15 deletions.
8 changes: 4 additions & 4 deletions jobmaster/jm_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,15 @@ int read_vcashcoin(json_t *root, const char *key)
return load_cfg_coin_rpc_sub(vcash_obj, settings.vcash_coin);
}

int read_recipient(json_t *root, const char *key, sds *recipient)
int read_recipient(json_t *root, const char *key, sds *recipient, enum address_type *addr_type)
{
char *address;
int ret = read_cfg_str(root, key, &address, NULL);
if (ret < 0) {
printf("read: %s fail: %d\n", key ,ret);
return -__LINE__;
}
*recipient = address2sig(address);
*recipient = address2sig(address, addr_type);
if (*recipient == NULL) {
printf("key: %s, invalid address: %s\n", key, address);
return -__LINE__;
Expand Down Expand Up @@ -76,7 +76,7 @@ int read_recipients(json_t *root, const char *key)
if(!json_is_real(percent_object))
return -__LINE__;

sds address = address2sig(json_string_value(address_object));
sds address = address2sig(json_string_value(address_object), &settings.coin_recipients[i].addr_type);
if(address == NULL)
return -__LINE__;
double percent = json_real_value(percent_object);
Expand Down Expand Up @@ -181,7 +181,7 @@ int do_load_config(json_t *root)
printf("load main_coin config fail: %d\n", ret);
return -__LINE__;
}
ret = read_recipient(root, "main_coin_recipient", &settings.main_coin_recipient);
ret = read_recipient(root, "main_coin_recipient", &settings.main_coin_recipient, &settings.main_coin_recipient_addr_type);
if (ret < 0) {
printf("read main_coin_recipient fail: %d\n", ret);
return -__LINE__;
Expand Down
3 changes: 3 additions & 0 deletions jobmaster/jm_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
# include "nw_clt.h"
# include "nw_timer.h"
# include "nw_state.h"
# include "ut_base58.h"
# include "ut_log.h"
# include "ut_sds.h"
# include "ut_cli.h"
Expand All @@ -29,6 +30,7 @@

struct coin_recipient {
sds address;
enum address_type addr_type;
double percent;
};

Expand All @@ -47,6 +49,7 @@ struct settings {

coin_rpc_cfg main_coin;
sds main_coin_recipient;
enum address_type main_coin_recipient_addr_type;
struct coin_recipient *coin_recipients;
int coin_recipient_count;
double coin_recipient_percents;
Expand Down
26 changes: 17 additions & 9 deletions jobmaster/jm_job.c
Original file line number Diff line number Diff line change
Expand Up @@ -307,16 +307,24 @@ static int get_aux_coin_job(struct job *job)
return 0;
}

static int pack_output_transaction(void ** p, size_t * left, sds pubkey, uint64_t reward)
static int pack_output_transaction(void ** p, size_t * left, sds pubkey, enum address_type addr_type, uint64_t reward)
{
pack_uint64_le(p, left, reward); // reward
pack_varint_le(p, left, 25); // pubkey script
pack_char(p, left, 0x76); // OP_DUP
if (addr_type == address_type_p2sh) {
pack_varint_le(p, left, 23); // p2sh len
} else {
pack_varint_le(p, left, 25); // pubkey script len
pack_char(p, left, 0x76); // OP_DUP
}
pack_char(p, left, 0xa9); // OP_HASH160
pack_char(p, left, 0x14); // Push 20 bytes as data
pack_buf(p, left, pubkey, sdslen(pubkey)); // PubKey hash
pack_char(p, left, 0x88); // OP_EQUALVERIFY
pack_char(p, left, 0xac); // OP_CHECKSIG
if (addr_type == address_type_p2sh) {
pack_char(p, left, 0x87); // OP_EQUAL
} else {
pack_char(p, left, 0x88); // OP_EQUALVERIFY
pack_char(p, left, 0xac); // OP_CHECKSIG
}
return 0;
}

Expand Down Expand Up @@ -487,12 +495,12 @@ static int get_main_coin_job(struct job *job, json_t *r)
else
amount = (uint64_t)floor(coinbasevalue * settings.coin_recipients[i].percent);
sum += amount;
pack_output_transaction(&p, &left, settings.coin_recipients[i].address, amount);
pack_output_transaction(&p, &left, settings.coin_recipients[i].address, settings.coin_recipients[i].addr_type, amount);
}

if(has_main_reward) {
amount = coinbasevalue - sum;
pack_output_transaction(&p, &left, settings.main_coin_recipient, amount);
pack_output_transaction(&p, &left, settings.main_coin_recipient, settings.main_coin_recipient_addr_type, amount);
}

if (job->rsk) {
Expand Down Expand Up @@ -613,7 +621,7 @@ static int get_main_coin_job_empty(struct job *job)
else
amount = (uint64_t)floor(coinbasevalue * settings.coin_recipients[i].percent);
sum += amount;
pack_output_transaction(&p, &left, settings.coin_recipients[i].address, amount);
pack_output_transaction(&p, &left, settings.coin_recipients[i].address, settings.coin_recipients[i].addr_type, amount);
}
if (job->rsk) {
pack_uint64_le(&p, &left, 0); // reward
Expand All @@ -640,7 +648,7 @@ static int get_main_coin_job_empty(struct job *job)

if(has_main_reward) {
amount = coinbasevalue - sum;
pack_output_transaction(&p, &left, settings.main_coin_recipient, amount);
pack_output_transaction(&p, &left, settings.main_coin_recipient, settings.main_coin_recipient_addr_type, amount);
}
pack_uint32_le(&p, &left, 0); // locktime
job->coinbase2 = bin2hex(coinbase2, sizeof(coinbase2) - left);
Expand Down
11 changes: 10 additions & 1 deletion utils/ut_base58.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ sds base58_encode(const char *mem, size_t len)
return result;
}

sds address2sig(const char *address)
sds address2sig(const char *address, enum address_type *addr_type_out)
{
sds r = base58_decode(address);

Expand All @@ -137,6 +137,15 @@ sds address2sig(const char *address)
return NULL;
}
sds result = sdsnewlen(r + 1, sdslen(r) - 5);

unsigned char version = r[0];
// check for testnet (0xc4) and mainnet (0x05) p2sh addresses
if (version == 0xc4 || version == 0x05) {
*addr_type_out = address_type_p2sh;
} else {
*addr_type_out = address_type_p2pkh;
}

sdsfree(r);
return result;
}
Expand Down
7 changes: 6 additions & 1 deletion utils/ut_base58.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,15 @@

# include "ut_sds.h"

enum address_type {
address_type_p2pkh,
address_type_p2sh,
};

sds base58_decode(const char *str);
sds base58_encode(const char *mem, size_t len);

sds address2sig(const char *address);
sds address2sig(const char *address, enum address_type *addr_type_out);
sds sig2address(uint8_t version, const char *sig);

sds zec_address2sig(const char *address);
Expand Down

0 comments on commit 4891c9c

Please sign in to comment.