route: Change the type of the funding capacity to amount_sat

Keeping it in `amount_msat` made the comparisons easier, but it was
the wrong type for this.
This commit is contained in:
Christian Decker 2024-08-16 19:04:15 +02:00
parent f803af782a
commit 3ad0085478
7 changed files with 56 additions and 37 deletions

View File

@ -626,6 +626,14 @@ void json_add_amount_msat(struct json_stream *result,
json_add_u64(result, msatfieldname, msat.millisatoshis); /* Raw: low-level helper */ json_add_u64(result, msatfieldname, msat.millisatoshis); /* Raw: low-level helper */
} }
void json_add_amount_sat(struct json_stream *result,
const char *satfieldname,
struct amount_sat sat)
{
assert(strends(satfieldname, "_sat") || streq(satfieldname, "sat"));
json_add_u64(result, satfieldname, sat.satoshis); /* Raw: low-level helper */
}
void json_add_amount_sat_msat(struct json_stream *result, void json_add_amount_sat_msat(struct json_stream *result,
const char *msatfieldname, const char *msatfieldname,
struct amount_sat sat) struct amount_sat sat)

View File

@ -5,10 +5,10 @@
#define LIGHTNING_COMMON_JSON_STREAM_H #define LIGHTNING_COMMON_JSON_STREAM_H
#include "config.h" #include "config.h"
#include <bitcoin/short_channel_id.h>
#define JSMN_STRICT 1 #define JSMN_STRICT 1
# include <external/jsmn/jsmn.h> # include <external/jsmn/jsmn.h>
#include <bitcoin/short_channel_id.h>
#include <ccan/short_types/short_types.h> #include <ccan/short_types/short_types.h>
#include <ccan/tal/tal.h> #include <ccan/tal/tal.h>
#include <ccan/time/time.h> #include <ccan/time/time.h>
@ -334,6 +334,11 @@ void json_add_amount_msat(struct json_stream *result,
struct amount_msat msat) struct amount_msat msat)
NO_NULL_ARGS; NO_NULL_ARGS;
void json_add_amount_sat(struct json_stream *result,
const char *satfieldname,
struct amount_sat sat)
NO_NULL_ARGS;
/* Adds an 'msat' field */ /* Adds an 'msat' field */
void json_add_amount_sat_msat(struct json_stream *result, void json_add_amount_sat_msat(struct json_stream *result,
const char *msatfieldname, const char *msatfieldname,

View File

@ -105,8 +105,7 @@ static bool dijkstra_to_hops(struct route_hop **hops,
return false; return false;
gossmap_chan_get_capacity(gossmap, c, &total); gossmap_chan_get_capacity(gossmap, c, &total);
if (!amount_sat_to_msat(&((*hops[num_hops]).total_amount), total)) (*hops)[num_hops].capacity = total;
abort();
(*hops)[num_hops].amount = *amount; (*hops)[num_hops].amount = *amount;
(*hops)[num_hops].delay = *cltv; (*hops)[num_hops].delay = *cltv;

View File

@ -18,7 +18,7 @@ struct gossmap_node;
* @direction: 0 (dest node_id < src node_id), 1 (dest node_id > src). * @direction: 0 (dest node_id < src node_id), 1 (dest node_id > src).
* @node_id: the node_id of the destination of this hop. * @node_id: the node_id of the destination of this hop.
* @amount: amount to send through this hop. * @amount: amount to send through this hop.
* @total_amount: The amount the channel was funded with. * @capacity: The amount the channel was funded with.
* @delay: total cltv delay at this hop. * @delay: total cltv delay at this hop.
*/ */
struct route_hop { struct route_hop {
@ -26,7 +26,7 @@ struct route_hop {
int direction; int direction;
struct node_id node_id; struct node_id node_id;
struct amount_msat amount; struct amount_msat amount;
struct amount_msat total_amount; struct amount_sat capacity;
u32 delay; u32 delay;
}; };

View File

@ -9,8 +9,7 @@ void channel_hint_to_json(const char *name, const struct channel_hint *hint,
json_add_short_channel_id_dir(dest, "scid", hint->scid); json_add_short_channel_id_dir(dest, "scid", hint->scid);
json_add_amount_msat(dest, "estimated_capacity_msat", json_add_amount_msat(dest, "estimated_capacity_msat",
hint->estimated_capacity); hint->estimated_capacity);
json_add_amount_msat(dest, "capacity_msat", json_add_amount_sat(dest, "capacity_sat", hint->capacity);
hint->capacity);
json_add_bool(dest, "enabled", hint->enabled); json_add_bool(dest, "enabled", hint->enabled);
json_object_end(dest); json_object_end(dest);
} }
@ -37,8 +36,12 @@ bool channel_hint_update(const struct timeabs now, struct channel_hint *hint)
* overall / refill_rate`. * overall / refill_rate`.
*/ */
struct amount_msat refill; struct amount_msat refill;
struct amount_msat capacity;
if (!amount_sat_to_msat(&capacity, hint->capacity))
abort();
u64 seconds = now.ts.tv_sec - hint->timestamp; u64 seconds = now.ts.tv_sec - hint->timestamp;
if (!amount_msat_mul(&refill, hint->capacity, seconds)) if (!amount_msat_mul(&refill, capacity, seconds))
abort(); abort();
refill = amount_msat_div(refill, PAY_REFILL_TIME); refill = amount_msat_div(refill, PAY_REFILL_TIME);
@ -47,9 +50,8 @@ bool channel_hint_update(const struct timeabs now, struct channel_hint *hint)
abort(); abort();
/* Clamp the value to the `overall_capacity` */ /* Clamp the value to the `overall_capacity` */
if (amount_msat_greater(hint->estimated_capacity, if (amount_msat_greater(hint->estimated_capacity, capacity))
hint->capacity)) hint->estimated_capacity = capacity;
hint->estimated_capacity = hint->capacity;
/* TODO This is rather coarse. We could map the disabled flag /* TODO This is rather coarse. We could map the disabled flag
to having 0msat capacity, and then relax from there. But it'd to having 0msat capacity, and then relax from there. But it'd
@ -65,8 +67,8 @@ bool channel_hint_update(const struct timeabs now, struct channel_hint *hint)
/* We report this hint as useless, if the hint does not /* We report this hint as useless, if the hint does not
* restrict the channel, i.e., if it is enabled and the * restrict the channel, i.e., if it is enabled and the
* estimate is the same as the overall capacity. */ * estimate is the same as the overall capacity. */
return !hint->enabled || amount_msat_greater(hint->capacity, return !hint->enabled ||
hint->estimated_capacity); amount_msat_greater(capacity, hint->estimated_capacity);
} }
/** /**
@ -90,7 +92,7 @@ struct channel_hint *channel_hint_from_json(const tal_t *ctx,
JSON_SCAN(json_to_u32, &hint->timestamp), JSON_SCAN(json_to_u32, &hint->timestamp),
JSON_SCAN(json_to_short_channel_id_dir, &hint->scid), JSON_SCAN(json_to_short_channel_id_dir, &hint->scid),
JSON_SCAN(json_to_msat, &hint->estimated_capacity), JSON_SCAN(json_to_msat, &hint->estimated_capacity),
JSON_SCAN(json_to_msat, &hint->capacity), JSON_SCAN(json_to_sat, &hint->capacity),
JSON_SCAN(json_to_bool, &hint->enabled)); JSON_SCAN(json_to_bool, &hint->enabled));
if (ret != NULL) if (ret != NULL)

View File

@ -40,10 +40,10 @@ struct channel_hint {
/* Non-null if we are one endpoint of this channel */ /* Non-null if we are one endpoint of this channel */
struct local_hint *local; struct local_hint *local;
/* The total `amount_msat` that were used to fund the /* The total `amount_sat` that were used to fund the
* channel. This is always smaller gte the * channel. This is always smaller gte the
* estimated_capacity */ * estimated_capacity (after normalization) */
struct amount_msat capacity; struct amount_sat capacity;
}; };
/* A collection of channel_hint instances, allowing us to handle and /* A collection of channel_hint instances, allowing us to handle and

View File

@ -409,7 +409,7 @@ static void channel_hints_update(struct payment *p,
const struct short_channel_id scid, const struct short_channel_id scid,
int direction, bool enabled, bool local, int direction, bool enabled, bool local,
const struct amount_msat *estimated_capacity, const struct amount_msat *estimated_capacity,
const struct amount_msat overall_capacity, const struct amount_sat overall_capacity,
u16 *htlc_budget) u16 *htlc_budget)
{ {
struct payment *root = payment_root(p); struct payment *root = payment_root(p);
@ -476,8 +476,9 @@ static void channel_hints_update(struct payment *p,
newhint.local = NULL; newhint.local = NULL;
if (estimated_capacity != NULL) if (estimated_capacity != NULL)
newhint.estimated_capacity = *estimated_capacity; newhint.estimated_capacity = *estimated_capacity;
else else if (!amount_sat_to_msat(&newhint.estimated_capacity,
newhint.estimated_capacity = overall_capacity; overall_capacity))
abort();
tal_arr_expand(&root->channel_hints, newhint); tal_arr_expand(&root->channel_hints, newhint);
@ -505,7 +506,7 @@ static void payment_exclude_most_expensive(struct payment *p)
} }
} }
channel_hints_update(p, e->scid, e->direction, false, false, NULL, channel_hints_update(p, e->scid, e->direction, false, false, NULL,
e->total_amount, NULL); e->capacity, NULL);
} }
static void payment_exclude_longest_delay(struct payment *p) static void payment_exclude_longest_delay(struct payment *p)
@ -521,7 +522,7 @@ static void payment_exclude_longest_delay(struct payment *p)
} }
} }
channel_hints_update(p, e->scid, e->direction, false, false, NULL, channel_hints_update(p, e->scid, e->direction, false, false, NULL,
e->total_amount, NULL); e->capacity, NULL);
} }
static struct amount_msat payment_route_fee(struct payment *p) static struct amount_msat payment_route_fee(struct payment *p)
@ -1467,7 +1468,7 @@ handle_final_failure(struct command *cmd,
case WIRE_TEMPORARY_NODE_FAILURE: case WIRE_TEMPORARY_NODE_FAILURE:
case WIRE_REQUIRED_NODE_FEATURE_MISSING: case WIRE_REQUIRED_NODE_FEATURE_MISSING:
case WIRE_INVALID_ONION_BLINDING: case WIRE_INVALID_ONION_BLINDING:
case WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS: case WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS:
case WIRE_MPP_TIMEOUT: case WIRE_MPP_TIMEOUT:
goto error; goto error;
} }
@ -1519,9 +1520,9 @@ handle_intermediate_failure(struct command *cmd,
*... *...
* - MUST return a `final_incorrect_htlc_amount` error. * - MUST return a `final_incorrect_htlc_amount` error.
*/ */
case WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS: case WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS:
case WIRE_FINAL_INCORRECT_CLTV_EXPIRY: case WIRE_FINAL_INCORRECT_CLTV_EXPIRY:
case WIRE_FINAL_INCORRECT_HTLC_AMOUNT: case WIRE_FINAL_INCORRECT_HTLC_AMOUNT:
/* FIXME: Document in BOLT that intermediates must not return this! */ /* FIXME: Document in BOLT that intermediates must not return this! */
case WIRE_MPP_TIMEOUT: case WIRE_MPP_TIMEOUT:
goto strange_error; goto strange_error;
@ -1532,7 +1533,7 @@ handle_intermediate_failure(struct command *cmd,
case WIRE_REQUIRED_CHANNEL_FEATURE_MISSING: case WIRE_REQUIRED_CHANNEL_FEATURE_MISSING:
/* All of these result in the channel being marked as disabled. */ /* All of these result in the channel being marked as disabled. */
channel_hints_update(root, errchan->scid, errchan->direction, channel_hints_update(root, errchan->scid, errchan->direction,
false, false, NULL, errchan->total_amount, false, false, NULL, errchan->capacity,
NULL); NULL);
break; break;
@ -1551,7 +1552,7 @@ handle_intermediate_failure(struct command *cmd,
* remember the amount we tried as an estimate. */ * remember the amount we tried as an estimate. */
channel_hints_update(root, errchan->scid, errchan->direction, channel_hints_update(root, errchan->scid, errchan->direction,
true, false, &estimated, true, false, &estimated,
errchan->total_amount, NULL); errchan->capacity, NULL);
goto error; goto error;
} }
@ -1671,13 +1672,13 @@ static u8 *channel_update_from_onion_error(const tal_t *ctx,
onion_message, &unused_msat, onion_message, &unused_msat,
&channel_update) && &channel_update) &&
!fromwire_fee_insufficient(ctx, !fromwire_fee_insufficient(ctx,
onion_message, &unused_msat, onion_message, &unused_msat,
&channel_update) && &channel_update) &&
!fromwire_incorrect_cltv_expiry(ctx, !fromwire_incorrect_cltv_expiry(ctx,
onion_message, &unused32, onion_message, &unused32,
&channel_update) && &channel_update) &&
!fromwire_expiry_too_soon(ctx, !fromwire_expiry_too_soon(ctx,
onion_message, onion_message,
&channel_update)) &channel_update))
/* No channel update. */ /* No channel update. */
return NULL; return NULL;
@ -2631,6 +2632,7 @@ local_channel_hints_listpeerchannels(struct command *cmd, const char *buffer,
const jsmntok_t *toks, struct payment *p) const jsmntok_t *toks, struct payment *p)
{ {
struct listpeers_channel **chans; struct listpeers_channel **chans;
struct amount_sat capacity;
chans = json_to_listpeers_channels(tmpctx, buffer, toks); chans = json_to_listpeers_channels(tmpctx, buffer, toks);
@ -2655,6 +2657,9 @@ local_channel_hints_listpeerchannels(struct command *cmd, const char *buffer,
else else
htlc_budget = chans[i]->max_accepted_htlcs - chans[i]->num_htlcs; htlc_budget = chans[i]->max_accepted_htlcs - chans[i]->num_htlcs;
if(!amount_msat_to_sat(&capacity, chans[i]->total_msat))
abort();
/* If we have both a scid and a local alias we want to /* If we have both a scid and a local alias we want to
* use the scid, and mark the alias as * use the scid, and mark the alias as
* unusable. Otherwise `getroute` might return the * unusable. Otherwise `getroute` might return the
@ -2667,19 +2672,19 @@ local_channel_hints_listpeerchannels(struct command *cmd, const char *buffer,
channel_hints_update( channel_hints_update(
p, *chans[i]->scid, chans[i]->direction, enabled, p, *chans[i]->scid, chans[i]->direction, enabled,
true, &chans[i]->spendable_msat, true, &chans[i]->spendable_msat,
chans[i]->total_msat, &htlc_budget); capacity, &htlc_budget);
if (chans[i]->alias[LOCAL] != NULL) if (chans[i]->alias[LOCAL] != NULL)
channel_hints_update(p, *chans[i]->alias[LOCAL], channel_hints_update(p, *chans[i]->alias[LOCAL],
chans[i]->direction, chans[i]->direction,
false /* not enabled */, false /* not enabled */,
true, &AMOUNT_MSAT(0), true, &AMOUNT_MSAT(0),
chans[i]->total_msat, capacity,
&htlc_budget); &htlc_budget);
} else { } else {
channel_hints_update( channel_hints_update(
p, *chans[i]->alias[LOCAL], chans[i]->direction, p, *chans[i]->alias[LOCAL], chans[i]->direction,
enabled, true, &chans[i]->spendable_msat, enabled, true, &chans[i]->spendable_msat,
chans[i]->total_msat, &htlc_budget); capacity, &htlc_budget);
} }
} }
@ -3170,7 +3175,7 @@ static void routehint_step_cb(struct routehints_data *d, struct payment *p)
hop.amount = dest_amount; hop.amount = dest_amount;
hop.delay = route_cltv(d->final_cltv, routehint + i + 1, hop.delay = route_cltv(d->final_cltv, routehint + i + 1,
tal_count(routehint) - i - 1); tal_count(routehint) - i - 1);
hop.total_amount = estimate; hop.capacity = amount_msat_to_sat_round_down(estimate);
/* Should we get a failure inside the routehint we'll /* Should we get a failure inside the routehint we'll
* need the direction so we can exclude it. Luckily * need the direction so we can exclude it. Luckily
@ -3539,7 +3544,7 @@ static void direct_pay_override(struct payment *p) {
p->route[0].scid = hint->scid.scid; p->route[0].scid = hint->scid.scid;
p->route[0].direction = hint->scid.dir; p->route[0].direction = hint->scid.dir;
p->route[0].node_id = *p->route_destination; p->route[0].node_id = *p->route_destination;
p->route[0].total_amount = hint->capacity; p->route[0].capacity = hint->capacity;
paymod_log(p, LOG_DBG, paymod_log(p, LOG_DBG,
"Found a direct channel (%s) with sufficient " "Found a direct channel (%s) with sufficient "
"capacity, skipping route computation.", "capacity, skipping route computation.",
@ -3947,7 +3952,7 @@ static void route_exclusions_step_cb(struct route_exclusions_data *d,
struct route_exclusion *e = exclusions[i]; struct route_exclusion *e = exclusions[i];
/* We don't need the details if we skip anyway. */ /* We don't need the details if we skip anyway. */
struct amount_msat total = AMOUNT_MSAT(0); struct amount_sat total = AMOUNT_SAT(0);
if (e->type == EXCLUDE_CHANNEL) { if (e->type == EXCLUDE_CHANNEL) {
channel_hints_update(p, e->u.chan_id.scid, channel_hints_update(p, e->u.chan_id.scid,