Hi Greg, > Feel free to assume that we've worked around mempool pinning for all of > these discussions, otherwise we're pretty hosed regardless. I'm implicitly > assuming V3+ephemeral anchors, which disallows batched bumps, for example. > You'll need to give some room for "slippage", but I think > shared_delay/2*shared_delay is going to end up dominating UX in any > non-layered scheme.
I think I was making the same assumption of V3+ephemeral anchors, and effectively disabling batching removes the known case of "commitment cat-and-mouse" attack, where a counterparty goes to confirm the commitment one by one to break the validity of the common CPFP. However, I wonder if there is not another attack case, see my other "update overflow" mail, and I don't think it qualifies as a pinning here! > This architecture doesn't suffer from 2*self_delay, and each transition > aside from Slow/Settle/SX.y has no relative timelock so that relative > timelock is all that matters. It does introduce a watchtower cycle, so it's > not longer a one-shot architecture, or even k-shot exactly, it ends up > looking like vanilla eltoo for that single path. Here I think my understanding is aligned, the watchtower cycle ends up looking more like the update phase of vanilla eltoo. Antoine Le jeu. 8 déc. 2022 à 15:28, Greg Sanders <gsander...@gmail.com> a écrit : > Antoine, > > > While the 2*to_self_delay sounds the maximum time delay in the state > publication scenario where the cheating counterparty publishes a old state > then the honest counterparty publishes the latest one, there could be the > case where the cheating counterparty broadcast chain of old states, up to > mempool's `limitancestorcount`. However, this chain of eltoo transactions > could be replaced by the honest party paying a higher-feerate (assuming > something like nversion=3). I think there might still be an attack > triggerable under certain economic conditions, where the attacker overbids > with the higher-feerate transaction until the HTLC cltv expires. If this > attack is plausible, it could be even opportun if you're batching against > multiple channels, where the victims are not able to coordinate response. > > Feel free to assume that we've worked around mempool pinning for all of > these discussions, otherwise we're pretty hosed regardless. I'm implicitly > assuming V3+ephemeral anchors, which disallows batched bumps, for example. > You'll need to give some room for "slippage", but I think > shared_delay/2*shared_delay is going to end up dominating UX in any > non-layered scheme. > > > I wonder if the introduction of watchtower specific transactions doesn't > break the 2*to_self_delay assumption > > This architecture doesn't suffer from 2*self_delay, and each transition > aside from Slow/Settle/SX.y has no relative timelock so that relative > timelock is all that matters. It does introduce a watchtower cycle, so it's > not longer a one-shot architecture, or even k-shot exactly, it ends up > looking like vanilla eltoo for that single path. > > Cheers, > Greg > > On Thu, Dec 8, 2022 at 2:14 PM Antoine Riard <antoine.ri...@gmail.com> > wrote: > >> Hi AJ, >> >> The eltoo irc channel is ##eltoo on Libera chat. >> >> > - 2022-10-21, eltoo/chia: >> https://twitter.com/bramcohen/status/1583122833932099585 >> >> On the eltoo/chia variant, from my (quick) understanding, the main >> innovation aimed for is the limitation of the publication of eltoo states >> more than once by a counterparty, by introducing a cryptographic puzzle, >> where the witness can be produced once and only once ? I would say you >> might need the inheritance of the updated scriptpubkey across the chain of >> eltoo states, with a TLUV-like mechanism. >> >> > The basic idea is "if it's a two party channel with just Alice and Bob, >> > then if Alice starts a unilateral close, then she's already had her say, >> > so it's only Bob's opinion that matters from now on, and he should be >> > able to act immediately", and once it's only Bob's opinion that matters, >> > you can simplify a bunch of things. >> >> From my understanding, assuming Eltoo paper terminology, Alice can >> publish an update K transaction, and then after Bob can publish an update >> transaction K<N or Alice can publish the settlement transaction N, or Bob >> can publish an update transaction N. The main advantage of this >> construction I can see is a strict bound on the shared_delay encumbered in >> the on-chain publication of the channel ? >> >> > fast forwards: we might want to allow our channel partner >> > to immediately rely on a new state we propose without needing a >> > round-trip delay -- this potentially makes forwarding payments much >> > faster (though with some risk of locking the funds up, if you do a >> > fast forward to someone who's gone offline) >> >> IIRC, there has already been a "fast-forward" protocol upgrade proposal >> based on update-turn in the LN-penalty paradigm [0]. I think reducing the >> latency of HTLC propagation across payment paths would constitute a UX >> improvement, especially a link-level update mechanism upgrade deployment >> might be incentivized by routing algorithms starting to penalize routing >> hops HTLC relay latency. What is unclear is the additional risk of locking >> the funds up. If you don't receive acknowledgement the fast forward state >> has been received, you should still be able to exit with the state N-1 ? >> However, the fast-forward trade-off might sound acceptable, with time you >> might expect reliable routing hops in the core of the graph, and flappy >> spokes at the edge. >> >> > doubled delays: once we publish the latest state we can, we want to >> > be able to claim the funds immediately after to_self_delay expires; >> > however if our counterparty has signatures for a newer state than we >> > do (which will happen if it was fast forwarded), they could post that >> > state shortly before to_self_delay expires, potentially increasing >> > the total delay to 2*to_self_delay. >> >> While the 2*to_self_delay sounds the maximum time delay in the state >> publication scenario where the cheating counterparty publishes a old state >> then the honest counterparty publishes the latest one, there could be the >> case where the cheating counterparty broadcast chain of old states, up to >> mempool's `limitancestorcount`. However, this chain of eltoo transactions >> could be replaced by the honest party paying a higher-feerate (assuming >> something like nversion=3). I think there might still be an attack >> triggerable under certain economic conditions, where the attacker overbids >> with the higher-feerate transaction until the HTLC cltv expires. If this >> attack is plausible, it could be even opportun if you're batching against >> multiple channels, where the victims are not able to coordinate response. >> >> > penalties: when you do a unilateral close, attempting to cheat comes >> > with no cost to you and a possible benefit if you succeed, but >> > potentially does cost your channel partner (either in forcing them >> > to spend on-chain fees to update to the correct state, or in the risk >> > of loss if their node malfunctions occassionally) -- a penalty could >> > reduce this incentive to cheat >> >> I think there has been a proposal in the past to enable penalties on top >> of symmetric states by leveraging asymmetric witnesses [1]. Further, I >> wonder if there is a game-theory interest for penalty-on-top-eltoo, it >> could be an incentive against laziness, where a dysfunctional trusted >> watchtower broadcasts an old state. On the qualification of the game-theory >> soundness, I think one would have to run the empirical case study: select >> channel counterparties randomly (no out-of-band assumptions), one set with >> eltoo+penalty and the other with vanilla eltoo, observe the broadcast of >> revoked states over some period. >> >> > trustless watchtowers: we may want to consider the possibility of a >> > watchtower holding onto obsolete states and colluding with an >> > attacker to attempt to cheat us >> >> In terms of pinning and other mempool games, I think honest participant >> own states leveraged by a colluding watchtower might increase the attack >> surface, especially post-anchor with the SIGHASH_SINGLE malleability on >> second-stage HTLC transactions. >> >> > (I think for initial eltoo experimentation it doesn't make sense to try >> to >> > deal with all (or perhaps any) of those constraints; simple and working >> > is better than complex and theoretical. But having them written down so >> > the ideas can be thought about and looked up later still seems useful) >> >> I share the belief -- "simple and working" enable shorter iteration >> cycles and hopefully fasten the protocol design learning curve. Beyond, I >> think it's also realistic in face of the state of the LN ecosystem, >> especially on the watchtower issue. AFAICT, there is no even multi trusted >> watchtower design covering the full execution of the protocol (i.e >> including HTLC-preimage/ HTLC-timeout claim), and such implementation is >> far from simple, as from now on you LN's chain backend might have >> asynchronicity issue to solve between your on-chain monitoring state >> machine (at least speaking in knowledge of the LDK-architecture). >> >> > * WA.n, WB.n : watchtower update to state n >> > - this is for an untrusted watchtower to correct attempted cheating >> > by Bob on behalf of Alice (or vice-versa). Spends UB.k or WA.k >> > (or UA.k/WB.k) respectively, provided k < n. >> >> I wonder if the introduction of watchtower specific transactions doesn't >> break the 2*to_self_delay assumption (iiuc it's a design goal of current >> protocol) and what is the design rationale. Beyond that, there is a concern >> with watchtower-specific transactions, it might leak your towers topology >> (i.e the number of them and the distribution in the p2p network) to an >> adversary. >> >> > * SA.n, SB.n : slowly claim funds according to state n >> > - this is for Alice to claim her funds if Bob is completely offline >> > (or vice-versa). Spends UA.n, UB.n, WA.n or WB.n with relative >> > timelock of to_self_delay. >> >> If I'm following correctly the description, this is logically equivalent >> to the sweep of a `to_local`/`to_remote` output on a commitment transaction >> though instead the waiting delay is eltoo shared_delay. There is no >> to_self_delay, at the punishment seems only to happen on the update-level, >> or maybe one should be also able to punish slow fund exit, and another >> relative locktime should exist on the S* transactions. >> >> > * Alice and Bob's watchtower collude, but Bob has many watchtowers: >> > >> > F -> UA.k1 -> WB.k2 -> WB.n -> (to_self_delay) -> SA.n -> money >> >> Could the punishment transactions R* be also delegated to watchtowers, >> assuming they have been pre-signed to lockdown the exit scriptpubkeys ? >> >> > In order to allow fast-forwards, when Alice proposes a new state, >> > she needs to send her partial signatures to allow Bob to unilaterally >> > accept the new state, ie sigs for: UB.n, CB.n, SB.n, RB.n. But she >> > also needs to be able to claim the funds if Bob proposes the new state >> > and broadcasts UB.n, she needs to be able broadcast CA.n. This can be >> > achieved with an adaptor signature approach (spelt out a bit more fully >> > in the gist) or a CTV-like approach, provided that UB.n reveals the >> > state needed to calculate the the CTV commitment (see "EXPR_SETTLE" in >> > >> https://github.com/instagibbs/bolts/blob/29fe6d36cbad4101d5ec76c2b19c83c1494ac2fc/XX-eltoo-transactions.md >> ). >> >> If you would like to have fast forward of chain of transactions, I wonder >> if there could be also the "sig-in-the-script" trick, where UB.n >> scriptpubkey (or one of its tapscripts) contains the signature for CB.n, >> SB.n, RB.n. Though you might have an issue of re-generating the >> witnessscript in case of state loss. >> >> > * how to add fees -- the U/W transactions are 1-in/1-out transactions >> > that can't be trivially CPFPed by the proposer and need to have >> > fees added (either SINGLE/ANYONECANPAY signatures or having a 0-sat >> > ephemeral output and package relay might be workable); the C/S/R >> > transactions are 1-in/many-out transactions, but have balance outputs >> > that can be immediately spent to pay for fees via CPFP if package >> > relay is available. >> >> Assuming something like nversion=3, the SINGLE/ANYONCANPAY could be a >> viable fee-bumping mechanism, as ancestor-based pinning should be less of a >> concern. Ephemeral anchor output could be a more efficient direction, if >> the output value can be cooperatively inflated from the channel value, >> rather than relying on external fee-bumping reserves. I think even more >> efficient fee-bumping primitives can be introduced later. >> >> > * how to pay watchtowers -- when a watchtower broadcasts a W >> > transaction, it needs to add fees, and it's not clear (to me) how it >> > could fairly and reliably ensure it's compensated for those costs, >> > particularly if multiple W transactions are broadcast for a single >> > unilateral close attempt, due to one or more watchtowers colluding >> > with an attacker, or simply having out of date information. >> >> I wonder if paying a watchtower, or getting paid as a watchtower isn't a >> "counterparty risk" similar to what is happening with jamming due to >> non-covered HTLC forward risk. The watchtower has the risk of not being >> paid a posteriori and the user has the risk of the tower not acting. There >> is even a trade-off between tower costs and safety, as the more towers you >> have, more robust if your Lightning channel (in theory, as you also have a >> duplication of the key material). >> >> > * lack of layered transactions -- while this prevents you having to >> > wait longer than to_self_delay before you can claim channel funds, >> > it still means that any htlc that is going to timeout sooner than that >> > may not be claimable on-chain, meaning you need to set >> > cltv_expiry_delta >= to_self_delay. >> >> From a security perspective, offsetting the cltv_expiry_delta to a value >> superior to to_self_delay can be considered as an improvement, especially >> if it gradually does it network-wide. On the other hand, if routing >> algorithms start to penalize long-cltv-delta payment paths as the timevalue >> of liquidity is priced in routing fees, this design rationale might not be >> aligned with long-term LN network incentives (as of today even more >> loosely-defined than miner incentives). >> >> > * extending to multiparty channels -- penalising is hard if there's >> > more than two parties, fast forwards are probably impossible since >> > you need multiple round-trips to coordinate signatures anyway, and if >> > you're doing channels-within-channels to reduce your n-party channel >> > to an easier to update 2-party channel you're probably forced to have >> > to_self_delay for each layer of channels. Also, just figuring out how >> > to coordinate multiparty state updates and even keeping everyone in >> > a multiparty channel online consistently to generate new signatures >> > seems potentially hard? >> >> I don't know if penalising has been a solved issue for mulit-party, at >> least in a trustless fashion in the same way we have with 2-party >> LN-penalty (you could devise weird scheme based on timelock, taproot tree >> and threshold signatures incentivizing towards the convergence of a >> "consensus" punishment, still...) Figuring out coordinating multi-party >> states updates sounds workable with modern consensus algorithms (e.g Raft), >> though still conserving the fast forward effect is a high bar, it might be >> better deferred to an uplifted layer of 2-of-2 LN channels. The only reason >> you might have payments at the multi-party level (with the signature of the >> N-of-N participants requested) only for privacy or liquidity allocation >> reason. Though effectively, it sounds like your multiparty >> channel coordination mechanism should encompass party eviction or >> partitioning the offline parties. One or two orders of magnitude of >> complexity beyond the 2-party eltoo channel case, I think. >> >> Antoine >> >> [0] https://github.com/lightning/bolts/pull/867 >> [1] https://github.com/LLFourn/witness-asymmetric-channel >> >> Le mer. 7 déc. 2022 à 00:36, Anthony Towns <a...@erisian.com.au> a écrit : >> >>> Hi all, >>> >>> On the eltoo irc channel we discussed optimising eltoo for the 2-party >>> scenario; figured it was probably worth repeating that here. >>> >>> This is similar to: >>> >>> - 2018-07-18, simplified eltoo: >>> https://lists.linuxfoundation.org/pipermail/lightning-dev/2018-July/001363.html >>> - 2021-09-17, IID 2Stage, >>> https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-September/019470.html >>> - 2022-09-29, Daric: https://eprint.iacr.org/2022/1295 >>> - 2022-10-21, eltoo/chia: >>> https://twitter.com/bramcohen/status/1583122833932099585 >>> >>> The basic idea is "if it's a two party channel with just Alice and Bob, >>> then if Alice starts a unilateral close, then she's already had her say, >>> so it's only Bob's opinion that matters from now on, and he should be >>> able to act immediately", and once it's only Bob's opinion that matters, >>> you can simplify a bunch of things. >>> >>> A "gist" for this idea is >>> https://gist.github.com/ajtowns/53e0f735f4d5c06a681429d937200aa5 (it >>> goes into a little more detail in places, though doesn't cover trustless >>> watchtowers at all). >>> >>> >>> >>> In particular, there are a few practical constraints that we might like >>> to consider for 2-party channels with eltoo: >>> >>> - fast forwards: we might want to allow our channel partner >>> to immediately rely on a new state we propose without needing a >>> round-trip delay -- this potentially makes forwarding payments much >>> faster (though with some risk of locking the funds up, if you do a >>> fast forward to someone who's gone offline) >>> >>> - doubled delays: once we publish the latest state we can, we want to >>> be able to claim the funds immediately after to_self_delay expires; >>> however if our counterparty has signatures for a newer state than we >>> do (which will happen if it was fast forwarded), they could post that >>> state shortly before to_self_delay expires, potentially increasing >>> the total delay to 2*to_self_delay. >>> >>> - penalties: when you do a unilateral close, attempting to cheat comes >>> with no cost to you and a possible benefit if you succeed, but >>> potentially does cost your channel partner (either in forcing them >>> to spend on-chain fees to update to the correct state, or in the risk >>> of loss if their node malfunctions occassionally) -- a penalty could >>> reduce this incentive to cheat >>> >>> - trustless watchtowers: we may want to consider the possibility of a >>> watchtower holding onto obsolete states and colluding with an >>> attacker to attempt to cheat us >>> >>> What follows is a rough approach for dealing with all those issues for >>> two-party channels. It's spelled out in a little more detail in the gist. >>> >>> (I think for initial eltoo experimentation it doesn't make sense to try >>> to >>> deal with all (or perhaps any) of those constraints; simple and working >>> is better than complex and theoretical. But having them written down so >>> the ideas can be thought about and looked up later still seems useful) >>> >>> In more detail: unilateral closes are handled by each channel participant >>> maintaining five transactions, which we'll call: >>> >>> * UA.n, UB.n : unilaterally propose closing at state n >>> - this is for Alice or Bob to spend the funding tx for a unilater >>> close to state n. Spends the funding transaction. >>> >>> * WA.n, WB.n : watchtower update to state n >>> - this is for an untrusted watchtower to correct attempted cheating >>> by Bob on behalf of Alice (or vice-versa). Spends UB.k or WA.k >>> (or UA.k/WB.k) respectively, provided k < n. >>> >>> * CA.n, CB.n : cooperatively claim funds according to state n >>> - this is for Alice to confirm Bob's unilateral close (or vice-versa). >>> Spends UB.k, WA.k (or UA.k/WB.k respectively), provided k <= n >>> >>> * SA.n, SB.n : slowly claim funds according to state n >>> - this is for Alice to claim her funds if Bob is completely offline >>> (or vice-versa). Spends UA.n, UB.n, WA.n or WB.n with relative >>> timelock of to_self_delay. >>> >>> * RA.n, RB.n : claim funds with penalty after unilateral close to >>> revoked state >>> - this is for Alice to update the state if Bob attempted to cheat >>> (or vice-versa). Spends UB.k or WA.k (or UA.k/WB.k respectively) >>> conditional on k < n - 1; outputs are adjusted to transfer a fixed >>> penalty of penalty_msat from Bob's balance to Alice's (or >>> vice-versa) >>> >>> Each of these "transactions" requires a pre-signed signature; however >>> the actual transaction/txid will vary in cases where a transaction has >>> the possibility of spending different inputs (eg "Spends UB.k or WA.k"). >>> In particular UA.n/UB.n can be constructed with known txids and non-APO >>> signatures but WA.n/WB.n/CA.n/CB.n/SA.n/SB.n/RA.n/RB.n all require >>> APO signatures. >>> >>> They're named such that Alice can immediately broadcast all the *A.n >>> transactions (provided a tx that it can spend has been broadcast) and >>> Bob can likewise immediately broadcast all the *B.n transactions. >>> >>> Scenarios where Alice decides to unilaterally close the channel might >>> look like: >>> >>> * if Alice/Bob can't communicate directly, but both are online: >>> >>> F -> UA.n -> CB.n -> money >>> >>> (balances and htlcs claimed, no delay) >>> >>> * if Bob has gone offline entirely: >>> >>> F -> UA.n -> (to_self_delay) -> SA.n -> money >>> >>> * Alice cheats, Bob punishes: >>> >>> F -> UA.k -> RB.n -> money[Alice pays Bob penalty] >>> >>> * Bob is offline, Alice cheats, but Bob has a watchtower: >>> >>> F -> UA.k -> WB.n -> (to_self_delay) -> SA.n -> money >>> >>> * Alice and Bob's watchtower collude, but Bob's not offline: >>> >>> F -> UA.k1 -> WB.k2 -> RB.n -> money[Alice pays Bob penalty] >>> >>> * Alice and Bob's watchtower collude, but Bob has many watchtowers: >>> >>> F -> UA.k1 -> WB.k2 -> WB.n -> (to_self_delay) -> SA.n -> money >>> >>> For Alice to successfully cheat, she needs Bob to be offline for at least >>> to_self_delay, and for all Bob's watchtowers to either also be offline, >>> or colluding. >>> >>> This can be simplified somewhat, if you don't care about all the >>> features: >>> >>> * If you don't care about trustless watchtowers you can drop WA.n/WB.n >>> (and simplify SA.n/SB.n to not require an APO signature) >>> >>> * If you don't care about penalties you can set penalty_msat to 0 and >>> allow RA.n/RB.n to spend k<=n. In this case, you can either drop >>> CA.n/CB.n entirely, or you can have CA.n/CB.n only be used for >>> directly >>> spending of UB.n/UA.n and thus not require APO signatures >>> >>> In order to allow fast-forwards, when Alice proposes a new state, >>> she needs to send her partial signatures to allow Bob to unilaterally >>> accept the new state, ie sigs for: UB.n, CB.n, SB.n, RB.n. But she >>> also needs to be able to claim the funds if Bob proposes the new state >>> and broadcasts UB.n, she needs to be able broadcast CA.n. This can be >>> achieved with an adaptor signature approach (spelt out a bit more fully >>> in the gist) or a CTV-like approach, provided that UB.n reveals the >>> state needed to calculate the the CTV commitment (see "EXPR_SETTLE" in >>> >>> https://github.com/instagibbs/bolts/blob/29fe6d36cbad4101d5ec76c2b19c83c1494ac2fc/XX-eltoo-transactions.md >>> ). >>> >>> Note that in this scenario Alice doesn't provide WB.n to Bob >>> immediately. This is okay, as if Alice proposes UA.(n-1) (her most >>> recent state), Bob can still immediately claim via CA.n. If Bob did have >>> WB.n; then if Alice proposed UA.(n-1) Bob could wait for an initial >>> to_self_delay period and broadcast WB.n, forcing Alice to wait for an >>> additional to_self_delay before being able to claim her funds via SA.n. >>> >>> Note also that this is why RA.n/RB.n require "k < n - 1" -- otherwise >>> Alice would only be able to broadcast UA.(n-1) and Bob would immediately >>> be able to penalise by broadcasting RB.n. >>> >>> Note that if you're using a watchtower and wish to punish your >>> counterparty if it attempts to cheat, you should only pass WA.(n-2) >>> to your watchtowers, not WA.(n-1) or WA.n. >>> >>> >>> >>> This doesn't address any potential issues from: >>> >>> * how to add fees -- the U/W transactions are 1-in/1-out transactions >>> that can't be trivially CPFPed by the proposer and need to have >>> fees added (either SINGLE/ANYONECANPAY signatures or having a 0-sat >>> ephemeral output and package relay might be workable); the C/S/R >>> transactions are 1-in/many-out transactions, but have balance outputs >>> that can be immediately spent to pay for fees via CPFP if package >>> relay is available. >>> >>> * how to pay watchtowers -- when a watchtower broadcasts a W >>> transaction, it needs to add fees, and it's not clear (to me) how it >>> could fairly and reliably ensure it's compensated for those costs, >>> particularly if multiple W transactions are broadcast for a single >>> unilateral close attempt, due to one or more watchtowers colluding >>> with an attacker, or simply having out of date information. >>> >>> * lack of layered transactions -- while this prevents you having to >>> wait longer than to_self_delay before you can claim channel funds, >>> it still means that any htlc that is going to timeout sooner than that >>> may not be claimable on-chain, meaning you need to set >>> cltv_expiry_delta >= to_self_delay. >>> >>> * extending to multiparty channels -- penalising is hard if there's >>> more than two parties, fast forwards are probably impossible since >>> you need multiple round-trips to coordinate signatures anyway, and if >>> you're doing channels-within-channels to reduce your n-party channel >>> to an easier to update 2-party channel you're probably forced to have >>> to_self_delay for each layer of channels. Also, just figuring out how >>> to coordinate multiparty state updates and even keeping everyone in >>> a multiparty channel online consistently to generate new signatures >>> seems potentially hard? >>> >>> Cheers, >>> aj >>> _______________________________________________ >>> Lightning-dev mailing list >>> Lightning-dev@lists.linuxfoundation.org >>> https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev >>> >> _______________________________________________ >> Lightning-dev mailing list >> Lightning-dev@lists.linuxfoundation.org >> https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev >> >
_______________________________________________ Lightning-dev mailing list Lightning-dev@lists.linuxfoundation.org https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev