forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]>
- Loading branch information
1 parent
837a095
commit b4455d5
Showing
21 changed files
with
252 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
#include <ccan/array_size/array_size.h> | ||
#include <ccan/mem/mem.h> | ||
#include <ccan/str/hex/hex.h> | ||
#include <common/node_id.h> | ||
#include <common/type_to_string.h> | ||
#include <common/utils.h> | ||
|
||
/* Convert from pubkey to compressed pubkey. */ | ||
void node_id_from_pubkey(struct node_id *id, const struct pubkey *key) | ||
{ | ||
size_t outlen = ARRAY_SIZE(id->k); | ||
if (!secp256k1_ec_pubkey_serialize(secp256k1_ctx, id->k, &outlen, | ||
&key->pubkey, | ||
SECP256K1_EC_COMPRESSED)) | ||
abort(); | ||
} | ||
|
||
WARN_UNUSED_RESULT | ||
bool pubkey_from_node_id(struct pubkey *key, const struct node_id *id) | ||
{ | ||
return secp256k1_ec_pubkey_parse(secp256k1_ctx, &key->pubkey, | ||
memcheck(id->k, sizeof(id->k)), | ||
sizeof(id->k)); | ||
} | ||
|
||
/* It's valid if we can convert to a real pubkey. */ | ||
bool node_id_valid(const struct node_id *id) | ||
{ | ||
struct pubkey key; | ||
return pubkey_from_node_id(&key, id); | ||
} | ||
|
||
/* Convert to hex string of SEC1 encoding */ | ||
char *node_id_to_hexstr(const tal_t *ctx, const struct node_id *id) | ||
{ | ||
return tal_hexstr(ctx, id->k, sizeof(id->k)); | ||
} | ||
REGISTER_TYPE_TO_STRING(node_id, node_id_to_hexstr); | ||
|
||
/* Convert from hex string of SEC1 encoding */ | ||
bool node_id_from_hexstr(const char *str, size_t slen, struct node_id *id) | ||
{ | ||
return hex_decode(str, slen, id->k, sizeof(id->k)) | ||
&& node_id_valid(id); | ||
} | ||
|
||
int node_id_cmp(const struct node_id *a, const struct node_id *b) | ||
{ | ||
return memcmp(a->k, b->k, sizeof(a->k)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
/* Encapsulation for pubkeys used as node ids: more compact, more dangerous. */ | ||
#ifndef LIGHTNING_COMMON_NODE_ID_H | ||
#define LIGHTNING_COMMON_NODE_ID_H | ||
#include "config.h" | ||
#include <bitcoin/pubkey.h> | ||
|
||
struct node_id { | ||
u8 k[PUBKEY_CMPR_LEN]; | ||
}; | ||
|
||
static inline bool node_id_eq(const struct node_id *a, | ||
const struct node_id *b) | ||
{ | ||
return memcmp(a->k, b->k, sizeof(a->k)) == 0; | ||
} | ||
|
||
/* Is this actually a valid pubkey? Relatively expensive. */ | ||
bool node_id_valid(const struct node_id *id); | ||
|
||
/* Convert from pubkey to compressed pubkey. */ | ||
void node_id_from_pubkey(struct node_id *id, const struct pubkey *key); | ||
|
||
/* Returns false if not a valid pubkey: relatively expensive */ | ||
WARN_UNUSED_RESULT | ||
bool pubkey_from_node_id(struct pubkey *key, const struct node_id *id); | ||
|
||
/* Convert to hex string of SEC1 encoding. */ | ||
char *node_id_to_hexstr(const tal_t *ctx, const struct node_id *id); | ||
|
||
/* Convert from hex string of SEC1 encoding: checks validity! */ | ||
bool node_id_from_hexstr(const char *str, size_t slen, struct node_id *id); | ||
|
||
/* Compare the keys `a` and `b`. Return <0 if `a`<`b`, 0 if equal and >0 otherwise */ | ||
int node_id_cmp(const struct node_id *a, const struct node_id *b); | ||
|
||
/* If the two nodes[] are id1 and id2, which index would id1 be? */ | ||
static inline int node_id_idx(const struct node_id *id1, | ||
const struct node_id *id2) | ||
{ | ||
return node_id_cmp(id1, id2) > 0; | ||
} | ||
|
||
#endif /* LIGHTNING_COMMON_NODE_ID_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.