diff --git a/devtools/Makefile b/devtools/Makefile index 61f705cef..d9a544ede 100644 --- a/devtools/Makefile +++ b/devtools/Makefile @@ -43,7 +43,7 @@ devtools/dump-gossipstore: $(DEVTOOLS_OBJS) $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) devtools/dump-gossipstore.o: gossipd/gen_gossip_store.h devtools/create-gossipstore: $(DEVTOOLS_OBJS) $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o devtools/create-gossipstore.o gossipd/gen_gossip_store.o -devtools/create-gossipstore.o: gossipd/gen_gossip_store.h devtools/create-gossipstore.h +devtools/create-gossipstore.o: gossipd/gen_gossip_store.h devtools/onion.c: ccan/config.h diff --git a/devtools/create-gossipstore.c b/devtools/create-gossipstore.c index a9a26b15c..911a223fe 100644 --- a/devtools/create-gossipstore.c +++ b/devtools/create-gossipstore.c @@ -1,37 +1,52 @@ +#include #include #include #include #include +#include #include #include -#include #include #include #include #include +#include +#include #include #include #include #include +struct scidsat { + struct short_channel_id scid; + struct amount_sat sat; +} scidsat; -struct scidsat * load_scid_file(FILE * scidfd) +/* read scid,satoshis csv file and create return an array of scidsat pointers */ +static struct scidsat *load_csv_file(FILE *scidf) { - int n, ok; - ok = fscanf(scidfd, "%d\n", &n); - if (ok == EOF) - return NULL; - char title[16]; - ok = fscanf(scidfd, "%s\n", title); - if (ok == EOF) - return NULL; - struct scidsat * scids = calloc(n, sizeof(scidsat)); + int n, r; + char title[15]; int i = 0; - while(fscanf(scidfd, "%s ,%" SCNu64 "\n", scids[i].scid, &scids[i].sat.satoshis) == 2 ) { /* Raw: read from file */ - i++; + struct scidsat *scidsats; + /* max characters is 8 (0xffffff) + 8 for tx + 5 (0xffffff) for outputs (0xffff) + 2 (x's) */ + char str[23]; + + if (fscanf(scidf, "%d\n", &n) != 1) + err(1, "reading number of entries from csv failed"); + + scidsats = tal_arr(NULL, struct scidsat, n); + r = fscanf(scidf, "%5s ,%8s\n", title, &title[6]); + if (r != 2 || strcmp(title, "scid") != 0 || strcmp(&title[6], "satoshis") != 0) + err(1, "reading 'scid ,satoshis' from csv failed"); + + while(fscanf(scidf, "%s ,%ld\n", str, &scidsats[i].sat.satoshis) == 2 ) { /* Raw: read from file */ + if (!short_channel_id_from_str(str, strlen(str), &scidsats[i].scid, 0)) + err(1, "failed to make scid struct"); + i++; } - return scids; + return scidsats; } int main(int argc, char *argv[]) @@ -40,10 +55,9 @@ int main(int argc, char *argv[]) beint16_t be_inlen; struct amount_sat sat; bool verbose = false; - char *infile = NULL, *outfile = NULL, *scidfile = NULL, *csat = NULL; - int infd = 0, outfd; - FILE * scidfd; - struct scidsat * scids = NULL; + char *infile = NULL, *outfile = NULL, *csvfile = NULL, *csat = NULL; + int infd, outfd, scidi = 0, channels = 0, nodes = 0, updates = 0; + struct scidsat *scidsats; unsigned max = -1U; setup_locale(); @@ -54,10 +68,10 @@ int main(int argc, char *argv[]) "Send output to this file instead of stdout"); opt_register_arg("--input|-i", opt_set_charp, NULL, &infile, "Read input from this file instead of stdin"); - opt_register_arg("--scidfile", opt_set_charp, NULL, &scidfile, + opt_register_arg("--csv", opt_set_charp, NULL, &csvfile, "Input for 'scid, satshis' csv"); opt_register_arg("--sat", opt_set_charp, NULL, &csat, - "default satoshi value if --scidfile flag not present"); + "default satoshi value if --csv flag not present"); opt_register_arg("--max", opt_set_uintval, opt_show_uintval, &max, "maximum number of messages to read"); opt_register_noarg("--help|-h", opt_usage_and_exit, @@ -67,20 +81,20 @@ int main(int argc, char *argv[]) opt_parse(&argc, argv, opt_log_stderr_exit); - if (scidfile) { - scidfd = fopen(scidfile, "r"); - if (scidfd < 0) - err(1, "opening %s", scidfile); - scids = load_scid_file(scidfd); - fclose(scidfd); - } - else if (csat) { + if (csvfile && !csat) { + FILE *scidf; + scidf = fopen(csvfile, "r"); + if (!scidf) + err(1, "opening %s", csvfile); + scidsats = load_csv_file(scidf); + fclose(scidf); + } else if (csat && !csvfile) { if (!parse_amount_sat(&sat, csat, strlen(csat))) { errx(1, "Invalid satoshi amount %s", csat); } } else { - err(1, "must contain either --sat xor --scidfile"); + err(1, "must contain either --sat xor --csv"); } if (infile) { @@ -100,10 +114,6 @@ int main(int argc, char *argv[]) if (!write_all(outfd, &version, sizeof(version))) err(1, "Writing version"); - int scidi = 0; - int channels = 0; - int nodes = 0; - int updates = 0; while (read_all(infd, &be_inlen, sizeof(be_inlen))) { u32 msglen = be16_to_cpu(be_inlen); u8 *inmsg = tal_arr(NULL, u8, msglen), *outmsg; @@ -115,12 +125,35 @@ int main(int argc, char *argv[]) switch (fromwire_peektype(inmsg)) { case WIRE_CHANNEL_ANNOUNCEMENT: - if (scids) { - sat = scids[scidi].sat; - scidi += 1; + if (csvfile) { + struct short_channel_id scid; + /* We ignore these; we just want scid */ + secp256k1_ecdsa_signature sig; + u8 *features; + struct bitcoin_blkid hash; + struct node_id id; + struct pubkey pubkey; + + if (!fromwire_channel_announcement(inmsg, + inmsg, + &sig, + &sig, + &sig, + &sig, + &features, + &hash, + &scid, + &id, + &id, + &pubkey, + &pubkey)) + errx(1, "bad channel_announcement"); + if (!short_channel_id_eq(&scid, &scidsats[scidi].scid)) + errx(1, "scid of message does not match scid in csv"); + scidi++; } - channels += 1; outmsg = towire_gossip_store_channel_announcement(inmsg, inmsg, sat); + channels += 1; break; case WIRE_CHANNEL_UPDATE: outmsg = towire_gossip_store_channel_update(inmsg, inmsg); @@ -153,6 +186,7 @@ int main(int argc, char *argv[]) break; } fprintf(stderr, "channels %d, updates %d, nodes %d\n", channels, updates, nodes); - free(scids); + if (csvfile) + tal_free(scidsats); return 0; } diff --git a/devtools/create-gossipstore.h b/devtools/create-gossipstore.h deleted file mode 100644 index b2b165f5b..000000000 --- a/devtools/create-gossipstore.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef LIGHTNING_DEVTOOLS_CREATE_GOSSIPSTORE_H -#define LIGHTNING_DEVTOOLS_CREATE_GOSSIPSTORE_H -#include -#include -#include - -struct scidsat { - char scid[17]; - struct amount_sat sat; -} scidsat; - -struct scidsat * load_scid_file(FILE * scidfd); -#endif /* LIGHTNING_DEVTOOLS_CREATE_GOSSIPSTORE_H */ diff --git a/tools/bench-gossipd.sh b/tools/bench-gossipd.sh index ee03bd162..c37bd2b23 100755 --- a/tools/bench-gossipd.sh +++ b/tools/bench-gossipd.sh @@ -82,7 +82,7 @@ if [ -z "$DIR" ]; then trap 'rm -rf "$DIR"' 0 DIR="$(mktemp -d)" - ./devtools/create-gossipstore 100000 -i "$MCP_DIR"/1M.gossip -o "$DIR"/gossip_store + ./devtools/create-gossipstore --csv "$MCP_DIR"/scidSatoshis.csv -i "$MCP_DIR"/1M.gossip -o "$DIR"/gossip_store fi # shellcheck disable=SC2086