<oembed><type>rich</type><version>1.0</version><author_name>npub19helcfnqgk2jrwzjex2aflq6jwfc8zd9uzzkwlgwhve7lykv23mq5zkvn4</author_name><author_url>https://nostr.ae/npub19helcfnqgk2jrwzjex2aflq6jwfc8zd9uzzkwlgwhve7lykv23mq5zkvn4</author_url><provider_name>njump</provider_name><provider_url>https://nostr.ae</provider_url><html>📅 Original date posted:2018-02-06&#xA;📝 Original message:&#xA;Hi Y&#39;all,&#xA;&#xA;A common question I&#39;ve seen concerning Lightning is: &#34;I have five $2&#xA;channels, is it possible for me to *atomically* send $6 to fulfill a&#xA;payment?&#34;. The answer to this question is &#34;yes&#34;, provided that the receiver&#xA;waits to pull all HTLC&#39;s until the sum matches their invoice. Typically, one&#xA;assumes that the receiver will supply a payment hash, and the sender will&#xA;re-use the payment hash for all streams. This has the downside of payment&#xA;hash re-use across *multiple* payments (which can already easily be&#xA;correlated), and also has a failure mode where if the sender fails to&#xA;actually satisfy all the payment flows, then the receiver can still just&#xA;pull the monies (and possibly not disperse a service, or w/e).&#xA;&#xA;Conner Fromknecht and I have come up with a way to achieve this over&#xA;Lightning while (1) not re-using any payment hashes across all payment&#xA;flows, and (2) adding a *strong* guarantee that the receiver won&#39;t be paid&#xA;until *all* partial payment flows are extended. We call this scheme AMP&#xA;(Atomic Multi-path Payments). It can be experimented with on Lightning&#xA;*today* with the addition of a new feature bit to gate this new&#xA;feature. The beauty of the scheme is that it requires no fundamental changes&#xA;to the protocol as is now, as the negotiation is strictly *end-to-end*&#xA;between sender and receiver.&#xA;&#xA;TL;DR: we repurpose some unused space in the onion per-hop payload of the&#xA;onion blob to signal our protocol (and deliver some protocol-specific data),&#xA;then use additive secret sharing to ensure that the receiver can&#39;t pull the&#xA;payment until they have enough shares to reconstruct the original pre-image.&#xA;&#xA;&#xA;Protocol Goals&#xA;==============&#xA;1. Atomicity: The logical transaction should either succeed or fail in&#xA;entirety. Naturally, this implies that the receiver should not be unable to&#xA;settle *any* of the partial payments, until all of them have arrived.&#xA;&#xA;2. Avoid Payment Hash Reuse: The payment preimages validated by the&#xA;consensus layer should be distinct for each partial payment.  Primarily,&#xA;this helps avoid correlation of the partial payments, and ensures that&#xA;malicious intermediaries straddling partial payments cannot steal funds.&#xA;&#xA;3. Order Invariance: The protocol should be forgiving to the order in which&#xA;partial payments arrive at the destination, adding robustness in the face of&#xA;delays or routing failures.&#xA;&#xA;4. Non-interactive Setup: It should be possible for the sender to perform an&#xA;AMP without directly coordinating with the receiving node. Predominantly,&#xA;this means that the *sender* is able to determine the number of partial&#xA;payments to use for a particular AMP, which makes sense since they will be&#xA;the one fronting the fees for the cost of this parameter. Plus, we can&#xA;always turn a non-interactive protocol into an interactive one for the&#xA;purposes of invoicing.&#xA;&#xA;&#xA;Protocol Benefits&#xA;=================&#xA;&#xA;Sending pay payments predominantly over an AMP-like protocol has several&#xA;clear benefits:&#xA;&#xA;  - Eliminates the constraint that a single path from sender to receiver&#xA;    with sufficient directional capacity. This reduces the pressure to have&#xA;    larger channels in order to support larger payment flows. As a result,&#xA;    the payment graph be very diffused, without sacrificing payment&#xA;    utility&#xA;&#xA;  - Reduces strain from larger payments on individual paths, and allows the&#xA;    liquidity imbalances to be more diffuse. We expect this to have a&#xA;    non-negligible impact on channel longevity. This is due to the fact that&#xA;    with usage of AMP, payment flows are typically *smaller* meaning that&#xA;    each payment will unbalance a channel to a lesser degree that&#xA;    with one giant flow.&#xA;&#xA;  - Potential fee savings for larger payments, contingent on there being a&#xA;    super-linear component to routed fees. It&#39;s possible that with&#xA;    modifications to the fee schedule, it&#39;s actually *cheaper* to send&#xA;    payments over multiple flows rather than one giant flow.&#xA;&#xA;  - Allows for logical payments larger than the current maximum value of an&#xA;    individual payment. Atm we have a (temporarily) limit on the max payment&#xA;    size. With AMP, this can be side stepped as each flow can be up the max&#xA;    size, with the sum of all flows exceeding the max.&#xA;&#xA;  - Given sufficient path diversity, AMPs may improve the privacy of LN&#xA;    Intermediaries are now unaware to how much of the total payment they are&#xA;    forwarding, or even if they are forwarding a partial payment at all.&#xA;&#xA;  - Using smaller payments increases the set of possible paths a partial&#xA;    payment could have taken, which reduces the effectiveness of static&#xA;    analysis techniques involving channel capacities and the plaintext&#xA;    values being forwarded.&#xA;&#xA;&#xA;Protocol Overview&#xA;==================&#xA;This design can be seen as a generalization of the single, non-interactive&#xA;payment scheme, that uses decoding of extra onion blobs (EOBs?) to encode&#xA;extra data for the receiver. In that design, the extra data includes a&#xA;payment preimage that the receiver can use to settle back the payment. EOBs&#xA;and some method of parsing them are really the only requirement for this&#xA;protocol to work. Thus, only the sender and receiver need to implement this&#xA;feature in order for it to function, which can be announced using a feature&#xA;bit.&#xA;&#xA;First, let&#39;s review the current format of the per-hop payload for each node&#xA;described in BOLT-0004.&#xA;&#xA;┌───────────────┬───────────────────┬────────────────┬───────────────────────┬─────────────────┬─────────────────┐&#xA;│Realm (1 byte) │Next Addr (8 bytes)│Amount (8 bytes)│Outgoing CLTV (4&#xA;bytes)│Unused (12 bytes)│ HMAC (32 bytes) │&#xA;└───────────────┴───────────────────┴────────────────┴───────────────────────┴─────────────────┴─────────────────┘&#xA;■────────────────────────────────────────────────────────────────────────────────────────────────────────────────■&#xA;                                              ┌─────────────────┐&#xA;                                              │65 Bytes Per Hop │&#xA;                                              └─────────────────┘&#xA;&#xA;Currently, *each* node gets a 65-byte payload. We use this payload to give&#xA;each node instructions on *how* to forward a payment. We tell each node: the&#xA;realm (or chain to forward on), then next node to forward to, the amount to&#xA;forward (this is where fees are extracted by forwarding out less than in),&#xA;the outgoing CLTV (allows verification that the prior node didn&#39;t modify any&#xA;values), and finally an HMAC over the entire thing.&#xA;&#xA;Two important points:&#xA;  1. We have 12 bytes for each hop that are currently unpurposed and can be&#xA;  used by application protocols to signal new interpretation of bytes and&#xA;  also deliver additional encrypted+authenticated data to *each* hop.&#xA;&#xA;  2. The protocol currently has a hard limit of 20-hops. With this feature&#xA;  we ensure that the packet stays fixed sized during processing in order to&#xA;  avoid leaking positional information. Typically most payments won&#39;t use&#xA;  all 20 hops, as a result, we can use the remaining hops to stuff in *even&#xA;  more* data.&#xA;&#xA;&#xA;Protocol Description&#xA;====================&#xA;The solution we propose is Atomic Multi-path Payments (AMPs). At a high&#xA;level, this leverages EOBs to deliver additive shares of a base preimage,&#xA;from which the payment preimages of partial payments can be derived. The&#xA;receiver can only construct this value after having received all of the&#xA;partial payments, satisfying the atomicity constraint.&#xA;&#xA;The basic protocol:&#xA;&#xA;Primitives&#xA;==========&#xA;Let H be a CRH function.&#xA;Let || denote concatenation.&#xA;Let ^ denote xor.&#xA;&#xA;&#xA;Sender Requirements&#xA;===================&#xA;The parameters to the sending procedure are a random identifier ID, the&#xA;number of partial payments n, and the total payment value V. Assume the&#xA;sender has some way of dividing V such that V = v_1 + … + v_n.&#xA;&#xA;To begin, the sender builds the base preimage BP, from which n partial&#xA;preimages will be derived. Next, the sender samples n additive shares s_1,&#xA;…, s_n, and takes the sum to compute BP = s_1 ^ … ^ s_n.&#xA;&#xA;With the base preimage created, the sender now moves on to constructing the&#xA;n partial payments. For each i in [1,n], the sender deterministically&#xA;computes the partial preimage r_i = H(BP ||  i), by concatenating the&#xA;sequence number i to the base preimage and hashing the result. Afterwards,&#xA;it applies H to determine the payment hash to use in the i’th partial&#xA;payment as h_i = H(r_i). Note that that with this preimage derivation&#xA;scheme, once the payments are pulled each pre-image is distinct and&#xA;indistinguishable from any other.&#xA;&#xA;With all of the pieces in place, the sender initiates the i’th payment by&#xA;constructing a route to the destination with value v_i and payment hash h_i.&#xA;The tuple (ID, n, s_i) is included in the EOB to be opened by the receiver.&#xA;&#xA;In order to include the three tuple within the per-hop payload for the final&#xA;destination, we repurpose the _first_ byte of the un-used padding bytes in&#xA;the payload to signal version 0x01 of the AMP protocol (note this is a PoC&#xA;outline, we would need to standardize signalling of these 12 bytes to&#xA;support other protocols). Typically this byte isn&#39;t set, so the existence of&#xA;this means that we&#39;re (1) using AMP, and (2) the receiver should consume the&#xA;_next_ hop as well. So if the payment length is actually 5, the sender tacks&#xA;on an additional dummy 6th hop, encrypted with the _same_ shared secret for&#xA;that hop to deliver the e2e encrypted data.&#xA;&#xA;Note, the sender can retry partial payments just as they would normal&#xA;payments, since they are order invariant, and would be indistinguishable&#xA;from regular payments to intermediaries in the network.&#xA;&#xA;&#xA;Receiver Requirements&#xA;=====================&#xA;&#xA;Upon the arrival of each partial payment, the receiver will iteratively&#xA;reconstruct BP, and do some bookkeeping to figure out when to settle the&#xA;partial payments. During this reconstruction process, the receiver does not&#xA;need to be aware of the order in which the payments were sent, and in fact&#xA;nothing about the incoming partial payments reveals this information to the&#xA;receiver, though this can be learned after reconstructing BP.&#xA;&#xA;Each EOB is decoded to retrieve (ID, n, s_i), where i is the unique but&#xA;unknown index of the incoming partial payment. The receiver has access to&#xA;persistent key-value store DB that maps ID to (n, c*, BP*), where c*&#xA;represents the number of partial payments received, BP* is the sum of the&#xA;received additive shares, and the superscript * denotes that the value is&#xA;being updated iteratively. c* and BP* both have initial values of 0.&#xA;&#xA;In the basic protocol, the receiver cache’s the first n it sees, and&#xA;verifies that all incoming partial payments have the same n. The receiver&#xA;should reject all partial payments if any EOB deviates.  Next, the we update&#xA;our persistent store with DB[ID] = (n, c* + 1, BP* ^ s_i), advancing the&#xA;reconstruction by one step.&#xA;&#xA;If c* + 1 &lt; n, there are still more packets in flight, so we sit tight.&#xA;Otherwise, the receiver assumes all partial payments have arrived, and can&#xA;being settling them back. Using the base preimage BP = BP* ^ s_i from our&#xA;final iteration, the receiver can re-derive all n partial preimages and&#xA;payment hashes, using r_i = H(BP || i) and h_i = H(r_i) simply through&#xA;knowledge of n and BP.&#xA;&#xA;Finally, the receiver settles back any outstanding payments that include&#xA;payment hash h_i using the partial preimage r_i. Each r_i will appear random&#xA;due to the nature of H, as will it’s corresponding h_i. Thus, each partial&#xA;payment should appear uncorrelated, and does not reveal that it is part of&#xA;an AMP nor the number of partial payments used.&#xA;&#xA;Non-interactive to Interactive AMPs&#xA;===================================&#xA;&#xA;Sender simply receives an ID and amount from the receiver in an invoice&#xA;before initiating the protocol. The receiver should only consider the&#xA;invoice settled if the total amount received in partial payments containing&#xA;ID matches or exceeds the amount specified in the invoice. With this&#xA;variant, the receiver is able to map all partial payments to a pre-generated&#xA;invoice statement.&#xA;&#xA;&#xA;Additive Shares vs Threshold-Shares&#xA;===================================&#xA;&#xA;The biggest reason to use additive shares seems to be atomicity. Threshold&#xA;shares open the door to some partial payments being settled, even if others&#xA;are left in flight. Haven’t yet come up with a good reason for using&#xA;threshold schemes, but there seem to be plenty against it.&#xA;&#xA;Reconstruction of additive shares can be done iteratively, and is win for&#xA;the storage and computation requirements on the receiving end. If the sender&#xA;decides to use fewer than n partial payments, the remaining shares could be&#xA;included in the EOB of the final partial payment to allow the sender to&#xA;reconstruct sooner. Sender could also optimistically do partial&#xA;reconstruction on this last aggregate value.&#xA;&#xA;&#xA;Adaptive AMPs&#xA;=============&#xA;&#xA;The sender may not always be aware of how many partial payments they wish to&#xA;send at the time of the first partial payment, at which point the simplified&#xA;protocol would require n to be chosen. To accommodate, the above scheme can&#xA;be adapted to handle a dynamically chosen n by iteratively constructing the&#xA;shared secrets as follows.&#xA;&#xA;Starting with a base preimage BP, the key trick is that the sender remember&#xA;the difference between the base preimage and the sum of all partial&#xA;preimages used so far. The relation is described using the following&#xA;equations:&#xA;&#xA;    X_0 = 0&#xA;    X_i = X_{i-1} ^ s_i&#xA;    X_n = BP ^ X_{n-1}&#xA;&#xA;where if n=1, X_1 = BP, implying that this is in fact a generalization of&#xA;the single, non-interactive payment scheme mentioned above. For i=1, ...,&#xA;n-1, the sender sends s_i in the EOB, and  X_n for the n-th share.&#xA;&#xA;Iteratively reconstructing s_1 ^ …. ^ s_{n-1} ^ X_n = BP, allows the&#xA;receiver to compute all relevant r_i = H(BP || i) and h_i = H(r_i). Lastly,&#xA;the final number of partial payments n could be signaled in the final EOB,&#xA;which would also serve as a sentinel value for signaling completion. In&#xA;response to DOS vectors stemming from unknown values of n, implementations&#xA;could consider advertising a maximum value for n, or adopting some sort of&#xA;framing pattern for conveying that more partial payments are on the way.&#xA;&#xA;We can further modify our usage of the per-hop payloads to send (H(BP),&#xA;s_i) to&#xA;consume most of the EOB sent from sender to receiver. In this scenario, we&#39;d&#xA;repurpose the 11-bytes *after* our signalling byte in the unused byte&#xA;section&#xA;to store the payment ID (which should be unique for each payment). In the&#xA;case&#xA;of a non-interactive payment, this will be unused. While for interactive&#xA;payments, this will be the ID within the invoice. To deliver this slimmer&#xA;2-tuple, we&#39;ll use 32-bytes for the hash of the BP, and 32-bytes for the&#xA;partial pre-image share, leaving an un-used byte in the payload.&#xA;&#xA;&#xA;Cross-Chain AMPs&#xA;================&#xA;&#xA;AMPs can be used to pay a receiver in multiple currencies atomically...which&#xA;is pretty cool :D&#xA;&#xA;&#xA;Open Research Questions&#xA;=======================&#xA;&#xA;The above is a protocol sketch to achieve atomic multi-path payments over&#xA;Lightning. The details concerning onion blob usage serves as a template that&#xA;future protocols can draw upon in order to deliver additional data to *any*&#xA;hop in the route. However, there are still a few open questions before&#xA;something like this can be feasibly deployed.&#xA;&#xA;1. How does the sender decide how many chunked payments to send, and the&#xA;size of each payment?&#xA;&#xA;  - Upon a closer examination, this seems to overlap with the task of&#xA;    congestion control within TCP. The sender may be able to utilize&#xA;    inspired heuristics to gauge: (1) how large the initial payment should&#xA;be&#xA;    and (2) how many subsequent payments may be required. Note that if the&#xA;    first payment succeeds, then the exchange is over in a signal round.&#xA;&#xA;2. How can AMP and HORNET be composed?&#xA;&#xA;  - If we eventually integrate HORNET, then a distinct communications&#xA;    sessions can be established to allow the sender+receiver to exchange&#xA;    up-to-date partial payment information. This may allow the sender to&#xA;more&#xA;    accurately size each partial payment.&#xA;&#xA;3. Can the sender&#39;s initial strategy be governed by an instance of the&#xA;Push-relabel max flow algo?&#xA;&#xA;4. How does this mesh with the current max HTLC limit on a commitment?&#xA;&#xA;   - ATM, we have a max limit on the number of active HTLC&#39;s on a particular&#xA;     commitment transaction. We do this, as otherwise it&#39;s possible that the&#xA;     transaction is too large, and exceeds standardness w.r.t transaction&#xA;     size. In a world where most payments use an AMP-like protocol, then&#xA;     overall ant any given instance there will be several pending HTLC&#39;s on&#xA;     commitments network wise.&#xA;&#xA;     This may incentivize nodes to open more channels in order to support&#xA;     the increased commitment space utilization.&#xA;&#xA;&#xA;Conclusion&#xA;==========&#xA;&#xA;We&#39;ve presented a design outline of how to integrate atomic multi-path&#xA;payments (AMP) into Lightning. The existence of such a construct allows a&#xA;sender to atomically split a payment flow amongst several individual payment&#xA;flows. As a result, larger channels aren&#39;t as important as it&#39;s possible to&#xA;utilize one total outbound payment bandwidth to send several channels.&#xA;Additionally, in order to support the increased load, internal routing nodes&#xA;are incensed have more active channels. The existence of AMP-like payments&#xA;may also increase the longevity of channels as there&#39;ll be smaller, more&#xA;numerous payment flows, making it unlikely that a single payment comes&#xA;across unbalances a channel entirely. We&#39;ve also showed how one can utilize&#xA;the current onion packet format to deliver additional data from a sender to&#xA;receiver, that&#39;s still e2e authenticated.&#xA;&#xA;&#xA;-- Conner &amp;&amp; Laolu&#xA;-------------- next part --------------&#xA;An HTML attachment was scrubbed...&#xA;URL: &lt;http://lists.linuxfoundation.org/pipermail/lightning-dev/attachments/20180206/8c4a40c4/attachment-0001.html&gt;</html></oembed>