From 0aa22741dfb6fae7b516dd9611fd700f531d2c6a Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 17 May 2018 14:16:22 +0930 Subject: [PATCH] option cleanup: --dev-override-fee-rates Make --override-fee-rates a dev option. We use default-fee-rate in its place, which (since bitcoind won't give fee estimates in regtest mode for short chains) gives an effective feerate of 15000/7500/3750. Signed-off-by: Rusty Russell --- lightningd/chaintopology.c | 33 ++++++++++++--------- lightningd/chaintopology.h | 8 ++++-- lightningd/options.c | 59 +++++++++++++++++--------------------- tests/test_lightningd.py | 12 ++++---- tests/utils.py | 2 +- 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lightningd/chaintopology.c b/lightningd/chaintopology.c index dc6efcc5f..986a5e522 100644 --- a/lightningd/chaintopology.c +++ b/lightningd/chaintopology.c @@ -595,10 +595,13 @@ static u32 guess_feerate(const struct chain_topology *topo, enum feerate feerate u32 get_feerate(const struct chain_topology *topo, enum feerate feerate) { - if (topo->override_fee_rate) { +#if DEVELOPER + if (topo->dev_override_fee_rate) { log_debug(topo->log, "Forcing fee rate, ignoring estimate"); - return topo->override_fee_rate[feerate]; - } else if (topo->feerate[feerate] == 0) { + return topo->dev_override_fee_rate[feerate]; + } +#endif + if (topo->feerate[feerate] == 0) { return guess_feerate(topo, feerate); } return topo->feerate[feerate]; @@ -640,18 +643,18 @@ static void json_dev_setfees(struct command *cmd, return; } - if (!topo->override_fee_rate) { + if (!topo->dev_override_fee_rate) { u32 fees[NUM_FEERATES]; for (size_t i = 0; i < ARRAY_SIZE(fees); i++) fees[i] = get_feerate(topo, i); - topo->override_fee_rate = tal_dup_arr(topo, u32, fees, - ARRAY_SIZE(fees), 0); + topo->dev_override_fee_rate = tal_dup_arr(topo, u32, fees, + ARRAY_SIZE(fees), 0); } for (size_t i = 0; i < NUM_FEERATES; i++) { if (!ratetok[i]) continue; if (!json_tok_number(buffer, ratetok[i], - &topo->override_fee_rate[i])) { + &topo->dev_override_fee_rate[i])) { command_fail(cmd, "Invalid feerate %.*s", ratetok[i]->end - ratetok[i]->start, buffer + ratetok[i]->start); @@ -660,20 +663,20 @@ static void json_dev_setfees(struct command *cmd, } log_debug(topo->log, "dev-setfees: fees now %u/%u/%u", - topo->override_fee_rate[FEERATE_IMMEDIATE], - topo->override_fee_rate[FEERATE_NORMAL], - topo->override_fee_rate[FEERATE_SLOW]); + topo->dev_override_fee_rate[FEERATE_IMMEDIATE], + topo->dev_override_fee_rate[FEERATE_NORMAL], + topo->dev_override_fee_rate[FEERATE_SLOW]); notify_feerate_change(cmd->ld); response = new_json_result(cmd); json_object_start(response, NULL); json_add_num(response, "immediate", - topo->override_fee_rate[FEERATE_IMMEDIATE]); + topo->dev_override_fee_rate[FEERATE_IMMEDIATE]); json_add_num(response, "normal", - topo->override_fee_rate[FEERATE_NORMAL]); + topo->dev_override_fee_rate[FEERATE_NORMAL]); json_add_num(response, "slow", - topo->override_fee_rate[FEERATE_SLOW]); + topo->dev_override_fee_rate[FEERATE_SLOW]); json_object_end(response); command_success(cmd, response); } @@ -727,10 +730,12 @@ struct chain_topology *new_topology(struct lightningd *ld, struct log *log) topo->log = log; topo->default_fee_rate = 40000; memset(topo->feerate, 0, sizeof(topo->feerate)); - topo->override_fee_rate = NULL; topo->bitcoind = new_bitcoind(topo, ld, log); topo->wallet = ld->wallet; topo->poll_seconds = 30; +#if DEVELOPER + topo->dev_override_fee_rate = NULL; +#endif return topo; } diff --git a/lightningd/chaintopology.h b/lightningd/chaintopology.h index ef0fff067..c32896cc5 100644 --- a/lightningd/chaintopology.h +++ b/lightningd/chaintopology.h @@ -104,15 +104,17 @@ struct chain_topology { /* Bitcoin transactions we're broadcasting */ struct list_head outgoing_txs; - /* Force a particular fee rate regardless of estimatefee (satoshis/kw) */ - u32 *override_fee_rate; - /* What fee we use if estimatefee fails (satoshis/kw) */ u32 default_fee_rate; /* Transactions/txos we are watching. */ struct txwatch_hash txwatches; struct txowatch_hash txowatches; + +#if DEVELOPER + /* Force a particular fee rate regardless of estimatefee (satoshis/kw) */ + u32 *dev_override_fee_rate; +#endif }; /* Information relevant to locating a TX in a blockchain. */ diff --git a/lightningd/options.c b/lightningd/options.c index 9356a891d..b429524b3 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -266,29 +266,6 @@ static char *opt_set_alias(const char *arg, struct lightningd *ld) return NULL; } -static char *opt_set_fee_rates(const char *arg, struct chain_topology *topo) -{ - tal_free(topo->override_fee_rate); - topo->override_fee_rate = tal_arr(topo, u32, 3); - - for (size_t i = 0; i < tal_count(topo->override_fee_rate); i++) { - char *endp; - char term; - - if (i == tal_count(topo->override_fee_rate)-1) - term = '\0'; - else - term = '/'; - topo->override_fee_rate[i] = strtol(arg, &endp, 10); - if (endp == arg || *endp != term) - return tal_fmt(NULL, - "Feerates must be //"); - - arg = endp + 1; - } - return NULL; -} - static char *opt_set_offline(struct lightningd *ld) { ld->reconnect = false; @@ -345,9 +322,6 @@ static void config_register_opts(struct lightningd *ld) opt_register_arg("--commit-fee=", opt_set_u32, opt_show_u32, &ld->config.commitment_fee_percent, "Percentage of fee to request for their commitment"); - opt_register_arg("--override-fee-rates", opt_set_fee_rates, NULL, - ld->topology, - "Force a specific rates (immediate/normal/slow) in satoshis per kw regardless of estimated fees"); opt_register_arg("--default-fee-rate", opt_set_u32, opt_show_u32, &ld->topology->default_fee_rate, "Satoshis per kw if can't estimate fees"); @@ -427,6 +401,29 @@ static void config_register_opts(struct lightningd *ld) } #if DEVELOPER +static char *opt_set_fee_rates(const char *arg, struct chain_topology *topo) +{ + tal_free(topo->dev_override_fee_rate); + topo->dev_override_fee_rate = tal_arr(topo, u32, 3); + + for (size_t i = 0; i < tal_count(topo->dev_override_fee_rate); i++) { + char *endp; + char term; + + if (i == tal_count(topo->dev_override_fee_rate)-1) + term = '\0'; + else + term = '/'; + topo->dev_override_fee_rate[i] = strtol(arg, &endp, 10); + if (endp == arg || *endp != term) + return tal_fmt(NULL, + "Feerates must be //"); + + arg = endp + 1; + } + return NULL; +} + static void dev_register_opts(struct lightningd *ld) { opt_register_noarg("--dev-no-reconnect", opt_set_invbool, @@ -447,6 +444,9 @@ static void dev_register_opts(struct lightningd *ld) opt_register_arg("--dev-bitcoind-poll", opt_set_u32, opt_show_u32, &ld->topology->poll_seconds, "Time between polling for new transactions"); + opt_register_arg("--dev-override-fee-rates", opt_set_fee_rates, NULL, + ld->topology, + "Force a specific rates (immediate/normal/slow) in satoshis per kw regardless of estimated fees"); } #endif @@ -942,13 +942,6 @@ static void add_config(struct lightningd *ld, answer = (const char *)ld->alias; } else if (opt->cb_arg == (void *)arg_log_to_file) { answer = ld->logfile; - } else if (opt->cb_arg == (void *)opt_set_fee_rates) { - struct chain_topology *topo = ld->topology; - if (topo->override_fee_rate) - answer = tal_fmt(name0, "%u/%u/%u", - topo->override_fee_rate[0], - topo->override_fee_rate[1], - topo->override_fee_rate[2]); } else if (opt->cb_arg == (void *)opt_set_port) { if (!deprecated_apis) answer = tal_fmt(name0, "%u", ld->portnum); diff --git a/tests/test_lightningd.py b/tests/test_lightningd.py index 5470a4e18..58ab65e7f 100644 --- a/tests/test_lightningd.py +++ b/tests/test_lightningd.py @@ -1478,6 +1478,7 @@ class LightningDTests(BaseLightningDTests): # Get close confirmed l1.bitcoin.generate_block(100) + @unittest.skipIf(not DEVELOPER, "needs dev-override-feerates") def test_closing_different_fees(self): l1 = self.node_factory.get_node() @@ -1493,9 +1494,9 @@ class LightningDTests(BaseLightningDTests): for feerate in feerates: for amount in amounts: p = self.node_factory.get_node(options={ - 'override-fee-rates': '{}/{}/{}'.format(feerate[0], - feerate[1], - feerate[2]) + 'dev-override-fee-rates': '{}/{}/{}'.format(feerate[0], + feerate[1], + feerate[2]) }) p.feerate = feerate p.amount = amount @@ -4158,7 +4159,7 @@ class LightningDTests(BaseLightningDTests): # L1 asks for stupid low fees l1.rpc.dev_setfees(15) - l1.daemon.wait_for_log('Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 15 outside range 500-75000') + l1.daemon.wait_for_log('Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 15 outside range 1875-75000') # Make sure the resolution of this one doesn't interfere with the next! # Note: may succeed, may fail with insufficient fee, depending on how # bitcoind feels! @@ -4300,7 +4301,7 @@ class LightningDTests(BaseLightningDTests): # Make l2 upset by asking for crazy fee. l1.rpc.dev_setfees('150000') # Wait for l1 notice - l1.daemon.wait_for_log(r'Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 150000 outside range 500-75000') + l1.daemon.wait_for_log(r'Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 150000 outside range 1875-75000') # Can't pay while its offline. self.assertRaises(ValueError, l1.rpc.sendpay, to_json(route), rhash) @@ -4340,7 +4341,6 @@ class LightningDTests(BaseLightningDTests): assert configs['bitcoin-datadir'] == bitcoind.bitcoin_dir assert configs['lightning-dir'] == l1.daemon.lightning_dir assert configs['allow-deprecated-apis'] is False - assert configs['override-fee-rates'] == '15000/7500/1000' assert configs['network'] == 'regtest' assert configs['ignore-fee-limits'] is False diff --git a/tests/utils.py b/tests/utils.py index 15e5a8821..98dcabc17 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -263,7 +263,7 @@ class LightningD(TailableProc): 'lightning-dir': lightning_dir, 'addr': '127.0.0.1:{}'.format(port), 'allow-deprecated-apis': 'false', - 'override-fee-rates': '15000/7500/1000', + 'default-fee-rate': 15000, 'network': 'regtest', 'ignore-fee-limits': 'false', }