From 1aa8c90c731c5b31c8de754ceb8a5b8136c4e240 Mon Sep 17 00:00:00 2001 From: Michael Schmoock Date: Sat, 21 Mar 2020 12:46:23 +0100 Subject: [PATCH] chore: refactor and unify LOCAL/REMOTE helpers for receivable_msat --- lightningd/peer_control.c | 113 ++++++++++---------------------------- 1 file changed, 28 insertions(+), 85 deletions(-) diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 4f14e0704..cbdddc9ba 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -509,10 +509,10 @@ static void json_add_sat_only(struct json_stream *result, type_to_string(tmpctx, struct amount_msat, &msat)); } -/* Fee a commitment transaction would currently cost when spending */ -/* This is quite a lot of work to figure out what it would cost us! */ -static struct amount_sat commit_txfee_spend(const struct channel *channel, - struct amount_msat spendable) +/* Fee a commitment transaction would currently cost */ +static struct amount_sat commit_txfee(const struct channel *channel, + struct amount_msat amount, + enum side side) { /* FIXME: make per-channel htlc maps! */ const struct htlc_in *hin; @@ -520,72 +520,17 @@ static struct amount_sat commit_txfee_spend(const struct channel *channel, const struct htlc_out *hout; struct htlc_out_map_iter outi; struct lightningd *ld = channel->peer->ld; - u32 local_feerate = get_feerate(channel->channel_info.fee_states, - channel->funder, LOCAL); size_t num_untrimmed_htlcs = 0; - - /* Assume we tried to spend "spendable" */ - if (!htlc_is_trimmed(LOCAL, spendable, - local_feerate, channel->our_config.dust_limit, - LOCAL)) - num_untrimmed_htlcs++; - - for (hin = htlc_in_map_first(&ld->htlcs_in, &ini); - hin; - hin = htlc_in_map_next(&ld->htlcs_in, &ini)) { - if (hin->key.channel != channel) - continue; - if (!htlc_is_trimmed(REMOTE, hin->msat, local_feerate, - channel->our_config.dust_limit, - LOCAL)) - num_untrimmed_htlcs++; - } - for (hout = htlc_out_map_first(&ld->htlcs_out, &outi); - hout; - hout = htlc_out_map_next(&ld->htlcs_out, &outi)) { - if (hout->key.channel != channel) - continue; - if (!htlc_is_trimmed(LOCAL, hout->msat, local_feerate, - channel->our_config.dust_limit, - LOCAL)) - num_untrimmed_htlcs++; - } - - /* - * BOLT-95c74fef2fe590cb8adbd7b848743a229ffe825a #2: - * Adding an HTLC: update_add_htlc - * - * A sending node: - * - if it is responsible for paying the Bitcoin fee: - * - SHOULD NOT offer `amount_msat` if, after adding that HTLC to - * its commitment transaction, its remaining balance doesn't allow - * it to pay the fee for a future additional non-dust HTLC at - * `N*feerate_per_kw` while maintaining its channel reserve - * ("fee spike buffer"), where `N` is a parameter chosen by the - * implementation (`N = 2` is recommended to ensure - * predictability). - */ - return commit_tx_base_fee(local_feerate * 2, num_untrimmed_htlcs + 1); -} - -/* Fee a commitment transaction would currently cost when receiving */ -static struct amount_sat commit_txfee_recv(const struct channel *channel, - struct amount_msat receivable) -{ - /* FIXME: make per-channel htlc maps! */ - const struct htlc_in *hin; - struct htlc_in_map_iter ini; - const struct htlc_out *hout; - struct htlc_out_map_iter outi; - struct lightningd *ld = channel->peer->ld; u32 feerate = get_feerate(channel->channel_info.fee_states, - channel->funder, REMOTE); - size_t num_untrimmed_htlcs = 0; - - /* Assume we tried to receive "receivable" */ - if (!htlc_is_trimmed(REMOTE, receivable, feerate, - channel->channel_info.their_config.dust_limit, - REMOTE)) + channel->funder, side); + struct amount_sat dust_limit; + if (side == LOCAL) + dust_limit = channel->our_config.dust_limit; + if (side == REMOTE) + dust_limit = channel->channel_info.their_config.dust_limit; + + /* Assume we tried to add "amount" */ + if (!htlc_is_trimmed(side, amount, feerate, dust_limit, side)) num_untrimmed_htlcs++; for (hin = htlc_in_map_first(&ld->htlcs_in, &ini); @@ -593,9 +538,8 @@ static struct amount_sat commit_txfee_recv(const struct channel *channel, hin = htlc_in_map_next(&ld->htlcs_in, &ini)) { if (hin->key.channel != channel) continue; - if (!htlc_is_trimmed(LOCAL, hin->msat, feerate, - channel->channel_info.their_config.dust_limit, - REMOTE)) + if (!htlc_is_trimmed(!side, hin->msat, feerate, dust_limit, + side)) num_untrimmed_htlcs++; } for (hout = htlc_out_map_first(&ld->htlcs_out, &outi); @@ -603,30 +547,27 @@ static struct amount_sat commit_txfee_recv(const struct channel *channel, hout = htlc_out_map_next(&ld->htlcs_out, &outi)) { if (hout->key.channel != channel) continue; - if (!htlc_is_trimmed(REMOTE, hout->msat, feerate, - channel->channel_info.their_config.dust_limit, - REMOTE)) + if (!htlc_is_trimmed(side, hout->msat, feerate, dust_limit, + side)) num_untrimmed_htlcs++; } /* - * BOLT-95c74fef2fe590cb8adbd7b848743a229ffe825a #2: + * BOLT-f5490f17d17ff49dc26ee459432b3c9db4fda8a9 #2: * Adding an HTLC: update_add_htlc * * A sending node: * - if it is responsible for paying the Bitcoin fee: - * - SHOULD NOT offer `amount_msat` if, after adding that HTLC to - * its commitment transaction, its remaining balance doesn't allow - * it to pay the fee for a future additional non-dust HTLC at - * `N*feerate_per_kw` while maintaining its channel reserve - * ("fee spike buffer"), where `N` is a parameter chosen by the - * implementation (`N = 2` is recommended to ensure - * predictability). + * - SHOULD NOT offer amount_msat if, after adding that HTLC to its + * commitment transaction, its remaining balance doesn't allow it + * to pay the fee for a future additional non-dust HTLC at a + * higher feerate while maintaining its channel reserve + * ("fee spike buffer"). A buffer of 2*feerate_per_kw is + * recommended to ensure predictability. */ return commit_tx_base_fee(2 * feerate, num_untrimmed_htlcs + 1); } - static void subtract_offered_htlcs(const struct channel *channel, struct amount_msat *amount) { @@ -793,7 +734,8 @@ static void json_add_channel(struct lightningd *ld, /* If we're funder, subtract txfees we'll need to spend this */ if (channel->funder == LOCAL) { if (!amount_msat_sub_sat(&spendable, spendable, - commit_txfee_spend(channel, spendable))) + commit_txfee(channel, spendable, + LOCAL))) spendable = AMOUNT_MSAT(0); } @@ -824,7 +766,8 @@ static void json_add_channel(struct lightningd *ld, /* If they're funder, subtract txfees they'll need to spend this */ if (channel->funder == REMOTE) { if (!amount_msat_sub_sat(&receivable, receivable, - commit_txfee_recv(channel, receivable))) + commit_txfee(channel, + receivable, REMOTE))) receivable = AMOUNT_MSAT(0); }