mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-03 18:57:06 +01:00
lightningd: add "style" to listforwards.
Suggested-by: @t-bast Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Changelog-Added: JSON-RPC: `listforwards` has new entry `style`, currently "legacy" or "tlv".
This commit is contained in:
parent
116a77f1be
commit
2f7f7ec255
11 changed files with 132 additions and 17 deletions
|
@ -29,6 +29,7 @@ On success, an object containing **forwards** is returned. It is an array of ob
|
||||||
- **received_time** (number): the UNIX timestamp when this was received
|
- **received_time** (number): the UNIX timestamp when this was received
|
||||||
- **out_channel** (short_channel_id, optional): the channel that the HTLC was forwarded to
|
- **out_channel** (short_channel_id, optional): the channel that the HTLC was forwarded to
|
||||||
- **payment_hash** (hex, optional): payment hash sought by HTLC (always 64 characters)
|
- **payment_hash** (hex, optional): payment hash sought by HTLC (always 64 characters)
|
||||||
|
- **style** (string, optional): Either a legacy onion format or a modern tlv format (one of "legacy", "tlv")
|
||||||
|
|
||||||
If **out_channel** is present:
|
If **out_channel** is present:
|
||||||
- **fee_msat** (msat): the amount this paid in fees
|
- **fee_msat** (msat): the amount this paid in fees
|
||||||
|
@ -58,4 +59,4 @@ RESOURCES
|
||||||
|
|
||||||
Main web site: <https://github.com/ElementsProject/lightning>
|
Main web site: <https://github.com/ElementsProject/lightning>
|
||||||
|
|
||||||
[comment]: # ( SHA256STAMP:abfaaa00817734d8acb77d02d7c024112c90605a8f93a134971a617ab4d383f9)
|
[comment]: # ( SHA256STAMP:131410f052b8a1845c8d3c7eb2d48df0fc7638e7d26817f56863815be86d8f1e)
|
||||||
|
|
|
@ -52,6 +52,14 @@
|
||||||
"description": "payment hash sought by HTLC",
|
"description": "payment hash sought by HTLC",
|
||||||
"maxLength": 64,
|
"maxLength": 64,
|
||||||
"minLength": 64
|
"minLength": 64
|
||||||
|
},
|
||||||
|
"style": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"legacy",
|
||||||
|
"tlv"
|
||||||
|
],
|
||||||
|
"description": "Either a legacy onion format or a modern tlv format"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"allOf": [
|
"allOf": [
|
||||||
|
@ -72,6 +80,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"resolved_time": {},
|
"resolved_time": {},
|
||||||
"out_channel": {},
|
"out_channel": {},
|
||||||
|
@ -102,6 +111,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"resolved_time": {},
|
"resolved_time": {},
|
||||||
"payment_hash": {},
|
"payment_hash": {},
|
||||||
|
@ -132,6 +142,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"out_channel": {},
|
"out_channel": {},
|
||||||
"payment_hash": {},
|
"payment_hash": {},
|
||||||
|
@ -154,6 +165,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"out_channel": {},
|
"out_channel": {},
|
||||||
"payment_hash": {},
|
"payment_hash": {},
|
||||||
|
@ -186,6 +198,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"out_channel": {},
|
"out_channel": {},
|
||||||
"payment_hash": {},
|
"payment_hash": {},
|
||||||
|
@ -212,6 +225,7 @@
|
||||||
"in_msatoshi": {},
|
"in_msatoshi": {},
|
||||||
"in_msat": {},
|
"in_msat": {},
|
||||||
"status": {},
|
"status": {},
|
||||||
|
"style": {},
|
||||||
"received_time": {},
|
"received_time": {},
|
||||||
"out_channel": {},
|
"out_channel": {},
|
||||||
"payment_hash": {},
|
"payment_hash": {},
|
||||||
|
|
|
@ -158,6 +158,7 @@ struct htlc_in *new_htlc_in(const tal_t *ctx,
|
||||||
hin->failonion = NULL;
|
hin->failonion = NULL;
|
||||||
hin->preimage = NULL;
|
hin->preimage = NULL;
|
||||||
hin->we_filled = NULL;
|
hin->we_filled = NULL;
|
||||||
|
hin->payload = NULL;
|
||||||
|
|
||||||
hin->received_time = time_now();
|
hin->received_time = time_now();
|
||||||
|
|
||||||
|
|
|
@ -296,7 +296,8 @@ static void forward_event_notification_serialize(struct json_stream *stream,
|
||||||
const struct amount_msat *amount_out,
|
const struct amount_msat *amount_out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
enum onion_wire failcode,
|
enum onion_wire failcode,
|
||||||
struct timeabs *resolved_time)
|
struct timeabs *resolved_time,
|
||||||
|
enum forward_style forward_style)
|
||||||
{
|
{
|
||||||
/* Here is more neat to initial a forwarding structure than
|
/* Here is more neat to initial a forwarding structure than
|
||||||
* to pass in a bunch of parameters directly*/
|
* to pass in a bunch of parameters directly*/
|
||||||
|
@ -324,6 +325,7 @@ static void forward_event_notification_serialize(struct json_stream *stream,
|
||||||
cur->failcode = failcode;
|
cur->failcode = failcode;
|
||||||
cur->received_time = in->received_time;
|
cur->received_time = in->received_time;
|
||||||
cur->resolved_time = tal_steal(cur, resolved_time);
|
cur->resolved_time = tal_steal(cur, resolved_time);
|
||||||
|
cur->forward_style = forward_style;
|
||||||
|
|
||||||
json_format_forwarding_object(stream, "forward_event", cur);
|
json_format_forwarding_object(stream, "forward_event", cur);
|
||||||
}
|
}
|
||||||
|
@ -337,7 +339,8 @@ void notify_forward_event(struct lightningd *ld,
|
||||||
const struct amount_msat *amount_out,
|
const struct amount_msat *amount_out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
enum onion_wire failcode,
|
enum onion_wire failcode,
|
||||||
struct timeabs *resolved_time)
|
struct timeabs *resolved_time,
|
||||||
|
enum forward_style forward_style)
|
||||||
{
|
{
|
||||||
void (*serialize)(struct json_stream *,
|
void (*serialize)(struct json_stream *,
|
||||||
const struct htlc_in *,
|
const struct htlc_in *,
|
||||||
|
@ -345,11 +348,12 @@ void notify_forward_event(struct lightningd *ld,
|
||||||
const struct amount_msat *,
|
const struct amount_msat *,
|
||||||
enum forward_status,
|
enum forward_status,
|
||||||
enum onion_wire,
|
enum onion_wire,
|
||||||
struct timeabs *) = forward_event_notification_gen.serialize;
|
struct timeabs *,
|
||||||
|
enum forward_style) = forward_event_notification_gen.serialize;
|
||||||
|
|
||||||
struct jsonrpc_notification *n
|
struct jsonrpc_notification *n
|
||||||
= jsonrpc_notification_start(NULL, forward_event_notification_gen.topic);
|
= jsonrpc_notification_start(NULL, forward_event_notification_gen.topic);
|
||||||
serialize(n->stream, in, scid_out, amount_out, state, failcode, resolved_time);
|
serialize(n->stream, in, scid_out, amount_out, state, failcode, resolved_time, forward_style);
|
||||||
jsonrpc_notification_end(n);
|
jsonrpc_notification_end(n);
|
||||||
plugins_notify(ld->plugins, take(n));
|
plugins_notify(ld->plugins, take(n));
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,8 @@ void notify_forward_event(struct lightningd *ld,
|
||||||
const struct amount_msat *amount_out,
|
const struct amount_msat *amount_out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
enum onion_wire failcode,
|
enum onion_wire failcode,
|
||||||
struct timeabs *resolved_time);
|
struct timeabs *resolved_time,
|
||||||
|
enum forward_style forward_style);
|
||||||
|
|
||||||
void notify_sendpay_success(struct lightningd *ld,
|
void notify_sendpay_success(struct lightningd *ld,
|
||||||
const struct wallet_payment *payment);
|
const struct wallet_payment *payment);
|
||||||
|
|
|
@ -465,6 +465,21 @@ static void destroy_hout_subd_died(struct htlc_out *hout)
|
||||||
db_commit_transaction(db);
|
db_commit_transaction(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum forward_style get_onion_style(const struct htlc_in *hin)
|
||||||
|
{
|
||||||
|
/* This happens on reload from db; don't try too hard! */
|
||||||
|
if (!hin->payload)
|
||||||
|
return FORWARD_STYLE_UNKNOWN;
|
||||||
|
|
||||||
|
switch (hin->payload->type) {
|
||||||
|
case ONION_V0_PAYLOAD:
|
||||||
|
return FORWARD_STYLE_LEGACY;
|
||||||
|
case ONION_TLV_PAYLOAD:
|
||||||
|
return FORWARD_STYLE_TLV;
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
/* This is where channeld gives us the HTLC id, and also reports if it
|
/* This is where channeld gives us the HTLC id, and also reports if it
|
||||||
* failed immediately. */
|
* failed immediately. */
|
||||||
static void rcvd_htlc_reply(struct subd *subd, const u8 *msg, const int *fds UNUSED,
|
static void rcvd_htlc_reply(struct subd *subd, const u8 *msg, const int *fds UNUSED,
|
||||||
|
@ -503,7 +518,9 @@ static void rcvd_htlc_reply(struct subd *subd, const u8 *msg, const int *fds UNU
|
||||||
/* here we haven't called connect_htlc_out(),
|
/* here we haven't called connect_htlc_out(),
|
||||||
* so set htlc field with NULL */
|
* so set htlc field with NULL */
|
||||||
wallet_forwarded_payment_add(ld->wallet,
|
wallet_forwarded_payment_add(ld->wallet,
|
||||||
hout->in, NULL, NULL,
|
hout->in,
|
||||||
|
get_onion_style(hout->in),
|
||||||
|
NULL, NULL,
|
||||||
FORWARD_LOCAL_FAILED,
|
FORWARD_LOCAL_FAILED,
|
||||||
fromwire_peektype(hout->failmsg));
|
fromwire_peektype(hout->failmsg));
|
||||||
}
|
}
|
||||||
|
@ -662,7 +679,8 @@ static void forward_htlc(struct htlc_in *hin,
|
||||||
if (!next || !channel_active(next)) {
|
if (!next || !channel_active(next)) {
|
||||||
local_fail_in_htlc(hin, take(towire_unknown_next_peer(NULL)));
|
local_fail_in_htlc(hin, take(towire_unknown_next_peer(NULL)));
|
||||||
wallet_forwarded_payment_add(hin->key.channel->peer->ld->wallet,
|
wallet_forwarded_payment_add(hin->key.channel->peer->ld->wallet,
|
||||||
hin, next ? next->scid : NULL, NULL,
|
hin, get_onion_style(hin),
|
||||||
|
next ? next->scid : NULL, NULL,
|
||||||
FORWARD_LOCAL_FAILED,
|
FORWARD_LOCAL_FAILED,
|
||||||
WIRE_UNKNOWN_NEXT_PEER);
|
WIRE_UNKNOWN_NEXT_PEER);
|
||||||
return;
|
return;
|
||||||
|
@ -757,7 +775,7 @@ static void forward_htlc(struct htlc_in *hin,
|
||||||
fail:
|
fail:
|
||||||
local_fail_in_htlc(hin, failmsg);
|
local_fail_in_htlc(hin, failmsg);
|
||||||
wallet_forwarded_payment_add(ld->wallet,
|
wallet_forwarded_payment_add(ld->wallet,
|
||||||
hin, next->scid, hout,
|
hin, get_onion_style(hin), next->scid, hout,
|
||||||
FORWARD_LOCAL_FAILED,
|
FORWARD_LOCAL_FAILED,
|
||||||
fromwire_peektype(failmsg));
|
fromwire_peektype(failmsg));
|
||||||
}
|
}
|
||||||
|
@ -1283,6 +1301,7 @@ static void fulfill_our_htlc_out(struct channel *channel, struct htlc_out *hout,
|
||||||
else if (hout->in) {
|
else if (hout->in) {
|
||||||
fulfill_htlc(hout->in, preimage);
|
fulfill_htlc(hout->in, preimage);
|
||||||
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
||||||
|
get_onion_style(hout->in),
|
||||||
hout->key.channel->scid, hout,
|
hout->key.channel->scid, hout,
|
||||||
FORWARD_SETTLED, 0);
|
FORWARD_SETTLED, 0);
|
||||||
}
|
}
|
||||||
|
@ -1410,6 +1429,7 @@ static bool peer_failed_our_htlc(struct channel *channel,
|
||||||
|
|
||||||
if (hout->in)
|
if (hout->in)
|
||||||
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
||||||
|
get_onion_style(hout->in),
|
||||||
channel->scid,
|
channel->scid,
|
||||||
hout, FORWARD_FAILED,
|
hout, FORWARD_FAILED,
|
||||||
hout->failmsg
|
hout->failmsg
|
||||||
|
@ -1560,7 +1580,8 @@ void onchain_failed_our_htlc(const struct channel *channel,
|
||||||
local_fail_in_htlc(hout->in,
|
local_fail_in_htlc(hout->in,
|
||||||
take(towire_permanent_channel_failure(NULL)));
|
take(towire_permanent_channel_failure(NULL)));
|
||||||
wallet_forwarded_payment_add(hout->key.channel->peer->ld->wallet,
|
wallet_forwarded_payment_add(hout->key.channel->peer->ld->wallet,
|
||||||
hout->in, channel->scid, hout,
|
hout->in, get_onion_style(hout->in),
|
||||||
|
channel->scid, hout,
|
||||||
FORWARD_LOCAL_FAILED,
|
FORWARD_LOCAL_FAILED,
|
||||||
hout->failmsg
|
hout->failmsg
|
||||||
? fromwire_peektype(hout->failmsg)
|
? fromwire_peektype(hout->failmsg)
|
||||||
|
@ -1726,6 +1747,7 @@ static bool update_out_htlc(struct channel *channel,
|
||||||
|
|
||||||
if (hout->in) {
|
if (hout->in) {
|
||||||
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
wallet_forwarded_payment_add(ld->wallet, hout->in,
|
||||||
|
get_onion_style(hout->in),
|
||||||
channel->scid, hout,
|
channel->scid, hout,
|
||||||
FORWARD_OFFERED, 0);
|
FORWARD_OFFERED, 0);
|
||||||
}
|
}
|
||||||
|
@ -2305,7 +2327,7 @@ void peer_got_revoke(struct channel *channel, const u8 *msg)
|
||||||
|
|
||||||
// in fact, now we don't know if this htlc is a forward or localpay!
|
// in fact, now we don't know if this htlc is a forward or localpay!
|
||||||
wallet_forwarded_payment_add(ld->wallet,
|
wallet_forwarded_payment_add(ld->wallet,
|
||||||
hin, NULL, NULL,
|
hin, FORWARD_STYLE_UNKNOWN, NULL, NULL,
|
||||||
FORWARD_LOCAL_FAILED,
|
FORWARD_LOCAL_FAILED,
|
||||||
badonions[i] ? badonions[i]
|
badonions[i] ? badonions[i]
|
||||||
: fromwire_peektype(failmsgs[i]));
|
: fromwire_peektype(failmsgs[i]));
|
||||||
|
@ -2722,6 +2744,11 @@ void json_format_forwarding_object(struct json_stream *response,
|
||||||
onion_wire_name(cur->failcode));
|
onion_wire_name(cur->failcode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Old forwards don't have this field */
|
||||||
|
if (cur->forward_style != FORWARD_STYLE_UNKNOWN)
|
||||||
|
json_add_string(response, "style",
|
||||||
|
forward_style_name(cur->forward_style));
|
||||||
|
|
||||||
#ifdef COMPAT_V070
|
#ifdef COMPAT_V070
|
||||||
/* If a forwarding doesn't have received_time it was created
|
/* If a forwarding doesn't have received_time it was created
|
||||||
* before we added the tracking, do not include it here. */
|
* before we added the tracking, do not include it here. */
|
||||||
|
|
|
@ -5208,6 +5208,7 @@ def test_legacyonion(node_factory, bitcoind):
|
||||||
"destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d"})
|
"destination": "035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d"})
|
||||||
|
|
||||||
wait_for(lambda: only_one(l3.rpc.listinvoices()['invoices'])['status'] == 'paid')
|
wait_for(lambda: only_one(l3.rpc.listinvoices()['invoices'])['status'] == 'paid')
|
||||||
|
assert only_one(l2.rpc.listforwards()['forwards'])['style'] == 'legacy'
|
||||||
|
|
||||||
|
|
||||||
def test_pay_manual_exclude(node_factory, bitcoind):
|
def test_pay_manual_exclude(node_factory, bitcoind):
|
||||||
|
|
|
@ -872,6 +872,7 @@ static struct migration dbmigrations[] = {
|
||||||
/* Default is too big; we set to max after loading */
|
/* Default is too big; we set to max after loading */
|
||||||
{SQL("ALTER TABLE channels ADD htlc_maximum_msat BIGINT DEFAULT 2100000000000000"), NULL},
|
{SQL("ALTER TABLE channels ADD htlc_maximum_msat BIGINT DEFAULT 2100000000000000"), NULL},
|
||||||
{SQL("ALTER TABLE channels ADD htlc_minimum_msat BIGINT DEFAULT 0"), NULL},
|
{SQL("ALTER TABLE channels ADD htlc_minimum_msat BIGINT DEFAULT 0"), NULL},
|
||||||
|
{SQL("ALTER TABLE forwarded_payments ADD forward_style INTEGER DEFAULT NULL"), NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -528,7 +528,8 @@ void notify_forward_event(struct lightningd *ld UNNEEDED,
|
||||||
const struct amount_msat *amount_out UNNEEDED,
|
const struct amount_msat *amount_out UNNEEDED,
|
||||||
enum forward_status state UNNEEDED,
|
enum forward_status state UNNEEDED,
|
||||||
enum onion_wire failcode UNNEEDED,
|
enum onion_wire failcode UNNEEDED,
|
||||||
struct timeabs *resolved_time UNNEEDED)
|
struct timeabs *resolved_time UNNEEDED,
|
||||||
|
enum forward_style forward_style UNNEEDED)
|
||||||
{ fprintf(stderr, "notify_forward_event called!\n"); abort(); }
|
{ fprintf(stderr, "notify_forward_event called!\n"); abort(); }
|
||||||
/* Generated stub for onchaind_funding_spent */
|
/* Generated stub for onchaind_funding_spent */
|
||||||
enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED,
|
enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED,
|
||||||
|
|
|
@ -2534,6 +2534,7 @@ static bool wallet_stmt2htlc_in(struct channel *channel,
|
||||||
in->status = NULL;
|
in->status = NULL;
|
||||||
/* FIXME: save blinding in db !*/
|
/* FIXME: save blinding in db !*/
|
||||||
in->blinding = NULL;
|
in->blinding = NULL;
|
||||||
|
in->payload = NULL;
|
||||||
|
|
||||||
db_col_sha256(stmt, "payment_hash", &in->payment_hash);
|
db_col_sha256(stmt, "payment_hash", &in->payment_hash);
|
||||||
|
|
||||||
|
@ -4228,7 +4229,8 @@ static bool wallet_forwarded_payment_update(struct wallet *w,
|
||||||
const struct htlc_out *out,
|
const struct htlc_out *out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
enum onion_wire failcode,
|
enum onion_wire failcode,
|
||||||
struct timeabs *resolved_time)
|
struct timeabs *resolved_time,
|
||||||
|
enum forward_style forward_style)
|
||||||
{
|
{
|
||||||
struct db_stmt *stmt;
|
struct db_stmt *stmt;
|
||||||
bool changed;
|
bool changed;
|
||||||
|
@ -4244,6 +4246,7 @@ static bool wallet_forwarded_payment_update(struct wallet *w,
|
||||||
", state=?"
|
", state=?"
|
||||||
", resolved_time=?"
|
", resolved_time=?"
|
||||||
", failcode=?"
|
", failcode=?"
|
||||||
|
", forward_style=?"
|
||||||
" WHERE in_htlc_id=?"));
|
" WHERE in_htlc_id=?"));
|
||||||
db_bind_amount_msat(stmt, 0, &in->msat);
|
db_bind_amount_msat(stmt, 0, &in->msat);
|
||||||
|
|
||||||
|
@ -4268,7 +4271,12 @@ static bool wallet_forwarded_payment_update(struct wallet *w,
|
||||||
db_bind_null(stmt, 4);
|
db_bind_null(stmt, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
db_bind_u64(stmt, 5, in->dbid);
|
/* This can happen for malformed onions, reload from db. */
|
||||||
|
if (forward_style == FORWARD_STYLE_UNKNOWN)
|
||||||
|
db_bind_null(stmt, 5);
|
||||||
|
else
|
||||||
|
db_bind_int(stmt, 5, forward_style_in_db(forward_style));
|
||||||
|
db_bind_u64(stmt, 6, in->dbid);
|
||||||
db_exec_prepared_v2(stmt);
|
db_exec_prepared_v2(stmt);
|
||||||
changed = db_count_changes(stmt) != 0;
|
changed = db_count_changes(stmt) != 0;
|
||||||
tal_free(stmt);
|
tal_free(stmt);
|
||||||
|
@ -4277,6 +4285,7 @@ static bool wallet_forwarded_payment_update(struct wallet *w,
|
||||||
}
|
}
|
||||||
|
|
||||||
void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
||||||
|
enum forward_style forward_style,
|
||||||
const struct short_channel_id *scid_out,
|
const struct short_channel_id *scid_out,
|
||||||
const struct htlc_out *out,
|
const struct htlc_out *out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
|
@ -4292,7 +4301,7 @@ void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
||||||
resolved_time = NULL;
|
resolved_time = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wallet_forwarded_payment_update(w, in, out, state, failcode, resolved_time))
|
if (wallet_forwarded_payment_update(w, in, out, state, failcode, resolved_time, forward_style))
|
||||||
goto notify;
|
goto notify;
|
||||||
|
|
||||||
stmt = db_prepare_v2(w->db,
|
stmt = db_prepare_v2(w->db,
|
||||||
|
@ -4307,7 +4316,8 @@ void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
||||||
", received_time"
|
", received_time"
|
||||||
", resolved_time"
|
", resolved_time"
|
||||||
", failcode"
|
", failcode"
|
||||||
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
|
", forward_style"
|
||||||
|
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
|
||||||
db_bind_u64(stmt, 0, in->dbid);
|
db_bind_u64(stmt, 0, in->dbid);
|
||||||
|
|
||||||
if (out) {
|
if (out) {
|
||||||
|
@ -4341,12 +4351,17 @@ void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
||||||
} else {
|
} else {
|
||||||
db_bind_null(stmt, 9);
|
db_bind_null(stmt, 9);
|
||||||
}
|
}
|
||||||
|
/* This can happen for malformed onions, reload from db! */
|
||||||
|
if (forward_style == FORWARD_STYLE_UNKNOWN)
|
||||||
|
db_bind_null(stmt, 10);
|
||||||
|
else
|
||||||
|
db_bind_int(stmt, 10, forward_style_in_db(forward_style));
|
||||||
|
|
||||||
db_exec_prepared_v2(take(stmt));
|
db_exec_prepared_v2(take(stmt));
|
||||||
|
|
||||||
notify:
|
notify:
|
||||||
notify_forward_event(w->ld, in, scid_out, out ? &out->msat : NULL,
|
notify_forward_event(w->ld, in, scid_out, out ? &out->msat : NULL,
|
||||||
state, failcode, resolved_time);
|
state, failcode, resolved_time, forward_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct amount_msat wallet_total_forward_fees(struct wallet *w)
|
struct amount_msat wallet_total_forward_fees(struct wallet *w)
|
||||||
|
@ -4414,6 +4429,7 @@ const struct forwarding *wallet_forwarded_payments_get(struct wallet *w,
|
||||||
", f.received_time"
|
", f.received_time"
|
||||||
", f.resolved_time"
|
", f.resolved_time"
|
||||||
", f.failcode "
|
", f.failcode "
|
||||||
|
", f.forward_style "
|
||||||
"FROM forwarded_payments f "
|
"FROM forwarded_payments f "
|
||||||
"LEFT JOIN channel_htlcs hin ON (f.in_htlc_id = hin.id) "
|
"LEFT JOIN channel_htlcs hin ON (f.in_htlc_id = hin.id) "
|
||||||
"WHERE (1 = ? OR f.state = ?) AND "
|
"WHERE (1 = ? OR f.state = ?) AND "
|
||||||
|
@ -4511,6 +4527,12 @@ const struct forwarding *wallet_forwarded_payments_get(struct wallet *w,
|
||||||
} else {
|
} else {
|
||||||
cur->failcode = 0;
|
cur->failcode = 0;
|
||||||
}
|
}
|
||||||
|
if (db_col_is_null(stmt, "f.forward_style")) {
|
||||||
|
cur->forward_style = FORWARD_STYLE_UNKNOWN;
|
||||||
|
} else {
|
||||||
|
cur->forward_style
|
||||||
|
= forward_style_in_db(db_col_int(stmt, "f.forward_style"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tal_free(stmt);
|
tal_free(stmt);
|
||||||
return results;
|
return results;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
#include <common/onion.h>
|
||||||
#include <common/penalty_base.h>
|
#include <common/penalty_base.h>
|
||||||
#include <common/utxo.h>
|
#include <common/utxo.h>
|
||||||
#include <common/wallet.h>
|
#include <common/wallet.h>
|
||||||
|
@ -159,6 +160,45 @@ static inline const char* forward_status_name(enum forward_status status)
|
||||||
|
|
||||||
bool string_to_forward_status(const char *status_str, enum forward_status *status);
|
bool string_to_forward_status(const char *status_str, enum forward_status *status);
|
||||||
|
|
||||||
|
/* /!\ This is a DB ENUM, please do not change the numbering of any
|
||||||
|
* already defined elements (adding is ok) /!\ */
|
||||||
|
enum forward_style {
|
||||||
|
FORWARD_STYLE_LEGACY = ONION_V0_PAYLOAD,
|
||||||
|
FORWARD_STYLE_TLV = ONION_TLV_PAYLOAD,
|
||||||
|
FORWARD_STYLE_UNKNOWN = 2, /* Not actually in db, safe to renumber! */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Wrapper to ensure types don't change, and we don't insert/extract
|
||||||
|
* invalid ones from db */
|
||||||
|
static inline enum forward_style forward_style_in_db(enum forward_style o)
|
||||||
|
{
|
||||||
|
switch (o) {
|
||||||
|
case FORWARD_STYLE_LEGACY:
|
||||||
|
BUILD_ASSERT(FORWARD_STYLE_LEGACY == 0);
|
||||||
|
return o;
|
||||||
|
case FORWARD_STYLE_TLV:
|
||||||
|
BUILD_ASSERT(FORWARD_STYLE_TLV == 1);
|
||||||
|
return o;
|
||||||
|
case FORWARD_STYLE_UNKNOWN:
|
||||||
|
/* Not recorded in DB! */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fatal("%s: %u is invalid", __func__, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char *forward_style_name(enum forward_style style)
|
||||||
|
{
|
||||||
|
switch (style) {
|
||||||
|
case FORWARD_STYLE_UNKNOWN:
|
||||||
|
return "UNKNOWN";
|
||||||
|
case FORWARD_STYLE_TLV:
|
||||||
|
return "tlv";
|
||||||
|
case FORWARD_STYLE_LEGACY:
|
||||||
|
return "legacy";
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
/* DB wrapper to check htlc_state */
|
/* DB wrapper to check htlc_state */
|
||||||
static inline enum htlc_state htlc_state_in_db(enum htlc_state s)
|
static inline enum htlc_state htlc_state_in_db(enum htlc_state s)
|
||||||
{
|
{
|
||||||
|
@ -234,6 +274,7 @@ struct forwarding {
|
||||||
struct short_channel_id channel_in, channel_out;
|
struct short_channel_id channel_in, channel_out;
|
||||||
struct amount_msat msat_in, msat_out, fee;
|
struct amount_msat msat_in, msat_out, fee;
|
||||||
struct sha256 *payment_hash;
|
struct sha256 *payment_hash;
|
||||||
|
enum forward_style forward_style;
|
||||||
enum forward_status status;
|
enum forward_status status;
|
||||||
enum onion_wire failcode;
|
enum onion_wire failcode;
|
||||||
struct timeabs received_time;
|
struct timeabs received_time;
|
||||||
|
@ -1308,6 +1349,7 @@ struct channeltx *wallet_channeltxs_get(struct wallet *w, const tal_t *ctx,
|
||||||
* Add of update a forwarded_payment
|
* Add of update a forwarded_payment
|
||||||
*/
|
*/
|
||||||
void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
void wallet_forwarded_payment_add(struct wallet *w, const struct htlc_in *in,
|
||||||
|
enum forward_style forward_style,
|
||||||
const struct short_channel_id *scid_out,
|
const struct short_channel_id *scid_out,
|
||||||
const struct htlc_out *out,
|
const struct htlc_out *out,
|
||||||
enum forward_status state,
|
enum forward_status state,
|
||||||
|
|
Loading…
Add table
Reference in a new issue