Skip to content

bolt02 requirements for closing_signed with musig2-taproot#2

Open
Crypt-iQ wants to merge 2 commits intoRoasbeef:simple-taproot-chansfrom
Crypt-iQ:taprootbolt
Open

bolt02 requirements for closing_signed with musig2-taproot#2
Crypt-iQ wants to merge 2 commits intoRoasbeef:simple-taproot-chansfrom
Crypt-iQ:taprootbolt

Conversation

@Crypt-iQ
Copy link

This makes simple musig2-taproot channels use fee_range by making it fully turn-based with a new message closing_rejected.

Copy link
Owner

@Roasbeef Roasbeef left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great observation re needing to move towards a turn-based protocol. While we're at it...I wonder if we should just move all the negotiation upfront, and then have a single accept message that contains the final valid signature?

We can likely defer that though, as this may be aa change we want to make fore all channel types.

Main comment here is re the two nonces still, and also moving this to the extension doc.

2. data:
* [`u64`:`min_fee_satoshis`]
* [`u64`:`max_fee_satoshis`]
1. type: 2 (`local_musig2_pubnonce`)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the "extension" style, I think we want to instead add these new TLV fields and requirements to the new document.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am of two minds here. On one hand it's nice to have things in a new document, but I also think it would be confusing to split up closing_signed requirements between multiple files without any sort of reference (hyperlink?) from one file to the other

No funds are at risk when that happens, but the channel must be force-closed as
the closing transaction will likely never reach miners.

### Closing Rejected: `closing_rejected`
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting addition, same comment re moving to the extension doc.

1. type: 2 (`local_musig2_pubnonce`)
2. data:
* [`66*byte`:`nonces`]
1. type: 4 (`remote_musig2_pubnonce`)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are two sets of nonces needed here? I was under the impression that in the co-op close case, there's actually just one message being signed, so we can get away with a single nonce?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For dust limit, unless there's a way to agree on a single tx

@Crypt-iQ
Copy link
Author

Crypt-iQ commented Jun 30, 2022

I wonder if we should just move all the negotiation upfront, and then have a single accept message that contains the final valid signature?

That's possible. With fee_range in the current spec (which is mostly the same to this proposal), there are a couple scenarios:

  • Done in two messages
---fee_range(100, 200), fee_sats(150)---->
<--fee_range(120, 180), fee_sats(150)-----
  • Done in three messages
---fee_range(100, 200), fee_sats(150)---->
<--fee_range(120, 180), fee_sats(170)-----
---fee_range(100, 200) fee_sats(170)----->
  • Done in N messages
---fee_range(100, 200), fee_sats(150)----> (recipient doesn't like fee_range)
---fee_range(150, 250), fee_sats(200)---->
...
---fee_range(500, 600), fee_sats(550)----> (...)
<--fee_range(500, 700), fee_sats(550)----- (recipient immediately agrees)
  • Done in N messages part 2
---fee_range(100, 200), fee_sats(150)----> (recipient doesn't like fee_range)
---fee_range(150, 250), fee_sats(200)---->
...
---fee_range(500, 600), fee_sats(550)----> (...)
<--fee_range(500, 700), fee_sats(650)----- (recipient doesn't agree)
---fee_range(500, 600), fee_sats(650)---->

You could change it so that the initiator doesn't send a signature until the recipient does. That lengthens the round-trip time in the cases where the recipient immediately agrees, but it doesn't seem to be a big deal. It does let you get rid of nonce exchanging in closing_rejected, but the message should stay to signal that the recipient doesn't agree with the range. I was mostly going for keeping the fee_range stuff as similar as possible to what's existing

@Roasbeef Roasbeef mentioned this pull request Nov 16, 2022
@Roasbeef Roasbeef force-pushed the simple-taproot-chans branch from e95e7ac to e25132d Compare August 24, 2023 01:05
Roasbeef pushed a commit that referenced this pull request Jul 10, 2025
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>




Header from folded patch 'bolt_2__set_an_initiator_in_quiescence.patch':

BOLT #2: Set an initiator in quiescence.

This is especially useful for protocols such as splicing; for
simplified commitment transactions, there is already an implied
initiator at each point, so having the negotiation at splicing
time would be redundant.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>



Header from folded patch 'option_quiesce__feature_to_support_stfu_method.patch':

option_quiesce: feature to support stfu method.

In practice, sftu is useless unless you have something (e.g. channel_upgrade)
which uses it, but adding a feature is best practice IMHO.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@Roasbeef Roasbeef force-pushed the simple-taproot-chans branch from 1ad02ee to 4c1314a Compare July 10, 2025 23:58
Roasbeef added a commit that referenced this pull request Mar 9, 2026
Remove the redundant nSequence paragraph from the cooperative close
section. The `option_simple_close` spec in BOLT #2 already specifies
that `nSequence` MUST be exactly `0xFFFFFFFD`, so restating it here
with the weaker "less-than-or-equal" phrasing was both redundant and
inconsistent.

Also fix "next closee nonce" to "closer nonce" in the JIT nonce
description for `closing_complete`, matching the terminology used
throughout the rest of the spec.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants