From b6a2b8c58be9730261f1cfca143185b056559ebd Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 23 Oct 2017 15:35:28 +1030 Subject: [PATCH] Add --rgb and --alias options. And derive random ones from nodeid if they don't choose. Signed-off-by: Rusty Russell --- lightningd/lightningd.c | 10 +++- lightningd/lightningd.h | 4 ++ lightningd/options.c | 75 ++++++++++++++++++++++++++++++ lightningd/options.h | 3 ++ lightningd/peer_control.c | 6 +-- lightningd/test/run-find_my_path.c | 3 ++ tests/utils.py | 5 ++ 7 files changed, 100 insertions(+), 6 deletions(-) diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 2921fe996..97a7cd62d 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -78,7 +78,8 @@ static struct lightningd *new_lightningd(const tal_t *ctx, ld->dev_hsm_seed = NULL; ld->log_book = log_book; ld->log = new_log(log_book, log_book, "lightningd(%u):", (int)getpid()); - + ld->alias = NULL; + ld->rgb = NULL; list_head_init(&ld->pay_commands); list_head_init(&ld->connects); ld->portnum = DEFAULT_PORT; @@ -251,6 +252,9 @@ int main(int argc, char *argv[]) /* Set up HSM. */ hsm_init(ld, newdir); + /* Now we know our ID, we can set our color/alias if not already. */ + setup_color_and_alias(ld); + /* Initialize block topology. */ setup_topology(ld->topology, &ld->timers, @@ -288,7 +292,9 @@ int main(int argc, char *argv[]) setup_jsonrpc(ld, ld->rpc_filename); /* Mark ourselves live. */ - log_info(ld->log, "Hello world from %s!", version()); + log_info(ld->log, "Hello world from %s aka %s #%s (version %s)!", + type_to_string(ltmp, struct pubkey, &ld->id), + ld->alias, tal_hex(ltmp, ld->rgb), version()); #if 0 /* Load peers from database. */ diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index e0c6165d5..9303e982b 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -87,6 +87,10 @@ struct lightningd { /* This is us. */ struct pubkey id; + /* My name is... my favorite color is... */ + char *alias; /* At least 32 bytes (zero-filled) */ + u8 *rgb; /* tal_len() == 3. */ + /* Any pending timers. */ struct timers timers; diff --git a/lightningd/options.c b/lightningd/options.c index a2bb07cfb..9f2e39696 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -185,6 +186,36 @@ static void opt_show_network(char buf[OPT_SHOW_LEN], snprintf(buf, OPT_SHOW_LEN, "%s", get_chainparams(ld)->network_name); } +static char *opt_set_rgb(const char *arg, struct lightningd *ld) +{ + ld->rgb = tal_free(ld->rgb); + /* BOLT #7: + * + * the first byte of `rgb` is the red value, the second byte is the + * green value and the last byte is the blue value */ + ld->rgb = tal_hexdata(ld, arg, strlen(arg)); + if (!ld->rgb || tal_len(ld->rgb) != 3) + return tal_fmt(NULL, "rgb '%s' is not six hex digits", arg); + return NULL; +} + +static char *opt_set_alias(const char *arg, struct lightningd *ld) +{ + ld->alias = tal_free(ld->alias); + /* BOLT #7: + * + * * [`32`:`alias`] + *... + * It MUST set `alias` to a valid UTF-8 string, with any `alias` bytes + * following equal to zero. + */ + if (strlen(arg) > 32) + return tal_fmt(NULL, "Alias '%s' is over 32 characters", arg); + ld->alias = tal_arrz(ld, char, 33); + strncpy(ld->alias, arg, 32); + return NULL; +} + static void config_register_opts(struct lightningd *ld) { opt_register_arg("--locktime-blocks", opt_set_u32, opt_show_u32, @@ -520,6 +551,10 @@ void register_opts(struct lightningd *ld) opt_register_arg("--bitcoin-datadir", opt_set_charp, NULL, &ld->topology->bitcoind->datadir, "-datadir arg for bitcoin-cli"); + opt_register_arg("--rgb", opt_set_rgb, NULL, ld, + "RRGGBB hex color for node"); + opt_register_arg("--alias", opt_set_alias, NULL, ld, + "Up to 32-byte alias for node"); opt_register_logging(ld->log); opt_register_version(); @@ -528,6 +563,46 @@ void register_opts(struct lightningd *ld) dev_register_opts(ld); } +/* Names stolen from https://github.com/ternus/nsaproductgenerator/blob/master/nsa.js */ +static const char *codename_adjective[] += { "LOUD", "RED", "BLUE", "GREEN", "YELLOW", "IRATE", "ANGRY", "PEEVED", + "HAPPY", "SLIMY", "SLEEPY", "JUNIOR", "SLICKER", "UNITED", "SOMBER", + "BIZARRE", "ODD", "WEIRD", "WRONG", "LATENT", "CHILLY", "STRANGE", "LOUD", + "SILENT", "HOPPING", "ORANGE", "VIOLET", "VIOLENT", "LIGHTNING" }; + +static const char *codename_noun[] += { "WHISPER", "FELONY", "MOON", "SUCKER", "PENGUIN", "WAFFLE", "MAESTRO", + "NIGHT", "TRINITY", "DEITY", "MONKEY", "ARK", "SQUIRREL", "IRON", "BOUNCE", + "FARM", "CHEF", "TROUGH", "NET", "TRAWL", "GLEE", "WATER", "SPORK", "PLOW", + "FEED", "SOUFFLE", "ROUTE", "BAGEL", "MONTANA", "ANALYST", "AUTO", "WATCH", + "PHOTO", "YARD", "SOURCE", "MONKEY", "SEAGULL", "TOLL", "SPAWN", "GOPHER", + "CHIPMUNK", "SET", "CALENDAR", "ARTIST", "CHASER", "SCAN", "TOTE", "BEAM", + "ENTOURAGE", "GENESIS", "WALK", "SPATULA", "RAGE", "FIRE", "MASTER" }; + +void setup_color_and_alias(struct lightningd *ld) +{ + u8 der[PUBKEY_DER_LEN]; + pubkey_to_der(der, &ld->id); + + if (!ld->rgb) + /* You can't get much red by default */ + ld->rgb = tal_dup_arr(ld, u8, der, 3, 0); + + if (!ld->alias) { + u64 adjective, noun; + + memcpy(&adjective, der+3, sizeof(adjective)); + memcpy(&noun, der+3+sizeof(adjective), sizeof(noun)); + noun %= ARRAY_SIZE(codename_noun); + adjective %= ARRAY_SIZE(codename_adjective); + ld->alias = tal_arrz(ld, char, 33); + assert(strlen(codename_adjective[adjective]) + + strlen(codename_noun[noun]) < 33); + strcpy(ld->alias, codename_adjective[adjective]); + strcat(ld->alias, codename_noun[noun]); + } +} + bool handle_opts(struct lightningd *ld, int argc, char *argv[]) { bool newdir = false; diff --git a/lightningd/options.h b/lightningd/options.h index f25254d8a..dab0e3818 100644 --- a/lightningd/options.h +++ b/lightningd/options.h @@ -14,4 +14,7 @@ void register_opts(struct lightningd *ld); bool handle_opts(struct lightningd *ld, int argc, char *argv[]); bool parse_ipaddr(const char *arg, struct ipaddr *addr); + +/* Derive default color and alias from the pubkey. */ +void setup_color_and_alias(struct lightningd *ld); #endif /* LIGHTNING_LIGHTNINGD_OPTIONS_H */ diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 0284fa4a7..45fa94eb4 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1523,8 +1523,6 @@ static u8 *create_node_announcement(const tal_t *ctx, struct lightningd *ld, secp256k1_ecdsa_signature *sig, u32 timestamp) { - u8 rgb[3] = {0x77, 0x88, 0x99}; - u8 alias[32]; u8 *features = NULL; u8 *addresses = tal_arr(ctx, u8, 0); u8 *announcement; @@ -1535,10 +1533,10 @@ static u8 *create_node_announcement(const tal_t *ctx, struct lightningd *ld, if (ld->config.ipaddr.type != ADDR_TYPE_PADDING) { towire_ipaddr(&addresses, &ld->config.ipaddr); } - memset(alias, 0, sizeof(alias)); announcement = towire_node_announcement(ctx, sig, features, timestamp, - &ld->id, rgb, alias, addresses); + &ld->id, ld->rgb, (u8 *)ld->alias, + addresses); return announcement; } diff --git a/lightningd/test/run-find_my_path.c b/lightningd/test/run-find_my_path.c index 472031e80..364091dbb 100644 --- a/lightningd/test/run-find_my_path.c +++ b/lightningd/test/run-find_my_path.c @@ -46,6 +46,9 @@ void populate_peer(struct lightningd *ld UNNEEDED, struct peer *peer UNNEEDED) /* Generated stub for register_opts */ void register_opts(struct lightningd *ld UNNEEDED) { fprintf(stderr, "register_opts called!\n"); abort(); } +/* Generated stub for setup_color_and_alias */ +void setup_color_and_alias(struct lightningd *ld UNNEEDED) +{ fprintf(stderr, "setup_color_and_alias called!\n"); abort(); } /* Generated stub for setup_jsonrpc */ void setup_jsonrpc(struct lightningd *ld UNNEEDED, const char *rpc_filename UNNEEDED) { fprintf(stderr, "setup_jsonrpc called!\n"); abort(); } diff --git a/tests/utils.py b/tests/utils.py index 891a77ac6..bd4ec1914 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -219,6 +219,11 @@ class BitcoinD(TailableProc): logging.info("BitcoinD started") +# lightning-1 => 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518 aka JUNIORBEAM #0266e4 +# lightning-2 => 022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59 aka SILENTARTIST #022d22 +# lightning-3 => 035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d aka HOPPINGFIRE #035d2b +# lightning-4 => 0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199 aka JUNIORFELONY #0382ce +# lightning-5 => 032cf15d1ad9c4a08d26eab1918f732d8ef8fdc6abb9640bf3db174372c491304e aka SOMBERFIRE #032cf1 class LightningD(TailableProc): def __init__(self, lightning_dir, bitcoin_dir, port=9735):