Skip to content

Commit

Permalink
payalgo: Be willing to overpay up to maxfeepercent, for privacy.
Browse files Browse the repository at this point in the history
This obscures how far an intermediate hop is from the ultimate
payee, and also obscures slightly the exact payment value.

Fixes: ElementsProject#1089
  • Loading branch information
ZmnSCPxj committed Mar 21, 2018
1 parent d5d3186 commit df76e7a
Showing 1 changed file with 19 additions and 1 deletion.
20 changes: 19 additions & 1 deletion lightningd/payalgo.c
Expand Up @@ -487,6 +487,8 @@ static bool json_pay_try(struct pay *pay)
struct timeabs now = time_now();
struct json_result *data;
struct siphash_seed seed;
u64 maxoverpayment;
u64 overpayment;

/* If too late anyway, fail now. */
if (time_after(now, pay->expiry)) {
Expand All @@ -513,13 +515,29 @@ static bool json_pay_try(struct pay *pay)
/* Generate random seed */
randombytes_buf(&seed, sizeof(seed));

/* Generate an overpayment, from fuzz * maxfee. */
/* Now normally the use of double for money is very bad.
* Note however that a later stage will ensure that
* we do not end up paying more than maxfeepercent
* of the msatoshi we intend to pay. */
maxoverpayment = ((double) pay->msatoshi * pay->fuzz * pay->maxfeepercent)
/ 100.0;
if (maxoverpayment > 0) {
randombytes_buf(&overpayment, sizeof(seed));
/* We will never generate the maximum computed
* overpayment this way. Maybe OK for most
* purposes. */
overpayment = overpayment % maxoverpayment;
} else
overpayment = 0;

++pay->getroute_tries;

/* FIXME: use b11->routes */
req = towire_gossip_getroute_request(pay->try_parent,
&cmd->ld->id,
&pay->receiver_id,
pay->msatoshi,
pay->msatoshi + overpayment,
pay->riskfactor,
pay->min_final_cltv_expiry,
&pay->fuzz,
Expand Down

0 comments on commit df76e7a

Please sign in to comment.