|
|
|
#include <bitcoin/pubkey.h>
|
|
|
|
#include <bitcoin/short_channel_id.h>
|
|
|
|
#include <ccan/ccan/str/hex/hex.h>
|
|
|
|
#include <common/amount.h>
|
|
|
|
#include <common/json_helpers.h>
|
common/node_id: new type.
Node ids are pubkeys, but we only use them as pubkeys for routing and checking
gossip messages. So we're packing and unpacking them constantly, and wasting
some space and time.
This introduces a new type, explicitly the SEC1 compressed encoding
(33 bytes). We ensure its validity when we load from the db, or get it
from JSON. We still use 'struct pubkey' for peer messages, which checks
validity.
Results from 5 runs, min-max(mean +/- stddev):
store_load_msec,vsz_kb,store_rewrite_sec,listnodes_sec,listchannels_sec,routing_sec,peer_write_all_sec
39475-39572(39518+/-36),2880732,41.150000-41.390000(41.298+/-0.085),2.260000-2.550000(2.336+/-0.11),44.390000-65.150000(58.648+/-7.5),32.740000-33.020000(32.89+/-0.093),44.130000-45.090000(44.566+/-0.32)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
6 years ago
|
|
|
#include <common/node_id.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
bool json_to_bitcoin_amount(const char *buffer, const jsmntok_t *tok,
|
|
|
|
uint64_t *satoshi)
|
|
|
|
{
|
|
|
|
char *end;
|
|
|
|
unsigned long btc, sat;
|
|
|
|
|
|
|
|
btc = strtoul(buffer + tok->start, &end, 10);
|
|
|
|
if (btc == ULONG_MAX && errno == ERANGE)
|
|
|
|
return false;
|
|
|
|
if (end != buffer + tok->end) {
|
|
|
|
/* Expect always 8 decimal places. */
|
|
|
|
if (*end != '.' || buffer + tok->end - end != 9)
|
|
|
|
return false;
|
|
|
|
sat = strtoul(end+1, &end, 10);
|
|
|
|
if (sat == ULONG_MAX && errno == ERANGE)
|
|
|
|
return false;
|
|
|
|
if (end != buffer + tok->end)
|
|
|
|
return false;
|
|
|
|
} else
|
|
|
|
sat = 0;
|
|
|
|
|
|
|
|
*satoshi = btc * (uint64_t)100000000 + sat;
|
|
|
|
if (*satoshi != btc * (uint64_t)100000000 + sat)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
common/node_id: new type.
Node ids are pubkeys, but we only use them as pubkeys for routing and checking
gossip messages. So we're packing and unpacking them constantly, and wasting
some space and time.
This introduces a new type, explicitly the SEC1 compressed encoding
(33 bytes). We ensure its validity when we load from the db, or get it
from JSON. We still use 'struct pubkey' for peer messages, which checks
validity.
Results from 5 runs, min-max(mean +/- stddev):
store_load_msec,vsz_kb,store_rewrite_sec,listnodes_sec,listchannels_sec,routing_sec,peer_write_all_sec
39475-39572(39518+/-36),2880732,41.150000-41.390000(41.298+/-0.085),2.260000-2.550000(2.336+/-0.11),44.390000-65.150000(58.648+/-7.5),32.740000-33.020000(32.89+/-0.093),44.130000-45.090000(44.566+/-0.32)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
6 years ago
|
|
|
bool json_to_node_id(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct node_id *id)
|
|
|
|
{
|
|
|
|
return node_id_from_hexstr(buffer + tok->start,
|
|
|
|
tok->end - tok->start, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_pubkey(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct pubkey *pubkey)
|
|
|
|
{
|
|
|
|
return pubkey_from_hexstr(buffer + tok->start,
|
|
|
|
tok->end - tok->start, pubkey);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_msat(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct amount_msat *msat)
|
|
|
|
{
|
|
|
|
return parse_amount_msat(msat,
|
|
|
|
buffer + tok->start, tok->end - tok->start);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_sat(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct amount_sat *sat)
|
|
|
|
{
|
|
|
|
return parse_amount_sat(sat, buffer + tok->start, tok->end - tok->start);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_sat_or_all(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct amount_sat *sat)
|
|
|
|
{
|
|
|
|
if (json_tok_streq(buffer, tok, "all")) {
|
|
|
|
*sat = AMOUNT_SAT(-1ULL);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return json_to_sat(buffer, tok, sat);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_short_channel_id(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct short_channel_id *scid)
|
|
|
|
{
|
|
|
|
return (short_channel_id_from_str(buffer + tok->start,
|
|
|
|
tok->end - tok->start, scid));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_txid(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct bitcoin_txid *txid)
|
|
|
|
{
|
|
|
|
return bitcoin_txid_from_hex(buffer + tok->start,
|
|
|
|
tok->end - tok->start, txid);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_to_channel_id(const char *buffer, const jsmntok_t *tok,
|
|
|
|
struct channel_id *cid)
|
|
|
|
{
|
|
|
|
return hex_decode(buffer + tok->start, tok->end - tok->start,
|
|
|
|
cid, sizeof(*cid));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool split_tok(const char *buffer, const jsmntok_t *tok,
|
|
|
|
char split,
|
|
|
|
jsmntok_t *a,
|
|
|
|
jsmntok_t *b)
|
|
|
|
{
|
|
|
|
const char *p = memchr(buffer + tok->start, split, tok->end - tok->start);
|
|
|
|
if (!p)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
*a = *b = *tok;
|
|
|
|
a->end = p - buffer;
|
|
|
|
b->start = p + 1 - buffer;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|