Files
plugins/paytest/README.org
2021-02-11 13:29:37 +01:00

61 lines
2.6 KiB
Org Mode

#+TITLE: Paytest Plugin
A plugin to benchmark the performance of the ~pay~ plugin. It can
generate mock invoices for remote nodes, and it can hold on to
incoming test multi-part payments as if they were real payments.
🚧 This plugin is intended for LN developers. Use it at your own risk 👷
The plugin consists of three parts:
- ~testinvoice~: An RPC method to generate a fake invoice which
forces any payer to go through a specific node as penultimate hop
in the route. That node can then decode the onion and pretend it is
the real destination. The invoice is valid, however the
~payment_hash~ has no known preimage and can therefore not be
settled.
- An ~htlc_accepted~ hook that intercepts any HTLC resulting from a
remote ~testpay~ call, decodes the payload and pretends to be the
recipient, exercising the MPP aggregation logic.
- ~testpay~: A wrapper RPC method that takes generates a
~testinvoice~ and calls ~pay~ on it, triggering the
benchmarking. Upon receiving the result it re-interprets it
according to what we expect to happen
* Protocol
The protocol consists of a couple of conventions in order to correctly
test the pay process.
The sender always creates a test invoice, with a ~payment_hash~ that
it knows has no known preimage, and destined for a non-existent
~node_id~, but which includes a route-hint from the real destination
to the fake destination. The route-hint MUST use the short channel ID
~1x1x1~ for the channel, as this is how the recipient identifies that
this is a test-payment. In addition the other parameters in the route
hint SHOULD use minimal values in order not to interfere with the
testing (CLTV delta ~9~, base fee ~1~, proportional fee ~1~).
Since we are creating fake invoices for nodes that do not exist, and
with a ~payment_hash~ that the destination cannot settle we
re-interpret the following failure codes:
- ~16399~ / ~0x400f~ (~incorrect_or_unknown_payment_details~) is
considered to be a successful payment attempt, i.e., the
destination understood that this is a test payment, has held onto
incoming parts for up to 60 seconds, allowing them to accumulate, and
ultimately all parts reached the destination.
- ~23~ / ~0x0017~ (~mpp_timeout~) is considered a failed payment
attempt, i.e., the destination understood this is a test payment,
has helpd on to incoming parts for 60 seconds, but ultimately
failed to accumulate all parts of the payment.
- ~16394~ / ~0x400a~ (~unknown_next_peer~) signifies that the
destination did not understand the protocol, and the test
failed. This is the default behavior that nodes implement if this
plugin is not active.