Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MPP pay splits into too many subpayments #3926

Closed
thestick613 opened this issue Aug 11, 2020 · 38 comments · Fixed by #3936 or #3986
Closed

MPP pay splits into too many subpayments #3926

thestick613 opened this issue Aug 11, 2020 · 38 comments · Fixed by #3936 or #3986

Comments

@thestick613
Copy link
Contributor

I have an outbound channel with an BTC to Lightning exchange worth 2.000.000 satoshi, with enough capacity.
I try to swap my 2.000.000 satoshi for the same amount, but on-chain.
Lightningd splits the payment into too many subpayments, and eventually fails, even though the destination is only one hop away, and has enough capacity.

@ZmnSCPxj
Copy link
Collaborator

ZmnSCPxj commented Aug 11, 2020

Can you provide logs? In particular a message "Split into " in the inform-level logs (though debug-level logs would be best).

Is the receiver also forwarding/receiving payments at the same time as well?

@thestick613
Copy link
Contributor Author

First time i tried this, i ended up with #3846, then with #3848 and then with #3851, and then with #3915. The logs always looked like this:

  • Detected large payment, splitting into 100 sub-payments, and then a log of entries about too many HTLCs or timeouts.
    I'm willing to do another test in a few days.

@ZmnSCPxj
Copy link
Collaborator

I observe something similar in the failure cases of #3913 as well, which I think are mitigated by #3914. Are you paying to a node that is unpublished (i.e. is not visible on 1ml.com)?

@ZmnSCPxj
Copy link
Collaborator

The reason the logs are important is that we have to know if it is the presplit splitter that is too aggressive, or the adaptive splitter.

@ZmnSCPxj
Copy link
Collaborator

Finally: if you do not want to try paying again for a while due to the extant bugs: how many channels do you have?

@ZmnSCPxj
Copy link
Collaborator

And if possible: if the destination is published, how many channels does it have? If the destination is not published, how many routehints were on the invoice?

@cdecker maybe we should consider as well the HTLC budget on the payee end, not just on the payer end? In #3916 @thestick613 claims to have over 100 HTLCs pending, if those are from a single pay attempt that suggests the payer node has ~10 channels or so I think, perhaps it is the payee that is not able to handle that many incoming HTLCs due to having fewer channels?

@thestick613
Copy link
Contributor Author

Logs incoming:

2020-08-12T12:53:06.135Z INFO plugin-pay: Split into 51 sub-payments due to initial size (499907000msat > 10000000msat)
2020-08-12T12:53:06.687Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.688Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.689Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.740Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.762Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.767Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.770Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.771Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.774Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.776Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.777Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.803Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.803Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.804Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.804Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.951Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.951Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.952Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.952Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.952Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.978Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.979Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:06.980Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.015Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.016Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.093Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.094Z UNUSUAL plugin-pay: Could not update the channel hint for 579336x1618x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.094Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.094Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.094Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.102Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.103Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.103Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.206Z UNUSUAL plugin-pay: Could not update the channel hint for 605257x1187x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:07.352Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.353Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.355Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.361Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.362Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.363Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.364Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.365Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.366Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.367Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.368Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.370Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.371Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.375Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.448Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.451Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.452Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.452Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.452Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.468Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.469Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.470Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.473Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.474Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.474Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:07.518Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:07.561Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 25715sat)
2020-08-12T12:53:08.651Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.653Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.654Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.658Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.659Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.664Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.666Z UNUSUAL plugin-pay: Could not update the channel hint for 630131x2397x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:08.669Z UNUSUAL plugin-pay: Could not update the channel hint for 630131x2397x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:08.674Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.681Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.694Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.695Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.703Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.707Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.738Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.738Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.739Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.739Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:08.740Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)
2020-08-12T12:53:09.011Z INFO 02913d84886059292845f870c5229f103dd8d7d71d7e9fc6fd52f75a40486d2187-chan#57145: htlc 28 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:09.052Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:09.135Z UNUSUAL plugin-pay: Could not update the channel hint for 612040x2823x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:09.137Z UNUSUAL plugin-pay: Could not update the channel hint for 612040x2823x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:09.222Z UNUSUAL plugin-pay: Could not update the channel hint for 612040x2823x0/1. Could be a concurrent `getroute` call.
2020-08-12T12:53:09.337Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:09.337Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 24366sat)
2020-08-12T12:53:09.718Z INFO 03c2abfa93eacec04721c019644584424aab2ba4dff3ac9bdab4e9c97007491dda-chan#29279: htlc 476 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:09.727Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.263Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 425 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.272Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.360Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 290 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.362Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 287 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.371Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.374Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.478Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 426 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.479Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 427 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.484Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.486Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.577Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 3156sat)
2020-08-12T12:53:10.794Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 301 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.795Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 302 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.796Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 293 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.797Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 294 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.798Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 299 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.799Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 296 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.800Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 292 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.806Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.809Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.810Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.811Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.811Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.812Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.813Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-12T12:53:10.843Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 430 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.844Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 429 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.845Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 432 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.846Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 428 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-12T12:53:10.846Z INFO 03634bda49c9c42afd876d8288802942c49e58fbec3844ff54b46143bfcb6cdfaf-chan#57168: htlc 431 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)

and it goes on like this for a while

The pay command outputed, which i hope means it failed.

{
   "code": 210,
   "message": "Ran out of routes to try after 328 attempts: see `paystatus`",
   "attempts": [
    [...]
}

The payment size is ~500.000 satoshi. I have over 16 channels that have this much available to pay capacity. It just seems odd to split the payment into 51 subpayments.

@thestick613
Copy link
Contributor Author

And surprisingly ... legacypay same_bolt_11 5 minutes later worked.

@ZmnSCPxj
Copy link
Collaborator

It just seems odd to split the payment into 51 subpayments.

Indeed. It looks like we did not test the case where the payer has substantially greater number of channels than the payee, or even the average number of channels that a typical network node has. We should probably get some statistics for the median number of channels that a network node has, or maybe mean to bias it for the benefit of the majority of the network.

We estimate a certain number of HTLCs that each outgoing channel can have; if you do not mess around with some of the more obscure options we have, I think we go with 10 HTLCs per outgoing channel. Since you have 16 channels, that amounts to 160 HTLCs limit.

Then, at the presplit stage, we take your 500,000-sat invoice and divide it into 10,000-sat lots (the 10,000-sat is hardcoded, based on @cdecker statistics that 83% of 10,000-sat HTLCs reach random destinations from his controlled nodes). This results in about 50 initial HTLCs. Since this is far lower than the 160 HTLCs limit we got from you having 16 channels, the presplitter goes ahead with splitting into 10,000-sat lots (if the number of lots were greater than our computed HTLCs limit, we would have increased the lot size accordingly). You got 51 lots because we do not actually split into exact lot sizes of 10,000 sats each, we randomize a bit, so getting 49->51 lots is expected, more rarely a wider spread, but that is approximately what we expect.

But the root is really that the payer has a ton of channels and that made us assume that the limit on the number of HTLCs was far greater than what the rest of the network, and/or the receiver, can handle.

Our initial HTLC limit should be the lowest among:

  • Some number (e.g. 10, as current) times the number of outgoing channels we have.
  • Some number (e.g. 10 as current) times the number of incoming channels we know the payee to have.
    • If the payee is published, we count the number of channels it has.
    • If the payee is unpublished, we get it from the number of routehints.
  • Some number (e.g. 10 as current) times the number of average channels a network node has, as per statistics on the average number of channels a network node has.
    • Alternately we could check the direct peers for the number of channels they have (that are not to us directly).

This prevents the following issues:

  • The payer is unusually well-connected compared to the payee.
  • The payer is unusually well-connected compared to rest of the network.

Those are probably the reason why you get these logs:

    2020-08-12T12:53:08.651Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)

And surprisingly ... legacypay same_bolt_11 5 minutes later worked.

Not a surprise. Our new pay in 0.9.0 is the first "serious" implementation of outgoing MPP, so we expect bugs (just not as bad as was reported LOL), which is why legacypay still exists.

@ZmnSCPxj
Copy link
Collaborator

Those are probably the reason why you get these logs:

    2020-08-12T12:53:08.651Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs)

No, that is incorrect, who the heck wrote that? We only get errors that detailed if and only if it is a local error. Remote errors just get the failure code and a useless "reply from remote" message. So it looks like we tried to pile on the 51 sub-payments on a single channel (probably because it was the most direct route to the destination), which choked. We should not do that. Instead, we should round-robin the outgoing channels, as I suggested in #3894. The reason why we should avoid piling such HTLCs on a single channel is that we want to avoid incorrect capacity estimates of our local channels.

Nevertheless, we do see some later WIRE_TEMPORARY_CHANNEL_FAILURE: Reply from remote messages, and since a later legacypay succeeded, those failures did not have anything to do with capacity but instead about number of HTLCs. So throttling the number of HTLCs depending on the connectivity of the payee (and the average connectivity of network nodes?) would probably work just as well.

ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 13, 2020
…on channels.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 13, 2020
…on channels.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
@ZmnSCPxj
Copy link
Collaborator

Hi @thestick613 , I wrote #3936 based on your report, if you have the inclination, could you check that PR and see if it fixes your problem?

ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 13, 2020
…on channels.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 13, 2020
…on channels.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 13, 2020
…on channels.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
@whitslack
Copy link
Collaborator

I just ran into a mega case of this. Why do you split a large payment into so many tiny payments right away, without first trying the large payment? Basically, why run a "presplitter" at all? Isn't the adaptive splitter all you need?

I tried to pay a ~3.8-Msat invoice, and C-Lightning foolishly split my payment into 385 sub-payments, which of course was never going to work. Most of the attempts failed with "WIRE_TEMPORARY_CHANNEL_FAILURE: Too many HTLCs."

Worse, it was completely unclear to me whether the overall payment attempt had actually been abandoned or was still ongoing in the background. The pay command returned "code": 210, "message": "Ran out of routes to try after 731 attempts: see paystatus", but many of the elements in the returned attempts array had "status": "pending", which suggests that I should not re-attempt the payment. When I look at paystatus, many of the elements in the attempts array have "strategy": "Still have 9 attempts left", which also suggests that I should not re-attempt the payment.

How am I supposed to know when C-Lightning has fully abandoned my payment attempt? It is unclear to me whether/when I will be guaranteed that the payment failed safely and I will not lose this money.

@ZmnSCPxj
Copy link
Collaborator

ZmnSCPxj commented Aug 13, 2020

When pay returns, it will stop reattempting. Sub-payments may remain pending, but those are partial payments and the receiver will not claim them since they will not add up to the expected amount. Once pay returns that invoice will not be paid as long as you do not re-execute.

However, you should not execute a new pay command with the same invoice once it fails, as previous pending sub-payments are not considered. What we should properly do on our side should be to check if there is a previous payment attempt with pending sub-payments and to resume that (i.e. this is a bug on our end). As is, with 0.9.0, doing something like this may cause the pay command to ignore the existing pending payments and get badly lost funds and so on.

So:

  • On pay failure, you can consider the invoice as "not paid" even with pending sub-payments, those will eventually be returned by the payee after 60 seconds or so (if they follow BOLT spec).
    • This is probably a rather bad API on our end. Previous legacypay, if some remote held the outgoing single HTLC, the pay command would not return until it was returned, even after retry_for seconds. Current pay will return as soon as any single sub-payment fails, but in theory the receiver can decide to later accept a smaller amount than what was indicated in the invoice. Sigh.
  • BUT after a failure you should cowardly refuse to pay the failed invoice unless all pending sub-payments have definitely failed (which "should" not take more than 60 seconds modulo communication delays, for some definition of the word "should").

@whitslack
Copy link
Collaborator

Sub-payments may remain pending, but those are partial payments and the receiver will not claim them since they will not add up to the expected amount.

Is that cryptographically enforced or merely a typical node policy? Couldn't a receiver say, "oh yeah, I'll claim sub-payments totaling 80% of the invoice amount"? (Ah, I see you edited your reply to acknowledge this possibility further down.)

However, you should not execute a new pay command with the same invoice once it fails […] As is, with 0.9.0, doing something like this may cause the pay command to ignore the existing pending payments and get badly lost funds and so on.

This warning needs to go in the manpage!

  • On pay failure, you can consider the invoice as "not paid" even with pending sub-payments, those will eventually be returned by the payee after 60 seconds or so (if they follow BOLT spec).

60 seconds? So how do I still have attempts in "strategy": "Still have 9 attempts left" almost two hours later? The invoice expired after 15 minutes. Shouldn't all sub-payment attempts have cratered by now?

in theory the receiver can decide to later accept a smaller amount than what was indicated in the invoice. Sigh.

Yeaaahhhhhh.

  • BUT after a failure you should cowardly refuse to pay the failed invoice unless all pending sub-payments have definitely failed (which "should" not take more than 60 seconds modulo communication delays, for some definition of the word "should").

How would I know when/if that has occurred? paystatus doesn't report how many sub-payments are still pending.

@whitslack
Copy link
Collaborator

in theory the receiver can decide to later accept a smaller amount than what was indicated in the invoice.

If this were to happen, how would I find out about it?

@ZmnSCPxj
Copy link
Collaborator

@whitslack how many channels do you have and why did presplitter allow 385?? wow.

@cdecker I think we should consider not returning immediately once we have decided to stop retrying and a failing payment comes on. The current pay runs the following risks:

  • If the pay command returns with failure, but we still have payments pending, we run the risk that the receiver might decide to just claim partial funds. This is irrational if the preimage is valuable (the atomicity of Base AMP / MPP is based on this assumption!) but if for example this is a custodial service that credits / debits a user account, well, it would be possible to hack this into a receiver and have it claim partial funds.
  • If a new pay command is initiated while a sub-payment for a previous pay is ongoing, that leads to problems since the new pay command is not considering the previous pay pending outgoing payments. This could lead to accidental overpayment.

I think the above two items above deserve their own issue.... The easy fix is to simply:

  • On failure, wait for all pending parts to definitely fail before reporting failure.

This also gives us a decent point at which to delete the entire payment tree.

This seems to be an argument for having a flat array of payments we consider as pending, as well.

@ZmnSCPxj
Copy link
Collaborator

So how do I still have attempts in "strategy": "Still have 9 attempts left" almost two hours later?

Are they still pending? Because "strategy" is just the last string we wrote into the why field. If pay has given up on it that strategy will never be changed.

@ZmnSCPxj
Copy link
Collaborator

ZmnSCPxj commented Aug 13, 2020

If this were to happen, how would I find out about it?

Months later when your LN node has 0 funds on it. :(. In theory you could keep polling the listsendpays command for those. Aaargh. I will be going to sleep in a while. Sigh.

For now, you might want to use legacypay, which is probably a lot safer, though the current listpays will probably not report legacypay (maybe, not sure, have not touched that code). Sigh.

@ZmnSCPxj
Copy link
Collaborator

This warning needs to go in the manpage!

FWIW I just realized this utterly bad behavior now. Sigh.

@whitslack
Copy link
Collaborator

how many channels do you have

$ lightning-cli listpeers | jq '[.peers[] | .channels[] | select(.state == "CHANNELD_NORMAL")] | length'
420

and why did presplitter allow 385?? wow.

I have no idea. It seems quite excessive. I get that 3.8 Msat is a larger payment than would typically be sent over the Lightning Network, but I wanted to try out the new multi-part payments functionality, and I figured the whole point of MPP is to allow sending large payments. But splitting 3.8 Msat into ~10-ksat chunks is pretty ridiculous, IMHO.

@whitslack
Copy link
Collaborator

In theory you could keep polling the listsendpays command for those.

Thanks for the tip.

$ lightning-cli -k listsendpays payment_hash=##redacted## | jq 'reduce (.payments[].status) as $status ({}; .[$status] += 1)'
{
  "failed": 730
}

730 sub-payment attempts in failed status and none in any other status. So I take this to mean that the payee did not claim any of the sub-payments.

@whitslack
Copy link
Collaborator

Disconcerting that pay reported 731 attempts, but listsendpays returns only 730 attempts for that payment_hash. :/

@ZmnSCPxj
Copy link
Collaborator

I have no idea.

The presplitter allocates 10 HTLCs per outgoing channel (if your default max-concurrent-htlcs is 30). More specifically, it allocates max-concurrent-htlcs times the number of channels, divided by 3. If you set max-concurrent-channels to 5, and have 420 channels, the presplitter would have been perfectly willing to split it up to 700 parts......... HAHAHAHAHA

The presplitter will not split to lower than 10,000-sat parts (the adaptive splitter will not split lower than 100-sat parts). Since your initial limit is 700 parts, but you were sending 3,800,000 sats, the presplitter went with 380 x 10,000 parts (the extra 5 is due to randomizing the splits, you actually get "around" 380 parts, with some randomness).

That is a very popular node you are running there.

For now, I suggest using legacypay, or if that is not possible for you, --disable-mpp.

ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 14, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
@whitslack
Copy link
Collaborator

That is a very popular node you are running there.

And here I was thinking that I was doing myself a favor by getting my node "well established" in the network while chain fees are still somewhat affordable. I never imagined that a better connected node would be less able to complete a payment! 😅

@ZmnSCPxj
Copy link
Collaborator

ZmnSCPxj commented Aug 14, 2020

Haha, yes. #3936 should help with that issue, if you are willing to get on master and in addition pull the PR as well.

It is very hard to have tests that simulate a heavily-connected node, for the very simple reason we have to run tons of lightningd instances to simulate a heavily-connected node, so a bit difficult here in dev-land to get such a heavily-connected node that we can play around with. Hmmmmmmmm.

@thestick613
Copy link
Contributor Author

I'll try again when bitcoin fees are lower.

@thestick613
Copy link
Contributor Author

Tried with #3936

2020-08-15T06:36:58.528Z INFO plugin-pay: Split into 20 sub-payments due to initial size (1999934000msat > 99996700msat)
2020-08-15T06:36:59.013Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.015Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.037Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.037Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.044Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.048Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.049Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.055Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.058Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.060Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.181Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.181Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.184Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.187Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.189Z UNUSUAL plugin-pay: Could not update the channel hint for 614927x1433x0/1. Could be a concurrent `getroute` call.
2020-08-15T06:36:59.194Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.195Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.196Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.197Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.202Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.215Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.216Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.221Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.274Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.274Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:36:59.275Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (WIRE_TEMPORARY_CHANNEL_FAILURE: Capacity exceeded - HTLC fee: 33951sat)
2020-08-15T06:37:00.388Z INFO 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-chan#64530: htlc 267 failed from 0th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-15T06:37:00.395Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-15T06:37:00.669Z INFO 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-chan#64530: htlc 268 failed from 1th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-15T06:37:00.676Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-15T06:37:00.821Z INFO 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-chan#64530: htlc 266 failed from 1th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-15T06:37:00.831Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-15T06:37:00.900Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 319 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:00.901Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 321 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:00.902Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 322 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:00.902Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 320 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:00.908Z UNUSUAL plugin-pay: Node #2 (03efccf2c383d7bf340da9a3f02e2c23104a0e4fe8ac1a880c8e2dc92fbdacd9df) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:00.908Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:00.908Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:00.909Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:00.909Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:00.909Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:00.909Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:00.909Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.246Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 326 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.598Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 334 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.599Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 329 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.600Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 335 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.601Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 328 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.601Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 327 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.602Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 330 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.603Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 331 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.604Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 332 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.604Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 333 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:01.612Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.612Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.612Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.612Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.613Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.613Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.613Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.613Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.614Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.614Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.614Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.614Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.614Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.614Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.615Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.615Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:01.615Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:01.615Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:02.224Z INFO 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-chan#64530: htlc 269 failed from 1th node with code 0x1007 (WIRE_TEMPORARY_CHANNEL_FAILURE)
2020-08-15T06:37:02.229Z INFO plugin-pay: failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)
2020-08-15T06:37:02.738Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 336 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:02.739Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 337 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:02.740Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 338 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:02.747Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:02.747Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:02.747Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:02.747Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:02.748Z UNUSUAL plugin-pay: Node #2 (03952f8756c036669440e06c782c7f21732886ccf04052e0e6e792f8f5a490f6aa) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:02.748Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:03.321Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 340 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.322Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 339 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.323Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 341 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.329Z UNUSUAL plugin-pay: Node #2 (02a04446caa81636d60d63b066f2814cbd3a6b5c258e3172cbdded7a16e2cfff4c) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:03.330Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:03.330Z UNUSUAL plugin-pay: Node #2 (02a04446caa81636d60d63b066f2814cbd3a6b5c258e3172cbdded7a16e2cfff4c) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:03.330Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:03.331Z UNUSUAL plugin-pay: Node #2 (02a04446caa81636d60d63b066f2814cbd3a6b5c258e3172cbdded7a16e2cfff4c) claimed #1 (023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1) sent them invalid cltv
2020-08-15T06:37:03.331Z INFO plugin-pay: failed: WIRE_INCORRECT_CLTV_EXPIRY (reply from remote)
2020-08-15T06:37:03.603Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 343 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.604Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 345 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.605Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 344 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)
2020-08-15T06:37:03.605Z INFO 023662f1db3d0527dab0869e30f183021db7dc44f6f2e32ece42dd124846c89ca1-chan#74914: htlc 342 failed from 0th node with code 0x100d (WIRE_INCORRECT_CLTV_EXPIRY)

In the end, it failed as well.

@thestick613
Copy link
Contributor Author

   "code": 210,
   "message": "Ran out of routes to try after 341 attempts: see `paystatus`",
   "attempts": [...]

@thestick613
Copy link
Contributor Author

thestick613 commented Aug 15, 2020

Tried a different, smaller one (0.01 BTC) with https://boltz.exchange/, and MPP pay seemed to work. The pay command took 15-20 minutes to execute, and i was almost going to Ctrl+C it. I can send you guys the full lightningd logs (the first failure, then the second successfull one) if it helps you improve the algorithm. I guess you could merge #3936, since it's not the first time i tried paying 0.01 to that specific node, but it's the first time it worked.

@ZmnSCPxj
Copy link
Collaborator

15 minutes, heck. Did you feed a retry_for param? If it exceeded the retry_for (default 60 seconds I think) for a long time, then it seems somebody on the network is slow... which is more likely to be hit if we start with lots of little subpayments, as well. Sigh.

Getting #3917 merged in would be much more helpful to help figure out the bad behavior of the algorithm. In particular we are not currently printing any logs when the adaptive splitter triggers. So existing logs, while useful, could be improved. Sorry for this. @cdecker @niftynei @rustyrussell I would rather not merge unilaterally, please review #3917? In any case thanks for the effort @thestick613, sorry for the losses incurred in fees testing this, and yes please provide logs if possible.

Looks to me we want to consider having a paymod that merges multiple failing subpayments. But by what rule do we use to determine if we should merge instead of split? Obviously at some point our channel hints are poisoned, since the same error is reported for both insufficient msat capacity and insufficient HTLC capacity: the answer to insufficient msat capacity is split, but the answer to insufficient HTLC capacity is merge.

This is complicated by the fact that at least some of the HTLC-capacity limit is caused by onchain fees. So if onchain fees are high, every split-out becomes expensive. In particular, there will always exist some N where a single N-amount HTLC can pass through a channel, but two N/2 HTLCs cannot. What we need is to figure out whether our splits are above or below this N. If it is above, we should split, if it is below, we should merge. Hmmmmmm.

@thestick613
Copy link
Contributor Author

I just wrote pay bolt11, no extra parameters. I can probably wait for #3917 before attempting any more pays. I've sent you guys some logs.

@ZmnSCPxj
Copy link
Collaborator

Received, thanks!

@fiatjaf
Copy link
Contributor

fiatjaf commented Aug 23, 2020

Sorry, I don't have logs or anything, just some anedoctal evidence: I tried 3 times over a couple of hours to pay a 1344342 sat invoice right now with pay and saw the message: INFO plugin-pay: Split into 133 sub-payments due to initial size (1344342000msat > 10000000msat), then the payment failed with a ton of WIRE_TEMPORARY_CHANNEL_FAILURE.

Then I tried legacypay and the payment went through immediately.

The receiver was a node with only 5 channels.


Besides that, I don't really have good stats on this, but it seems payments originating from t.me/lntxbot are failing more since I upgraded to 0.9.x, or at least that's what the number of people complaining say (which is never too much, so the increase may be a coincidence).

My uninformed opinion is that the splitting is too aggressive.

@whitslack
Copy link
Collaborator

If the pay command returns with failure, but we still have payments pending, we run the risk that the receiver might decide to just claim partial funds. This is irrational if the preimage is valuable (the atomicity of Base AMP / MPP is based on this assumption!) but if for example this is a custodial service that credits / debits a user account, well, it would be possible to hack this into a receiver and have it claim partial funds.

@ZmnSCPxj: Is claiming a partial payment actually possible? I just came across some messages between you and @Roasbeef discussing how atomic multipath payments would prevent the claiming of any sub-payment until all sub-payments have been routed through. Am I misunderstanding?

@ZmnSCPxj
Copy link
Collaborator

@whitslack yes. It would be irrational to do so if the preimage is somehow inherently valuable, with equal value to the invoice amount (for example, if it unlocks some onchain HTLC, or if it is the decryption key of some valuable data, or it is used as an authorization to access some resource, or somebody will beat you up if you don't pay them and can show a preimage to prove you paid them).

However, if the preimage is not valuable, claiming a partial payment may be rational.

Consider the case where a custodial service exists on Lightning (custodial services are evil, of course). The evil custodial service could support paying an arbitrary invoice.

A user of that custodial service could attack the custodial service if it knows the custodial service performs MPP, and treats failure of one sub-payment as failure of the entire sub-payment.

  • Attacker specially programs a node (e.g. by hooking into htlc_accepted on a C-lightning node).
  • Attacker prepares an invoice from that invoice.
  • Attacker asks custodial service to pay invoice.
    • Custodial service locks some of the custodially-held funds of the customer/attacker for this payment.
  • The node HODLs the first sub-payment, but faills all subsequent sub-payments with WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS.
  • The custodial service sees the error and thinks all the sub-payments will fail, therefore the entire payment fails.
    • It therefore refunds the entire payment amount.
  • Custodial service reports to the user (attacker) that the payment failed and that the payment amount is still in their account.
  • The attacker node claims the single sub-payment it held onto.
  • Higher layers of the custodial service (e.g. the parts that handle the database of users and the amounts being held in custody on their behalf) might not notice that the partial payment was claimed, and thus will not update the custodial account balance.

Thus, it is required not to consider a payment as definitely failed until all sub-payments have failed. If we consider the payment as failed if some sub-payment is failed, then we risk falling victim to the above attack.

@ZmnSCPxj
Copy link
Collaborator

ZmnSCPxj commented Aug 24, 2020

@whitslack what you linked is not the same as MPP, incidentally. The current MPP system has the assumption that the invoice preimage is valuable (proof-of-payment). AMP does not have this assumption, but loses proof-of-payment completely (it is basically a multipath keysend payment, with the key being sent sharded over all splits).

@whitslack
Copy link
Collaborator

@ZmnSCPxj: In your attack scenario, all of the sub-payments are successfully routed all the way to the payee (the attacker), but the attacker chooses to reject some of them. Can the attack also succeed if the attacker does NOT learn of all of the sub-payments — i.e., if only some of the sub-payments route all the way to the attacker while others fail in mid-route due to channel capacity exhaustion or outstanding HTLC limits?

what you linked is not the same as MPP, incidentally.

Ahh! I was wondering why the "AMP" acronym was quietly replaced with "MPP." I was thinking that MPP was still atomic, so thank you for the clarification. I think this is a point that does not have enough visibility to the user community. I know for me personally, the atomicity guarantee is more important than proof of payment, as I'm nearly always paying payees whom I trust; it's the software between us that I don't trust.

@ZmnSCPxj
Copy link
Collaborator

Can the attack also succeed if the attacker does NOT learn of all of the sub-payments — i.e., if only some of the sub-payments route all the way to the attacker while others fail in mid-route due to channel capacity exhaustion or outstanding HTLC limits?

Yes.

I was thinking that MPP was still atomic, so thank you for the clarification. I think this is a point that does not have enough visibility to the user community. I know for me personally, the atomicity guarantee is more important than proof of payment, as I'm nearly always paying payees whom I trust; it's the software between us that I don't trust.

MPP is still atomic assuming you value the proof-of-payment. For example, in a reverse submarine swap / loop out / whatever the heck they call it these days.

The trust in the software can be increased by us reporting failure if and only if all parts are failures. In the case the payee is trying to abuse your trust, you would see the payment as stuck even if our software has given up paying. I am still trying to grok this part of the new paymod code. Maybe @cdecker can help.

ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 25, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
ZmnSCPxj added a commit to ZmnSCPxj/lightning that referenced this issue Aug 25, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
cdecker pushed a commit to ZmnSCPxj/lightning that referenced this issue Sep 9, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
rustyrussell pushed a commit to ZmnSCPxj/lightning that referenced this issue Sep 10, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
rustyrussell pushed a commit to rustyrussell/lightning that referenced this issue Sep 10, 2020
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
rustyrussell pushed a commit that referenced this issue Sep 10, 2020
… of HTLCs based on payee connectivity.

Fixes: #3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
vibhaa pushed a commit to spider-pcn/lightning that referenced this issue Mar 24, 2021
… of HTLCs based on payee connectivity.

Fixes: ElementsProject#3926

(probably)

Changelog-Fixed: pay: Also limit the number of splits if the payee seems to have a low number of channels that can enter it, given the max-concurrent-htlcs limit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants