mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-22 16:44:20 +01:00
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.
This commit is contained in:
@@ -1520,7 +1520,10 @@ static bool attempt_ongoing(const char *b11)
|
|||||||
|
|
||||||
/* We consolidate multi-part payments into a single entry. */
|
/* We consolidate multi-part payments into a single entry. */
|
||||||
struct pay_mpp {
|
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;
|
const char *b11;
|
||||||
/* Status of combined payment */
|
/* Status of combined payment */
|
||||||
const char *status;
|
const char *status;
|
||||||
@@ -1534,22 +1537,22 @@ struct pay_mpp {
|
|||||||
struct amount_msat amount_sent;
|
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);
|
pay_map);
|
||||||
|
|
||||||
static void add_amount_sent(struct plugin *p,
|
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);
|
ret = jsonrpc_stream_success(cmd);
|
||||||
json_array_start(ret, "pays");
|
json_array_start(ret, "pays");
|
||||||
json_for_each_arr(i, t, arr) {
|
json_for_each_arr(i, t, arr) {
|
||||||
const jsmntok_t *status, *b11tok;
|
const jsmntok_t *status, *b11tok, *hashtok;
|
||||||
const char *b11;
|
const char *b11 = b11str;
|
||||||
|
struct sha256 payment_hash;
|
||||||
|
|
||||||
b11tok = json_get_member(buf, t, "bolt11");
|
b11tok = json_get_member(buf, t, "bolt11");
|
||||||
/* Old (or manual) payments didn't have bolt11 field */
|
hashtok = json_get_member(buf, t, "payment_hash");
|
||||||
if (!b11tok)
|
assert(hashtok != NULL);
|
||||||
continue;
|
|
||||||
|
|
||||||
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) {
|
if (!pm) {
|
||||||
pm = tal(cmd, struct pay_mpp);
|
pm = tal(cmd, struct pay_mpp);
|
||||||
|
pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash);
|
||||||
pm->b11 = tal_steal(pm, b11);
|
pm->b11 = tal_steal(pm, b11);
|
||||||
pm->label = json_get_member(buf, t, "label");
|
pm->label = json_get_member(buf, t, "label");
|
||||||
pm->preimage = NULL;
|
pm->preimage = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user