From 604638712bc9bfca89caa8d1147743106cb0f8e1 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 19 Oct 2018 14:49:52 +1030 Subject: [PATCH] jsonrpc: Only show total fees collected in getinfo. And use wallet_forward_status_in_db() everywhere in db code. And clean up extra CHANGELOG.md entry (looks like rebase error?) Signed-off-by: Rusty Russell --- CHANGELOG.md | 4 ++-- lightningd/jsonrpc.c | 32 ++------------------------------ tests/test_pay.py | 3 +++ wallet/wallet.c | 29 +++++++++++++---------------- wallet/wallet.h | 10 ++-------- 5 files changed, 22 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53bddfc9e..17ae40f1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - JSON API: `listpeers` has new array `htlcs`: the current live payments. - JSON API: `listchannels` has two new fields: `message_flags` and `channel_flags`. This replaces `flags`. - JSON API: `invoice` now adds route hint to invoices for incoming capacity (RouteBoost), and warns if insufficient capacity. +- JSON API: `listforwards` lists all forwarded payments, their associated channels, and fees. +- JSON API: `getinfo` shows forwarding fees earnt as `msatoshi_fees_collected`. - Bitcoind: more parallelism in requests, for very slow nodes. - Testing: fixed logging, cleaner interception of bitcoind, minor fixes. - Protocol: we set and handle the new `htlc_maximum_msat` channel_update field. -- JSON API: `invoice` now adds route hint to invoices for incoming capacity (RouteBoost), and warns if insufficient capacity. -- JSON API: `listforwards` lists all forwarded payments, their associated channels, and fees. ### Changed diff --git a/lightningd/jsonrpc.c b/lightningd/jsonrpc.c index 145653d18..148e1b35f 100644 --- a/lightningd/jsonrpc.c +++ b/lightningd/jsonrpc.c @@ -138,35 +138,6 @@ static const struct json_command dev_crash_command = { AUTODATA(json_command, &dev_crash_command); #endif /* DEVELOPER */ -static void getinfo_add_routestats(struct json_result *response, - struct wallet *wallet) -{ - const struct forwarding_stats *stats; - stats = wallet_forwarded_payments_stats(wallet, tmpctx); - - json_object_start(response, "routestats"); - json_object_start(response, "settled"); - json_add_num(response, "fee_msatoshis", stats->fee[FORWARD_SETTLED]); - json_add_num(response, "count", stats->count[FORWARD_SETTLED]); - json_add_num(response, "msatoshi", stats->msatoshi[FORWARD_SETTLED]); - json_object_end(response); - - json_object_start(response, "failed"); - json_add_num(response, "fee_msatoshis", stats->fee[FORWARD_FAILED]); - json_add_num(response, "count", stats->count[FORWARD_FAILED]); - json_add_num(response, "msatoshi", stats->msatoshi[FORWARD_FAILED]); - json_object_end(response); - - json_object_start(response, "pending"); - json_add_num(response, "fee_msatoshis", stats->fee[FORWARD_OFFERED]); - json_add_num(response, "count", stats->count[FORWARD_FAILED]); - json_add_num(response, "msatoshi", stats->msatoshi[FORWARD_FAILED]); - json_object_end(response); - json_object_end(response); - - tal_free(stats); -} - static void json_getinfo(struct command *cmd, const char *buffer UNUSED, const jsmntok_t *params UNUSED) { @@ -196,7 +167,8 @@ static void json_getinfo(struct command *cmd, json_add_string(response, "version", version()); json_add_num(response, "blockheight", get_block_height(cmd->ld->topology)); json_add_string(response, "network", get_chainparams(cmd->ld)->network_name); - getinfo_add_routestats(response, cmd->ld->wallet); + json_add_u64(response, "msatoshi_fees_collected", + wallet_total_forward_fees(cmd->ld->wallet)); json_object_end(response); command_success(cmd, response); } diff --git a/tests/test_pay.py b/tests/test_pay.py index 3d484444c..f7aa70354 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -1050,3 +1050,6 @@ def test_forward_stats(node_factory, bitcoind): stats = l2.rpc.listforwards() assert [f['status'] for f in stats['forwards']] == ['settled', 'failed', 'offered'] + assert l2.rpc.getinfo()['msatoshi_fees_collected'] == 1 + amount // 100000 + assert l1.rpc.getinfo()['msatoshi_fees_collected'] == 0 + assert l3.rpc.getinfo()['msatoshi_fees_collected'] == 0 diff --git a/wallet/wallet.c b/wallet/wallet.c index a33514bcc..5245da69a 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -2427,34 +2427,31 @@ void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in, sqlite3_bind_int64(stmt, 4, out->key.channel->scid->u64); sqlite3_bind_int64(stmt, 5, in->msatoshi); sqlite3_bind_int64(stmt, 6, out->msatoshi); - sqlite3_bind_int(stmt, 7, state); + sqlite3_bind_int(stmt, 7, wallet_forward_status_in_db(state)); db_exec_prepared(w->db, stmt); } -const struct forwarding_stats *wallet_forwarded_payments_stats(struct wallet *w, - const tal_t *ctx) +u64 wallet_total_forward_fees(struct wallet *w) { - struct forwarding_stats *stats = talz(ctx, struct forwarding_stats); sqlite3_stmt *stmt; + u64 total; + int res; + stmt = db_prepare(w->db, "SELECT" - " state" - ", COUNT(*)" - ", SUM(out_msatoshi) as total" - ", SUM(in_msatoshi - out_msatoshi) as fee " + " SUM(in_msatoshi - out_msatoshi) " "FROM forwarded_payments " - "GROUP BY state;"); + "WHERE state = ?;"); - while (sqlite3_step(stmt) == SQLITE_ROW) { - enum forward_status state = sqlite3_column_int(stmt, 0); - stats->count[state] = sqlite3_column_int64(stmt, 1); - stats->msatoshi[state] = sqlite3_column_int64(stmt, 2); - stats->fee[state] = sqlite3_column_int64(stmt, 3); - } + sqlite3_bind_int(stmt, 1, wallet_forward_status_in_db(FORWARD_SETTLED)); + + res = sqlite3_step(stmt); + assert(res == SQLITE_ROW); + total = sqlite3_column_int64(stmt, 0); db_stmt_done(stmt); - return stats; + return total; } const struct forwarding *wallet_forwarded_payments_get(struct wallet *w, diff --git a/wallet/wallet.h b/wallet/wallet.h index 730ef2ec5..269c2bd35 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -166,11 +166,6 @@ struct forwarding { enum forward_status status; }; -struct forwarding_stats { - /* One entry for each of the forward_statuses */ - u64 count[3], msatoshi[3], fee[3]; -}; - /* A database backed shachain struct. The datastructure is * writethrough, reads are performed from an in-memory version, all * writes are passed through to the DB. */ @@ -1028,10 +1023,9 @@ void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in, enum forward_status state); /** - * Retrieve global stats about all forwarded_payments + * Retrieve summary of successful forwarded payments' fees */ -const struct forwarding_stats *wallet_forwarded_payments_stats(struct wallet *w, - const tal_t *ctx); +u64 wallet_total_forward_fees(struct wallet *w); /** * Retrieve a list of all forwarded_payments