From 5b12007a4f92cdc207dd42283a6fe2caf5905105 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 8 Apr 2019 09:22:06 +0930 Subject: [PATCH] gossipd: dev option to allow unknown channels. This lets us benchmark without a valid blockchain. Signed-off-by: Rusty Russell Header from folded patch 'fixup!_gossipd__dev_option_to_allow_unknown_channels.patch': fixup! gossipd: dev option to allow unknown channels. Suggested-by: @cdecker Signed-off-by: Rusty Russell --- gossipd/gossip_wire.csv | 1 + gossipd/gossipd.c | 8 ++++++-- gossipd/routing.c | 15 +++++++++++++-- gossipd/routing.h | 7 ++++++- gossipd/test/run-bench-find_route.c | 2 +- gossipd/test/run-find_route-specific.c | 2 +- gossipd/test/run-find_route.c | 2 +- lightningd/gossip_control.c | 4 +++- lightningd/lightningd.c | 1 + lightningd/lightningd.h | 3 +++ lightningd/options.c | 12 ++++++++++++ 11 files changed, 48 insertions(+), 9 deletions(-) diff --git a/gossipd/gossip_wire.csv b/gossipd/gossip_wire.csv index 5b6a1ec0a..288f9dcb3 100644 --- a/gossipd/gossip_wire.csv +++ b/gossipd/gossip_wire.csv @@ -15,6 +15,7 @@ gossipctl_init,,update_channel_interval,u32 gossipctl_init,,num_announcable,u16 gossipctl_init,,announcable,num_announcable*struct wireaddr gossipctl_init,,dev_gossip_time,?u32 +gossipctl_init,,dev_unknown_channel_satoshis,?struct amount_sat # Pass JSON-RPC getnodes call through gossip_getnodes_request,3005 diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index d6b2d61bd..e2e3020eb 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -1860,6 +1860,7 @@ static struct io_plan *gossip_init(struct io_conn *conn, { u32 update_channel_interval; u32 *dev_gossip_time; + struct amount_sat *dev_unknown_channel_satoshis; if (!fromwire_gossipctl_init(daemon, msg, /* 60,000 ms @@ -1873,7 +1874,8 @@ static struct io_plan *gossip_init(struct io_conn *conn, * (unless --dev-channel-update-interval) */ &update_channel_interval, &daemon->announcable, - &dev_gossip_time)) { + &dev_gossip_time, + &dev_unknown_channel_satoshis)) { master_badmsg(WIRE_GOSSIPCTL_INIT, msg); } @@ -1882,7 +1884,9 @@ static struct io_plan *gossip_init(struct io_conn *conn, chainparams_by_chainhash(&daemon->chain_hash), &daemon->id, update_channel_interval * 2, - dev_gossip_time); + dev_gossip_time, + dev_unknown_channel_satoshis); + /* Load stored gossip messages */ gossip_store_load(daemon->rstate, daemon->rstate->store); diff --git a/gossipd/routing.c b/gossipd/routing.c index 06588814d..86fff7fde 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -83,7 +83,8 @@ struct routing_state *new_routing_state(const tal_t *ctx, const struct chainparams *chainparams, const struct pubkey *local_id, u32 prune_timeout, - const u32 *dev_gossip_time) + const u32 *dev_gossip_time, + const struct amount_sat *dev_unknown_channel_satoshis) { struct routing_state *rstate = tal(ctx, struct routing_state); rstate->nodes = empty_node_map(rstate); @@ -100,7 +101,6 @@ struct routing_state *new_routing_state(const tal_t *ctx, rstate->pending_node_map = tal(ctx, struct pending_node_map); pending_node_map_init(rstate->pending_node_map); - #if DEVELOPER if (dev_gossip_time) { rstate->gossip_time = tal(rstate, struct timeabs); @@ -108,6 +108,7 @@ struct routing_state *new_routing_state(const tal_t *ctx, rstate->gossip_time->ts.tv_nsec = 0; } else rstate->gossip_time = NULL; + rstate->dev_unknown_channel_satoshis = dev_unknown_channel_satoshis; #endif return rstate; @@ -1013,6 +1014,16 @@ void handle_pending_cannouncement(struct routing_state *rstate, if (!pending) return; +#if DEVELOPER + if (rstate->dev_unknown_channel_satoshis) { + outscript = scriptpubkey_p2wsh(pending, + bitcoin_redeem_2of2(pending, + &pending->bitcoin_key_1, + &pending->bitcoin_key_2)); + sat = *rstate->dev_unknown_channel_satoshis; + } +#endif + /* BOLT #7: * * The receiving node: diff --git a/gossipd/routing.h b/gossipd/routing.h index ba6f30d44..fcc35b6a6 100644 --- a/gossipd/routing.h +++ b/gossipd/routing.h @@ -218,6 +218,10 @@ struct routing_state { #if DEVELOPER /* Override local time for gossip messages */ struct timeabs *gossip_time; + + /* Instead of ignoring unknown channels, pretend they're valid + * with this many satoshis (if non-NULL) */ + const struct amount_sat *dev_unknown_channel_satoshis; #endif }; @@ -240,7 +244,8 @@ struct routing_state *new_routing_state(const tal_t *ctx, const struct chainparams *chainparams, const struct pubkey *local_id, u32 prune_timeout, - const u32 *dev_gossip_time); + const u32 *dev_gossip_time, + const struct amount_sat *dev_unknown_channel_satoshis); /** * Add a new bidirectional channel from id1 to id2 with the given diff --git a/gossipd/test/run-bench-find_route.c b/gossipd/test/run-bench-find_route.c index 80a7b3f95..f947c3e59 100644 --- a/gossipd/test/run-bench-find_route.c +++ b/gossipd/test/run-bench-find_route.c @@ -225,7 +225,7 @@ int main(int argc, char *argv[]) setup_tmpctx(); me = nodeid(0); - rstate = new_routing_state(tmpctx, NULL, &me, 0, NULL); + rstate = new_routing_state(tmpctx, NULL, &me, 0, NULL, NULL); opt_register_noarg("--perfme", opt_set_bool, &perfme, "Run perfme-start and perfme-stop around benchmark"); diff --git a/gossipd/test/run-find_route-specific.c b/gossipd/test/run-find_route-specific.c index af9513b0b..9335b437c 100644 --- a/gossipd/test/run-find_route-specific.c +++ b/gossipd/test/run-find_route-specific.c @@ -184,7 +184,7 @@ int main(void) strlen("02cca6c5c966fcf61d121e3a70e03a1cd9eeeea024b26ea666ce974d43b242e636"), &d); - rstate = new_routing_state(tmpctx, NULL, &a, 0, NULL); + rstate = new_routing_state(tmpctx, NULL, &a, 0, NULL, NULL); /* [{'active': True, 'short_id': '6990:2:1/1', 'fee_per_kw': 10, 'delay': 5, 'message_flags': 0, 'channel_flags': 1, 'destination': '0230ad0e74ea03976b28fda587bb75bdd357a1938af4424156a18265167f5e40ae', 'source': '02ea622d5c8d6143f15ed3ce1d501dd0d3d09d3b1c83a44d0034949f8a9ab60f06', 'last_update': 1504064344}, */ diff --git a/gossipd/test/run-find_route.c b/gossipd/test/run-find_route.c index 51f1a3b14..6b90ae789 100644 --- a/gossipd/test/run-find_route.c +++ b/gossipd/test/run-find_route.c @@ -213,7 +213,7 @@ int main(void) memset(&tmp, 'a', sizeof(tmp)); pubkey_from_privkey(&tmp, &a); - rstate = new_routing_state(tmpctx, NULL, &a, 0, NULL); + rstate = new_routing_state(tmpctx, NULL, &a, 0, NULL, NULL); new_node(rstate, &a); diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index 7a1fa32d3..9a881ba43 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -166,8 +166,10 @@ void gossip_init(struct lightningd *ld, int connectd_fd) ld->alias, ld->config.channel_update_interval, ld->announcable, #if DEVELOPER - ld->dev_gossip_time ? &ld->dev_gossip_time: NULL + ld->dev_gossip_time ? &ld->dev_gossip_time: NULL, + ld->dev_unknown_channel_satoshis #else + NULL, NULL #endif ); diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index fb4738a6c..768959220 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -117,6 +117,7 @@ static struct lightningd *new_lightningd(const tal_t *ctx) ld->dev_subdaemon_fail = false; ld->dev_allow_localhost = false; ld->dev_gossip_time = 0; + ld->dev_unknown_channel_satoshis = NULL; #endif /*~ These are CCAN lists: an embedded double-linked list. It's not diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index 3728d0761..11d047154 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -199,6 +199,9 @@ struct lightningd { /* Timestamp to use for gossipd, iff non-zero */ u32 dev_gossip_time; + /* What to override unknown channels with, iff non-NULL */ + struct amount_sat *dev_unknown_channel_satoshis; + /* Things we've marked as not leaking. */ const void **notleaks; #endif /* DEVELOPER */ diff --git a/lightningd/options.c b/lightningd/options.c index 0a3dea5c7..8e6209e71 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -443,6 +443,15 @@ static char *opt_subprocess_debug(const char *optarg, struct lightningd *ld) return NULL; } +static char *opt_set_dev_unknown_channel_satoshis(const char *optarg, + struct lightningd *ld) +{ + tal_free(ld->dev_unknown_channel_satoshis); + ld->dev_unknown_channel_satoshis = tal(ld, struct amount_sat); + return opt_set_u64(optarg, + &ld->dev_unknown_channel_satoshis->satoshis); /* Raw: dev code */ +} + static void dev_register_opts(struct lightningd *ld) { opt_register_noarg("--dev-no-reconnect", opt_set_invbool, @@ -479,6 +488,9 @@ static void dev_register_opts(struct lightningd *ld) opt_register_arg("--dev-gossip-time", opt_set_u32, opt_show_u32, &ld->dev_gossip_time, "UNIX time to override gossipd to use."); + opt_register_arg("--dev-unknown-channel-satoshis", + opt_set_dev_unknown_channel_satoshis, NULL, ld, + "Amount to pretend is in channels which we can't find funding tx for."); } #endif