Example #1
0
static void test_extended_key()
{
	printf("TEST: test_extended_key\n");

	// Check we get sensible results when parsing some test vector data

	struct hd_extended_key pub;
	assert(hd_extended_key_init(&pub));
	{
		cstring *tv1data = base58_decode(s_tv1_m_xpub);
		assert(hd_extended_key_deser(&pub, tv1data->str, tv1data->len));
		cstr_free(tv1data, true);
	}

	struct hd_extended_key priv;
	assert(hd_extended_key_init(&priv));
	{
		cstring *tv1data = base58_decode(s_tv1_m_xprv);
		assert(hd_extended_key_deser(&priv, tv1data->str, tv1data->len));
		cstr_free(tv1data, true);
	}

	printf("PUB:\n");
	print_ek_public(&pub);

	printf("PRV:\n");
	print_ek_public(&priv);

	// Check we get the same codechains

	assert(0 == memcmp(pub.chaincode.data, priv.chaincode.data, 32));

	hd_extended_key_free(&priv);
	hd_extended_key_free(&pub);
}
Example #2
0
bool coind_validate_address(YAAMP_COIND *coind)
{
    if(!coind->wallet[0]) return false;

    char params[YAAMP_SMALLBUFSIZE];
    sprintf(params, "[\"%s\"]", coind->wallet);

    json_value *json = rpc_call(&coind->rpc, "validateaddress", params);
    if(!json) return false;

    json_value *json_result = json_get_object(json, "result");
    if(!json_result)
    {
        json_value_free(json);
        return false;
    }

    bool isvalid = json_get_bool(json_result, "isvalid");
    if(!isvalid) stratumlog("%s wallet %s is not valid.\n", coind->name, coind->wallet);

    bool ismine = json_get_bool(json_result, "ismine");
    if(!ismine) stratumlog("%s wallet %s is not mine.\n", coind->name, coind->wallet);

    const char *p = json_get_string(json_result, "pubkey");
    if(p) strcpy(coind->pubkey, p);

    json_value_free(json);
    base58_decode(coind->wallet, coind->script_pubkey);

    return isvalid && ismine;
}
Example #3
0
static void test_decode(const char *hexstr, const char *base58_str)
{
	size_t hs_len = strlen(hexstr) / 2;
	unsigned char *raw = calloc(1, hs_len);
	size_t out_len;

	bool rc = decode_hex(raw, hs_len, hexstr, &out_len);
	if (!rc) {
		fprintf(stderr, "raw %p, sizeof(raw) %lu, hexstr %p %s\n",
			raw, hs_len, hexstr, hexstr);
		assert(rc);
	}

	cstring *s = base58_decode(base58_str);
	if (memcmp(s->str, raw, out_len < s->len ? out_len : s->len)) {
		dumphex("decode have", s->str, s->len);
		dumphex("decode want", raw, out_len);
		assert(memcmp(s->str, raw, out_len) == 0);
	}
	if (s->len != out_len) {
		fprintf(stderr, "decode len: have %u, want %u\n",
			(unsigned int) s->len,
			(unsigned int) out_len);
		dumphex("decode have", s->str, s->len);
		dumphex("decode want", raw, out_len);
		assert(s->len == out_len);
	}

	free(raw);
	cstr_free(s, true);
}
Example #4
0
cstring *base58_decode_check(unsigned char *addrtype, const char *s_in)
{
	/* decode base58 string */
	cstring *s = base58_decode(s_in);
	if (!s)
		return NULL;
	if (s->len < 4)
		goto err_out;

	/* validate with trailing hash, then remove hash */
	unsigned char md32[4];
	bu_Hash4(md32, s->str, s->len - 4);

	if (memcmp(md32, &s->str[s->len - 4], 4))
		goto err_out;

	cstr_resize(s, s->len - 4);

	/* if addrtype requested, remove from front of data string */
	if (addrtype) {
		*addrtype = (unsigned char) s->str[0];
		cstr_erase(s, 0, 1);
	}

	return s;

err_out:
	cstr_free(s, true);
	return NULL;
}
Example #5
0
static void print_from_base58(const char *str)
{
	cstring *out_str = base58_decode(str);
	/* *out= out_str->str; */
	/* *out_len = out_str->len; */
	print_n(out_str->str, out_str->len);
	cstr_free(out_str, true);
}
Example #6
0
CoinKey::CoinKey(const std::string& src)
{
	binary bin = base58_decode(src.c_str());
	if (bin.size() == sizeof(m_data))
	{
		memcpy(&m_data, &bin[0], bin.size());
	}
	else
	{
		memset(&m_data, 0, sizeof(m_data));
	}
}
Example #7
0
static bool read_ek_ser_from_base58(const char *base58,
				    struct hd_extended_key_serialized *out)
{
	cstring *str = base58_decode(base58);
	if (str->len == 82) {
		memcpy(out->data, str->str, 78);
		cstr_free(str, true);
		return true;
	}

	cstr_free(str, true);
	return false;
}
Example #8
0
static void print_from_base58_key(const char *str)
{
	cstring *out_str = base58_decode(str);
	/* *out= out_str->str; */
	/* *out_len = out_str->len; */
	uint8_t *d = (uint8_t *)(out_str->str);
	print_n(d, 4); SPACE; // version
	print_n(d + 4, 1); SPACE; // depth
	print_n(d + 5, 4); SPACE; // parent fingerprint
	print_n(d + 9, 4); SPACE; // idx
	print_n(d + 13, 32); SPACE; // chain code
	print_n(d + 45, 33); SPACE; // key

	/* print_n(out_str->str, out_str->len); */
	cstr_free(out_str, true);
}
Example #9
0
static mrb_value mrb_base58_decode(mrb_state *mrb, mrb_value self)
{
  const char *chars = default_chars;
  char *custom_chars;
  char *data;
  mrb_int data_len;
  mrb_value result;
  mrb_int result_len = 0;

  if (mrb_get_args(mrb, "s|z", &data, &data_len, &custom_chars) == 2) {
    if (strlen(custom_chars) != 58) mrb_raise(mrb, E_ARGUMENT_ERROR, "Base58 requires 58 symbols");
    chars = custom_chars;
  }

  result = mrb_str_buf_new(mrb, data_len);
  result_len = base58_decode(mrb, RSTRING_PTR(result), data, data_len, chars);

  if (result_len < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid Base58 symbol");

  return mrb_str_resize(mrb, result, result_len);
}
Example #10
0
void coinbase_create(YAAMP_COIND *coind, YAAMP_JOB_TEMPLATE *templ, json_value *json_result)
{
	char eheight[64];
	ser_number(templ->height, eheight);

	char etime[64];
	ser_number(time(NULL), etime);

	char entime[64];
	memset(entime, 0, 64);

	if(coind->pos)
		ser_string_be(templ->ntime, entime, 1);

	char eversion1[64] = "01000000";

	if(coind->txmessage)
		strcpy(eversion1, "02000000");

	char script1[4*1024];
	sprintf(script1, "%s%s%s08", eheight, templ->flags, etime);

	char script2[4*1024] = "7961616d702e636f6d00";		// yaamp.com
	if(!coind->pos && !coind->isaux && templ->auxs_size)
		coinbase_aux(templ, script2);

	int script_len = strlen(script1)/2 + strlen(script2)/2 + 8;

	sprintf(templ->coinb1,
		"%s%s010000000000000000000000000000000000000000000000000000000000000000ffffffff%02x%s",		// 8+8+74+2 -> height
		eversion1, entime, script_len, script1);

	sprintf(templ->coinb2, "%s00000000", script2);
	json_int_t available = templ->value;

	if(strcmp(coind->symbol, "DRK") == 0 || strcmp(coind->symbol, "DASH") == 0 || strcmp(coind->symbol, "BOD") == 0)
//	if(strcmp(coind->symbol, "DRK") == 0)
	{
		char charity_payee[1024] = "";
		strcpy(charity_payee, json_get_string(json_result, "payee"));

		json_int_t charity_amount = json_get_int(json_result, "payee_amount");
		bool charity_payments = json_get_bool(json_result, "masternode_payments");
		bool charity_enforce = json_get_bool(json_result, "enforce_masternode_payments");

		if(charity_payments && charity_enforce)
		{
			strcat(templ->coinb2, "02");
			available -= charity_amount;

			char script_payee[1024];
			base58_decode(charity_payee, script_payee);

			job_pack_tx(coind, templ->coinb2, charity_amount, script_payee);
		}
		else
			strcat(templ->coinb2, "01");
	}

	else
		strcat(templ->coinb2, "01");

	job_pack_tx(coind, templ->coinb2, available, NULL);
	strcat(templ->coinb2, "00000000");				// locktime

	coind->reward = (double)available/100000000*coind->reward_mul;
//	debuglog("coinbase %f\n", coind->reward);

//	debuglog("new job: %x, %s, %s, %s\n", coind->templ->id, coind->templ->version, coind->templ->nbits, coind->templ->ntime);
//	debuglog("coinb1 %s\n", templ->coinb1);
//	debuglog("coinb2 %s\n", templ->coinb2);
}