Browse Source

pay: Key the MPP payments based on the payment_hash not the bolt11

This allows us to drive the payment from outside, and still get the
aggregation that we want.
paymod-03
Christian Decker 5 years ago
parent
commit
9d7a48d0f4
  1. 36
      plugins/pay.c

36
plugins/pay.c

@ -1520,7 +1520,10 @@ static bool attempt_ongoing(const char *b11)
/* We consolidate multi-part payments into a single entry. */
struct pay_mpp {
/* This is the bolt11 string, and lookup key */
/* payment_hash from the invoice and lookup key */
const struct sha256 *payment_hash;
/* This is the bolt11 string */
const char *b11;
/* Status of combined payment */
const char *status;
@ -1534,22 +1537,22 @@ struct pay_mpp {
struct amount_msat amount_sent;
};
static const char *pay_mpp_key(const struct pay_mpp *pm)
static const struct sha256 *pay_mpp_key(const struct pay_mpp *pm)
{
return pm->b11;
return pm->payment_hash;
}
static size_t b11str_hash(const char *b11)
static size_t pay_mpp_hash(const struct sha256 *payment_hash)
{
return siphash24(siphash_seed(), b11, strlen(b11));
return siphash24(siphash_seed(), payment_hash, sizeof(struct sha256));
}
static bool pay_mpp_eq(const struct pay_mpp *pm, const char *b11)
static bool pay_mpp_eq(const struct pay_mpp *pm, const struct sha256 *payment_hash)
{
return streq(pm->b11, b11);
return memcmp(pm->payment_hash, payment_hash, sizeof(struct sha256)) == 0;
}
HTABLE_DEFINE_TYPE(struct pay_mpp, pay_mpp_key, b11str_hash, pay_mpp_eq,
HTABLE_DEFINE_TYPE(struct pay_mpp, pay_mpp_key, pay_mpp_hash, pay_mpp_eq,
pay_map);
static void add_amount_sent(struct plugin *p,
@ -1610,19 +1613,22 @@ static struct command_result *listsendpays_done(struct command *cmd,
ret = jsonrpc_stream_success(cmd);
json_array_start(ret, "pays");
json_for_each_arr(i, t, arr) {
const jsmntok_t *status, *b11tok;
const char *b11;
const jsmntok_t *status, *b11tok, *hashtok;
const char *b11 = b11str;
struct sha256 payment_hash;
b11tok = json_get_member(buf, t, "bolt11");
/* Old (or manual) payments didn't have bolt11 field */
if (!b11tok)
continue;
hashtok = json_get_member(buf, t, "payment_hash");
assert(hashtok != NULL);
b11 = json_strdup(cmd, buf, b11tok);
json_to_sha256(buf, hashtok, &payment_hash);
if (b11tok)
b11 = json_strdup(cmd, buf, b11tok);
pm = pay_map_get(&pay_map, b11);
pm = pay_map_get(&pay_map, &payment_hash);
if (!pm) {
pm = tal(cmd, struct pay_mpp);
pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash);
pm->b11 = tal_steal(pm, b11);
pm->label = json_get_member(buf, t, "label");
pm->preimage = NULL;

Loading…
Cancel
Save