mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
d7b3bdd420
The main function here is payment_reconsider: * Each payment has a list of pay_flow. * This is populated in try_paying(), calling add_payflows & sendpay_new_flows. * When we get a notification, we resolve a pay_flow using one of the pay_flow_failedxxx or pay_flow_succeeded functions. * They call payment_reconsider() which cleans up finished flows decides what to do: often calling try_paying again. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
118 lines
3.9 KiB
C
118 lines
3.9 KiB
C
#ifndef LIGHTNING_PLUGINS_RENEPAY_PAY_H
|
|
#define LIGHTNING_PLUGINS_RENEPAY_PAY_H
|
|
#include "config.h"
|
|
#include <ccan/list/list.h>
|
|
#include <common/node_id.h>
|
|
#include <plugins/libplugin.h>
|
|
#include <plugins/renepay/flow.h>
|
|
#include <plugins/renepay/payment.h>
|
|
|
|
// TODO(eduardo): renepaystatus should be similar to paystatus
|
|
|
|
// TODO(eduardo): MCF should consider pending HTLCs occupy some capacity in the
|
|
// routing channels.
|
|
|
|
// TODO(eduardo): check a problem with param_millionths(), if I input an integer
|
|
// should or shouldn't be multiplied by 10^6?
|
|
// TODO(eduardo): add an option entry for maxfeepercent
|
|
// TODO(eduardo): write a man entry for renepay
|
|
// TODO(eduardo): check if paynotes are meaningful
|
|
// TODO(eduardo): remove assertions, introduce LOG_BROKEN messages
|
|
|
|
#define MAX_NUM_ATTEMPTS 10
|
|
|
|
/* Time lapse used to wait for failed sendpays before try_paying. */
|
|
#define TIMER_COLLECT_FAILURES_MSEC 250
|
|
|
|
/* Knowledge is proportionally decreased with time up to TIMER_FORGET_SEC when
|
|
* we forget everything. */
|
|
#define TIMER_FORGET_SEC 3600
|
|
|
|
// TODO(eduardo): Test ideas
|
|
// - make a payment to a node that is hidden behind private channels, check that
|
|
// private channels are removed from the gossmap and chan_extra_map
|
|
// - one payment route hangs, and the rest keep waiting, eventually all MPP
|
|
// should timeout and we retry excluding the unresponsive path (are we able to
|
|
// identify it?)
|
|
// - a particular route fails because fees are wrong, we update the gossip
|
|
// information and redo the path.
|
|
// - a MPP in which several parts have a common intermediary node
|
|
// source -MANY- o -MANY- dest
|
|
// - a MPP in which several parts have a common intermediary channel
|
|
// source -MANY- o--o -MANY- dest
|
|
// - a payment with a direct channel to the destination
|
|
// - payment failures:
|
|
// - destination is not in the gossmap
|
|
// - destination is offline
|
|
// - with current knowledge there is no flow solution to destination
|
|
|
|
/* Our convenient global data, here in one place. */
|
|
struct pay_plugin {
|
|
/* From libplugin */
|
|
struct plugin *plugin;
|
|
|
|
/* Public key of this node. */
|
|
struct node_id my_id;
|
|
|
|
/* Map of gossip. */
|
|
struct gossmap *gossmap;
|
|
|
|
/* Settings for maxdelay */
|
|
unsigned int maxdelay_default;
|
|
|
|
/* Offers support */
|
|
bool exp_offers;
|
|
|
|
/* All the struct payment */
|
|
struct list_head payments;
|
|
|
|
/* Per-channel metadata: some persists between payments */
|
|
struct chan_extra_map *chan_extra_map;
|
|
|
|
/* Pending sendpays (to match notifications to). */
|
|
struct payflow_map * payflow_map;
|
|
|
|
bool debug_mcf;
|
|
bool debug_payflow;
|
|
|
|
/* Pending flows have HTLCs (in-flight) liquidity
|
|
* attached that is reflected in the uncertainty network.
|
|
* When sendpay_fail or sendpay_success notifications arrive
|
|
* that flow is destroyed and the liquidity is restored.
|
|
* A payment command could end before all
|
|
* flows are destroyed, therefore it is important to delegate the
|
|
* ownership of the flows to pay_plugin->ctx so that the
|
|
* flows are kept alive.
|
|
*
|
|
* TODO(eduardo): maybe we should add a check to ensure that pending
|
|
* flows are not accumulating ad-infinitum. */
|
|
|
|
/* It allows us to measure elapsed time
|
|
* and forget channel information accordingly. */
|
|
u64 last_time;
|
|
};
|
|
|
|
/* Set in init */
|
|
extern struct pay_plugin *pay_plugin;
|
|
|
|
/* Accumulate or panic on overflow */
|
|
#define amount_msat_accumulate(dst, src) \
|
|
amount_msat_accumulate_((dst), (src), stringify(dst), stringify(src))
|
|
#define amount_msat_reduce(dst, src) \
|
|
amount_msat_reduce_((dst), (src), stringify(dst), stringify(src))
|
|
|
|
void amount_msat_accumulate_(struct amount_msat *dst,
|
|
struct amount_msat src,
|
|
const char *dstname,
|
|
const char *srcname);
|
|
void amount_msat_reduce_(struct amount_msat *dst,
|
|
struct amount_msat src,
|
|
const char *dstname,
|
|
const char *srcname);
|
|
|
|
/* Returns NULL if OK, otherwise an error msg and sets *ecode */
|
|
const char *try_paying(const tal_t *ctx,
|
|
struct payment *payment,
|
|
enum jsonrpc_errcode *ecode);
|
|
#endif /* LIGHTNING_PLUGINS_RENEPAY_PAY_H */
|