- From: Melvin Carvalho <melvincarvalho@gmail.com>
- Date: Mon, 7 Jul 2025 09:51:08 +0200
- To: Michiel de Jong <michiel@unhosted.org>
- Cc: bipedaljoe <bipedaljoe@protonmail.com>, "public-interledger@w3.org" <public-interledger@w3.org>
- Message-ID: <CAKaEYh+4ricHKn_xH9GZC9WL+G2zS0uxkR35bjow++Ac=7r3nQ@mail.gmail.com>
čt 3. 7. 2025 v 11:22 odesílatel Michiel de Jong <michiel@unhosted.org> napsal: > Hi Johann, > > Thanks for posting this here! Let me try to provide my perspective on what > your recent work could mean for Interledger. For context, I worked on > Interledger in 2017 and 2018, I had some one-on-one conversations with > Johann about his work, and Johann and I shared a presentation slot at the > recent week-long https://www.collaborative-finance.net/ conference in > Austria (an awesome futurist gathering which more Interledger enthusiasts > should attend!). > > The way I see it (and this is also what I presented in the 7 minutes > before Johann's presentation > <https://www.youtube-nocookie.com/embed/ysUBs2ByuHo?playlist=ysUBs2ByuHo&autoplay=1&loop=0&start=565>) > there are 3 big issues in a system like interledger: > * discovery / routing / quoting > * cryptographic proof of delivery (e.g. hashlocks) > * guaranteed convergence (e.g. timeouts) > > Timeouts can work with: > * amicable resolution (when a multi-hop payment gets stuck, have a > conversation about it) > * referee (agree on a single source of truth that will decide whether the > payment went through or rolled back) > * staggered (stagger the timeout values of the hops, so each connector has > some extra time to try to commit their incoming hop after their outgoing > hop is committed) > > Within staggered timeouts there are a few options: > * connectors accept the risk and will sometimes lose significant amounts > of money if their outgoing hop is committed but they can't commit their > incoming one in time > * streaming (make the amounts small so the connector risk becomes more > manageable) > * gradual (this is Johann's new addition) > > With a gradual timeout, the connector risk is reduced to just small > amounts because if they are too late committing their incoming hop, it > doesn't time out entirely, but only partially. So for instance, if a > connector participates in a 100$ payment, and is slightly too late > committing their incoming payment, they will have paid the full 100$ > outgoing payment but only received for instance a 99$ incoming payment. > Their loss is just 1$ instead of the full 100$ transaction amount. > The network as a whole will still disagree on what happened to this > payment, but instead of the first nodes saying it rolled back and the later > nodes saying it committed, now all nodes will say the payment was at least > partially committed, but they disagree on what the amount of the payment > was committed (100$ or 99$). > > I think this is quite a genius innovation that I think none of us thought > about when we designed the Interledger protocol. We should consider if we > can add it as an optional extension, maybe. I guess it would have to be a > new packet type, similar to ILP Prepare, but instead of *expiresAt > <https://github.com/interledger/rfcs/blob/f7f54131033cd8dbf7ff15953f58337a0a03fa9f/asn1/InterledgerProtocol.asn#L21>* it > would have something like *startsExpiringAt* and then probably something > like a (linear?) *expirationRate* expressed in local amount per second or > something similar. > > The advantage of gradual timeouts is that they reduce the connector risk. > One disadvantage is (1) that (like in streaming payments), a sender can get > stuck having paid half the amount for for instance a purchase, and possibly > no way to pay the other half. Another disadvantage is that (2) part of the > money used in a multi-hop payment is potentially locked up for a long time > before it gets either rejected or fulfilled. > > I don't think there is an incentive for any connector or the receiver to > (2.1) fulfill late, because they will receive less than 100% of the money > that was sent. > Also, a prepared payment stops being attractive as (2.2) a free option on > arbitrage once part of it starts expiring. > However, (2.3) for senders that prepare many-hop payments and then let > them expire, with the goal of maliciously locking up liquidity at the > participating connectors, gradual timeouts will give a bigger impact than > immediate ones. > Also, (2.4) a connector may decide not to forward a reject message, or > forward it after a delay, to maliciously keep liquidity locked up for > longer than necessary at preceding connectors, and (2.5) in the prepare > phase (step 4 in the ILP packet lifecycle > <https://interledger.org/developers/rfcs/interledger-protocol/>) a > connector may decide not to forward the prepare message, and then it should > immediately send back a reject message, but it could of course do this > slowly or not at all, to maliciously lock up liquidity at preceding hops. > > In addition to proposing gradual timeouts, Johann proposes the addition of > a third phase. I must say I don't think I understand it fully, but I think > it's a mitigation for gradual timeouts disadvantage (2.5) mentioned above. > It cleverly makes sure that before the prepare phase starts, each > participating connector already has some skin in the game. > > In a first phase preceding the 'prepare' phase, all hops already reserve > funds for the entire path, but the prepare phase is not yet entered. > If funds are reserved all the way to the receiver, then the receiver sends > an out-of-band message to the sender, confirming this. > This means that at this point: > * the sender has outgoing funds reserved > * each connector sees incoming funds reserved and has outgoing funds > reserved > * the receiver sees incoming funds reserved > > There are no connectors that see incoming funds reserved but don't also > have their own skin in the game by having their own outgoing funds reserved. > Therefore, it is now safe to enter the Prepare phase without worrying > about disadvantage (2.5). > > This preceding liquidity reservation phase also has a timeout, so if the > sender never follows up with a Prepare message, then they should send a > cancel message, to cancel everything, or otherwise, they will start to be > on the hook for a percentage of the transfer amount. This is similar to the > gradual timeout but it acts with the opposite effect: instead of gradually > rejecting, it gradually executes the payment. > > I think Johann's three-phase commit would require us to add quite a few > things: > * two additional message types, > * the additional requirement of out-of-band communication between sender > and receiver, > * a mechanism to link the various new message types to each other > * and to the sender's identity, and > * some additional threat model analysis around different ways the sender, > connectors and receiver could try to game the system. > > So I don't think it would be as easy to add as the gradual timeouts by > themselves. Having said that, I do think it is very clever in how it > addresses disadvantage (2.5) of gradual payments. > > Looking forward to more discussion about this! > Hi Michiel and Johann, Thanks for the insightful discussion on gradual timeouts and the 3-phase commit. It's sparked some thoughts on practical prototyping. I'm thinking about many small, independent ledgers living within Solid (or linkedwebstorage [1]) pods, secured by did:nostr [2] identities. On top of this, I'm proposing we introduce an acl:paymentRequired predicate in WebACL [3] for certain Solid resources. Access would then require a payment. This setup would let us model payment commitments: Simple IOUs and Clearing: Start with basic IOU transfers between these Solid-hosted ledgers, followed by simple clearing. Two-Phase Commits: Then, implement 2-phase commits (cancel or finish on timeout) for these IOU payments to observe penalties and consistency. Three-Phase Commits: Finally, tackle Johann's 3-phase commit within this framework, experimenting with pre-reservation and gradual execution/rejection. I believe this approach offers a powerful testbed, using Solid for data and did:nostr for identity, directly prototyping your discussed payment coordination challenges. Looking forward to your thoughts! Melvin [1] https://linkedwebstorage.com/ [2] https://nostrcg.github.io/did-nostr/ > > > Cheers, > Michiel de Jong > Independent programmer > > > > > On Fri, 27 Jun 2025 at 16:35, bipedaljoe <bipedaljoe@protonmail.com> > wrote: > >> The logical solution to multi-hop payment coordination was invented by me >> this spring and presented in Austria last week: >> https://youtu.be/DVjMis02AE8 >> >> In the history of ideas, it continuous on the same "root" that >> Interledger "stream payments" has evolved from. >> >> This root is a "cancel-on-timeout" 2-phase commit. It always introduces a >> penalty (as does the "finish-on-timeout" 2-phase commit), and the logical >> next step is to reduce the size of this penalty (so that an innocent person >> does not get stuck with it). "Stream payments" from Interledger achieves >> this, but, introduces a new attack vector (*very easy* to cause payment >> to fail halfway), is limited in how well it can scale (the more you reduce >> penalty size, the more packages you need to send, thus the more messages you >> have to use). I.e., "stream payments" get *slower* and more resource >> demanding as they scale towards shrinking penalty size. The other approach >> was what Ryan Fugger suggested in 2006: shrink the size of the penalty >> itself. This leads to another problem: the full duration until payment >> times out gets very long, thus undermining the timeout as a solution to >> payment getting stuck and requiring penalty to enforce on all phases, but >> either 2-phase only has penalty on one phase, and by combining both 2-phase >> commits into a 3-phase commit you solve that problem. >> >> I would be very happy to work with Interledger to perfect it with the >> 3-phase commit. The invention is open source and public domain and anyone >> can own it for yourself so you also do not need to work with me. >> >> *Illustrations: *https://ripple.archi/3phase.pdf >> *Full implementation of Ripple:* >> http://bitbucket.org/bipedaljoe/ripple-normal >> *Interactive simulation:* https://multihop.xyz/?view=sim >> >> As for the critique of "stream payments", many have critiqued those and >> Stefan Thomas himself has said he sometimes wonder if they are the right >> solution, and well, they are not, *but*, they were a fairly OK attempt (*and >> they do work better for settlement only as in the LedgerLoops project as >> there a failure half-way does not matter!*)*.* But with the 3-phase >> commit as a *perfect solution* it is probably far superior also for >> settlement-only type systems (as less overhead with messages... faster and >> less resource demanding...) >> >> *"Why are we talking about packetization? So this is obviously a very >> technical topic and I know this, not everyone in this audience is extremely >> technical, but I still thought it was a good topic for this keynote. The >> reason is that its a topic that comes up over and over again, both when I >> talk to people who have never head to Interledger, as soon as they learn >> about packetization and that its a key aspect of Interledger, they sort of >> wonder why, it seems very cumbersome and why are we doing this. And then >> the same things goes for people who have been working with the protocol, >> you know there's papers that gets written where its like "hey should we >> really be using packetization", and, you know, don't tell anyone but even i >> myself sometimes wonder like is this the right path. " -How I Learned to >> Love Packetization - Stefan Thomas, 05:00-05:50, >> https://youtu.be/LoZ2eWA1bUs?si=hKLFdurfdVa3oPHh&t=300 >> <https://youtu.be/LoZ2eWA1bUs?si=hKLFdurfdVa3oPHh&t=300>* >> >> >> Peace, Johan >> >> Sent with Proton Mail <https://proton.me/mail/home> secure email. >> >
Received on Monday, 7 July 2025 07:51:25 UTC