OK, draft is up: https://github.com/lightningnetwork/lightning-rfc/pull/867
I have to actually implement it now (though the real win comes from making it compulsory, but that's a fair way away). Notably, I added the requirement that update_fee messages be on their own. This means there's no debate on the state of the channel when this is being applied. Cheers, Rusty. Rusty Russell <ru...@rustcorp.com.au> writes: > Matt Corallo <lf-li...@mattcorallo.com> writes: >>> On Apr 24, 2021, at 01:56, Rusty Russell <ru...@rustcorp.com.au> wrote: >>> >>> Matt Corallo <lf-li...@mattcorallo.com> writes: >>>> Somehow I missed this thread, but I did note in a previous meeting - these >>>> issues are great fodder for fuzzing. We’ve had a fuzzer which aggressively >>>> tests for precisely these types of message-non-delivery-and-resending >>>> production desync bugs for several years. When it initially landed it >>>> forced several rewrites of parts of the state machine, but quickly >>>> exhausted the bug fruit (though catches other classes of bugs occasionally >>>> as well). The state machine here is really not that big - while I agree >>>> simplifying it where possible is nice, ripping things out to replace them >>>> with fresh code (which would need similar testing) is probably not the >>>> most obvious decrease in complexity. >>> >>> It's historically had more bugs than anything else in the protocol. We >>> literally found another one in feerate negotiation since the last >>> c-lightning release :( >>> >>> I'd rather not have bugs than try to catch them all. >> >> I promise it’s much less work than it sounds like, and avoids having to >> debug these things based on logs, which is a huge pain :). Definitely less >> work than a new state machine:). > > But the entire point of this proposal is that it's a subset of the > existing state machine? > >>> You could propose a splice (or update to anchors, or whatever) any time >>> when it's your turn, as long as you haven't proposed any other updates. >>> That's simple! >> >> I presume you’d need to take it a few steps further - if the last >> message received required a response CS/RAA, you must still wait until >> things have settled down. I guess it also depends on the exact >> semantics of a “turn based” message protocol - if you received some >> updates and a signature, are you allowed to add more updates after you >> send your CS/RAA (then you have a good chunk of today’s complexity), >> or do you have to wait until they send you back their last RAA (in >> which case presumably they aren’t allowed to include anything else as >> then they’d be able to monopolize update windows). In the first case >> you still have the same issues of today, in the second less so, but >> you’re doing a similar “ok, just pause updates and wait for things to >> settle “, I think. > > Yes, as the original proposal stated: you propose changes, send > commitment_signed, receive revoke_and_ack and commitment_signed, then > send revoke_and_ack. Then both sides are in sync, and the other side > has a turn. > > The only "twist" is that if it's your turn and you receive an update, > you can either reply with a "yield" message, or ignore it. > >>> Instead, *both* sides have to send a splice message to synchronize, and >>> they can only do so once all in-flight changes have cleared. You have >>> to resolve simultaneous splice attempts (we use "highest feerate" >>> tiebreak by node_id), and keep track of this stage while you clear >>> in-flight changes. >> >> Isn’t that pretty similar? Discard one splice proposal deterministically (ok >> that’s new) and the loser has to store their proposal in a holding cell for >> later (which they have to do in turn-based anyway). Logic to check if >> there’s unsettled things in RAA handling is pretty similar to turn-based, >> and logic to reject other messages is the same as shutdown handling today. > > Nope, with the simplified protocol you can `update_splice` at any time > instead of your normal update, since both sides are already in sync. > >>> Here's the subset of requirements from the draft which relate to this: >>> >>> The sender: >>> - MUST NOT send another splice message while a splice is being negotiated. >>> - MUST NOT send a splice message after sending uncommitted changes. >>> - MUST NOT send other channel updates until splice negotiation has >>> completed. >>> >>> The receiver: >>> - MUST respond with a `splice` message of its own if it has not already. >>> - MUST NOT reply with `splice` until all commitment updates are resolved by >>> both peers. >> >> Probably use “committed” not “resolved”. “Resolved” sounds like “no pending >> HTLCs left”. > > Yes, and in fact this protocol was flawed and had to be revised, as it > did not actually mean both sides were committed in the case of > simultaneous splice proposals :( > >>> - MUST use the higher of the two `funding_feerate_perkw` as the feerate for >>> the splice. >> >> If we like turn based, why not just deterministic throw out one slice? :) > > Because while I am going to implement turn-based, I'm not sure if anyone > else is. I guess we'll see? > > Cheers, > Rusty. _______________________________________________ Lightning-dev mailing list Lightning-dev@lists.linuxfoundation.org https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev