Plugin: Another new notification type, forward_event - #2799
Conversation
|
|
ZmnSCPxj
left a comment
There was a problem hiding this comment.
Have not reviewed completely yet (not much time), only first three commits.
This comment has been minimized.
This comment has been minimized.
|
|
||
| response = json_stream_success(info->cmd); | ||
| json_add_hex(response, "payment_hash", details->rhash.u.u8, | ||
| json_add_hex(response, "payment_hash", &details->rhash, |
There was a problem hiding this comment.
If this is common enough, maybe a botique json_add_sha256 could be added?
There was a problem hiding this comment.
Sounds good! What about adding it in anothor PR?
It seems need change many places.
| "out_msat": "100000000msat", | ||
| "fee": 1001, | ||
| "fee_msat": "1001msat", | ||
| "status": "settled", |
There was a problem hiding this comment.
The rest of your document refers to FORWARD_OFFERED, FORWARD_SETTLED, etc. Which one is actually used on the actual plugin interface? Please use what is actually visible to plugins, as this is PLUGINS.md, and avoid reference to internal defines that plugins need not know about.
There was a problem hiding this comment.
Thank you, I'll change FORWARD_SETTLED to "settled", etc.
| cur->fee = AMOUNT_MSAT(0); | ||
| } | ||
| cur->payment_hash = tal(cur, struct sha256_double); | ||
| cur->payment_hash->sha = in->payment_hash; |
There was a problem hiding this comment.
@ZmnSCPxj My thoughts about struct sha256 and struct sha256_double are mainly reflected here.
The same payment hash data, the different structures we used.
Before storing forward payment information into DB, we used struct sha256. And after storing, we used struct sha256_double, which is involved in struct forwarding:
Lines 189 to 198 in 2945b25
For another example, we used
struct sha256 for payment_hash in struct wallet_payment:Lines 241 to 262 in 2945b25
Like BOLT#11 said,
set
payment_hashto theSHA2256-bit hash of thepayment_preimagethat will be given in return for payment.
Should we change the structure of payment_hash in struct forwarding to struct sha256?
There was a problem hiding this comment.
It does look quite wrong... yes, we should probably fix this in a new PR.
57c250b to
2910427
Compare
8bad91d to
ac830d2
Compare
|
Rebased and handled conflicts. |
| "invoice_payment", | ||
| "channel_opened" | ||
| "channel_opened", | ||
| "forward_event" |
There was a problem hiding this comment.
Nit: For future reference, I prefer , on the trailing element, to avoid the extra line change like this. It's legal since C99 and it's been allowed by compilers for even longer, too.
There was a problem hiding this comment.
I guess you prefer autodata to register notification. :)
91a3e1a to
b52eb3c
Compare
|
Rebased and corrected the CHANGELOG. |
|
Rebased and Resolved conflict. |
|
ACK 52f552f Fixed merge conflict. |
…OCAL_FAILED status
'payment_hash' can help users learn more about the forward payment.
Warp this process as a new function: 'void json_format_forwarding_object()'. This function will be used in 'forward_event' next, and can ensure the consistent json object structure for forward_payment between 'listforwards' API and 'forward_event' notification.
`forward_event`
A notification for topic `forward_event` is sent every time the status
of a forward payment is set. The json format is same as the API
`listforwards`.
```json
{
"forward_event": {
"payment_hash": "f5a6a059a25d1e329d9b094aeeec8c2191ca037d3f5b0662e21ae850debe8ea2",
"in_channel": "103x2x1",
"out_channel": "103x1x1",
"in_msatoshi": 100001001,
"in_msat": "100001001msat",
"out_msatoshi": 100000000,
"out_msat": "100000000msat",
"fee": 1001,
"fee_msat": "1001msat",
"status": "settled",
"received_time": 1560696342.368,
"resolved_time": 1560696342.556
}
}
```
or
```json
{
"forward_event": {
"payment_hash": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"in_channel": "103x2x1",
"out_channel": "110x1x0",
"in_msatoshi": 100001001,
"in_msat": "100001001msat",
"out_msatoshi": 100000000,
"out_msat": "100000000msat",
"fee": 1001,
"fee_msat": "1001msat",
"status": "local_failed",
"failcode": 16392,
"failreason": "WIRE_PERMANENT_CHANNEL_FAILURE",
"received_time": 1560696343.052
}
}
```
- The status includes `offered`, `settled`, `failed` and `local_failed`,
and they are all string type in json.
- When the forward payment is valid for us, we'll set `offered`
and send the forward payment to next hop to resolve;
- When the payment forwarded by us gets paid eventually, the forward
payment will change the status from `offered` to `settled`;
- If payment fails locally(like failing to resolve locally) or the
corresponding htlc with next hop fails(like htlc timeout), we will
set the status as `local_failed`. `local_failed` may be set before
setting `offered` or after setting `offered`. In fact, from the
time we receive the htlc of the previous hop, all we can know the
cause of the failure is treated as `local_failed`. `local_failed`
only occuors locally or happens in the htlc between us and next hop;
- If `local_failed` is set before `offered`, this
means we just received htlc from the previous hop and haven't
generate htlc for next hop. In this case, the json of `forward_event`
sets the fields of `out_msatoshi`, `out_msat`,`fee` and `out_channel`
as 0;
- Note: In fact, for this case we may be not sure if this incoming
htlc represents a pay to us or a payment we need to forward.
We just simply treat all incoming failed to resolve as
`local_failed`.
- Only in `local_failed` case, json includes `failcode` and
`failreason` fields;
- `failed` means the payment forwarded by us fails in the
latter hops, and the failure isn't related to us, so we aren't
accessed to the fail reason. `failed` must be set after
`offered`.
- `failed` case doesn't include `failcode` and `failreason`
fields;
- `received_time` means when we received the htlc of this payment from
the previous peer. It will be contained into all status case;
- `resolved_time` means when the htlc of this payment between us and the
next peer was resolved. The resolved result may success or fail, so
only `settled` and `failed` case contain `resolved_time`;
- The `failcode` and `failreason` are defined in [BOLT 4][bolt4-failure-codes].
Here should't be accessed directly to the underlying of struct sha256.
|
ACK d5edafa Sorry, temporarily messed up the branch, but should be ok state now. |
|
Thank you very much! |
Introduction
A notification for topic
forward_eventis sent every time the status of a forward payment is set. The json format is same as the APIlistforwards.Now when the forwad payment status changes, we'll store forward payments with the new status into DB. This notification will notify subscribers after storing operation.
{ "forward_event": { "payment_hash": "f5a6a059a25d1e329d9b094aeeec8c2191ca037d3f5b0662e21ae850debe8ea2", "in_channel": "103x2x1", "out_channel": "103x1x1", "in_msatoshi": 100001001, "in_msat": "100001001msat", "out_msatoshi": 100000000, "out_msat": "100000000msat", "fee": 1001, "fee_msat": "1001msat", "status": "settled", "received_time": 1560696342.368, "resolved_time": 1560696342.556 } }or
{ "forward_event": { "payment_hash": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "in_channel": "103x2x1", "out_channel": "110x1x0", "in_msatoshi": 100001001, "in_msat": "100001001msat", "out_msatoshi": 100000000, "out_msat": "100000000msat", "fee": 1001, "fee_msat": "1001msat", "status": "local_failed", "failcode": 16392, "failreason": "WIRE_PERMANENT_CHANNEL_FAILURE", "received_time": 1560696343.052 } }EDIT: change the "forward_event" fieldname in json to "forward_payment".Related Changes
LOCAL_FAILEDstatus;listforwardsincludepayment_hashfield;A Related Question
I am confused about the difference of
struct sha256andstruct sha256_double: these two struct are both used to storepayment_hash, maybe we need a cleanup to unify their usage forpayment_hash.