-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BIP442: OP_PAIRCOMMIT #1699
base: master
Are you sure you want to change the base?
BIP442: OP_PAIRCOMMIT #1699
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This document has a few formatting issues, please make sure that the preamble matches the BIP 2 requirements and take a look at the rich diff to see whether it looks the way you intend.
Please note that the BIPs repository also accepts markdown files.
Switched back to markdown. Header now in BIP-2 format. |
8f11758
to
f3f7f91
Compare
The original create date of OP_PAIRCOMMIT is 2024-03-15 this is the latest revision based on feedback from Anthony Towns. |
Added a discussion link to the PR description.
Perhaps add a changelog with the revision based on Anthony Towns' feedback followed by the initial version. Or use the date of the current draft revision as your starting point. |
According to BIP 2:
|
Has this proposal been sent to the mailing list? |
Proposed to the mailing list, waiting for feedback. |
59249d9
to
dfb0670
Compare
dfb0670
to
92ffeb8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would like to see this proposal to get more review from other covenant researchers before it moves forward.
2dfe8fd
to
bbf8c49
Compare
It looks like we gonna have to amend the Special thanks to: @JeremyRubin @Ademan @bigspider edit: |
4df2a5d
to
43259a7
Compare
acc0554
to
c49bc72
Compare
I think I've changed my mind a bit. We were talking about computing a merkle tree for The implication of this is that where a function can be decomposed into operations on smaller inputs, PAIRCOMMIT is massively more feasible to use than encoding things into a tap tree. |
Arithmetic and bitwise operations where inputs & outputs are small enough, can already be done in Script in cheaper ways. Merkle trees as lookup tables are only interesting for functions that are either extremely complex, or where preimages/images are larger than what Script can work with.
I think the only substantial difference is that in a Script where you need several lookups, you can do it with Merkle trees, while you can only do a single lookup with a precomputed taptree. |
Is this correct? Any suggestions? @Ademan @bigspider |
This is the main open question I believe. does it or does it not practically expand what we can already do? edit: (actually the above examples are wrong, because internally bitcoin script uses little endian, but should convey the point) |
Even u16,u16 is quite a bit larger than I think is practical as a lookup table, but the efficiency for repeated operations is constant, obviously. The lookup table is less efficient for small numbers of operations (a u8,u8 table is 16k vs 1 u8,u8 proof is 0.4k) but the merkle tree loses quickly when those operations are repeated.
Right, and the key point is these merkle trees and lookup tables rapidly become infeasible to compute as the input size grows, so multiple smaller lookups is significantly more useful. EDIT: But your point is well taken that for smaller operations they can already be better accomplished by lookup tables. |
Yeah for arbitrary 8 byte strings smolCAT seems infeasible to compute the table or merkle tree for. After a bit of conversation on IRC it could probably be feasible for arbitrary Bit shifts over 32 bit integers seems pretty feasible though, that's You can also separate positive and negative shifts, and maybe break it down into multiple rounds of shifts 1-3 or something (or 1k for a proof for a constant shift) [1]: afaik existing ASICs operate on block headers so couldn't help |
Should we add this table to this BIP? And it's not just vBytes but also the number of sigops to consider, which is a cost all nodes on the p2p network have to bear. edit: I think it looks like this:
* VAULT is not exactly a SigOp, but close enough. Has a budget cost of 1.2 SigOps. |
tbh i have no idea how to read that table, so might be good to have clearer labeling somehow / break down where the accounting came from? |
This is based on @reardencode's spreadsheet: |
Looking at the Motivation section, it seems to me that the main application for this proposal would be a construction that depends on three other undeployed proposals some of which are themselves draft stage or pre-draft. This proposal feels a bit hypothetical at this point. I’ll get back to you next week. |
While PAIRCOMMIT would only be truly useful with certain other future upgrades, it is proposed to activate in a bundle with said updates. We are in the process of trying to reach consensus on said package. It's unlikely I would withdraw OP_PAIRCOMMIT, unless OP_CAT got activated first. |
The Created header records the date that the BIP was assigned a number (see BIP-2). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few edit suggestions on first read.
I think this can potentially be assigned a number once the BIP-2 criteria are met. A non-exhaustive list:
"When the BIP draft is complete, a BIP editor will assign the BIP a number, label it as Standards Track, Informational, or Process, and merge the pull request to the BIPs git repository.
"The BIP editors will not unreasonably reject a BIP.
"Reasons for rejecting BIPs include duplication of effort, disregard for formatting rules, being too unfocused or too broad, being technically unsound, not providing proper motivation or addressing backwards compatibility, or not in keeping with the Bitcoin philosophy.
"For a BIP to be accepted it must meet certain minimum criteria.
"It must be a clear and complete description of the proposed enhancement.
"The enhancement must represent a net improvement.
"The proposed implementation, if applicable, must be solid and must not complicate the protocol unduly."
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let’s call this BIP 442.
6e60b59
to
baf6c7a
Compare
f7bd2e6
to
0253838
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PAIRCOMMIT continues to grow on me.
Getting the primary benefits of OP_CAT without introducing ugly introspection seems like a clear win for bitcoin.
Better introspection should also be added in follow-up forks. Thanks for your work on this!
a 1-byte `OP_TRUE` public key (substituting for the *taproot internal key*) and | ||
can commit to a number of stack elements as a message. | ||
|
||
### Behaviors LNhance tries to avoid introducing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this section belong in the PC BIP?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we should have an LNhance BIP that depends on the others and move some stuff over?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it may be fine here if this section is moved up next to the Motivation section and the term LNHANCE is introduced clearly, ideally with a link to lnhance.org if that url is viable long-term.
I get that there is a goal here to avoid introspection... but it seems that it'd be more generically useful if the function were e.g., a TapBranch function, so then it could be used in the future with some other taproot editing opcodes. e.g., if
this works because while the first commit commits to either One concern: OP_TAPBRANCHCOMMIT is witness "malleable", in that items could show up in the witness stack in either order and get the same result. It'd still be possible to make non-malleable witnesses by requiring the stack elements to be in order with a OP_LEXSORT or equivalent functionality. |
If we did To be honest the |
I think it's actually less controversial, because if you do Whereas now you're getting a lot of people thinking that paircommit is not so useful if CAT gets in eventually. |
Right. I did consider something like a sorting merkle operator for lamport stuff for example, however when you need order dependent commitments (which is pretty much everything we are doing with it rn) then you would have to use a dummy value like: |
a540f70
to
69d8d97
Compare
69d8d97
to
0ad3d24
Compare
I think this is ready for a merge from my point of view. |
Maybe this is obvious to everyone else and I'm a slowpoke here, but PC+CSFS+CTV enables a kind of "multi-transaction-signature". You sign a merkle root that commits to a bunch of CTV transaction templates, and you can provide an inclusion proof with PC with the signature. I've been spitballing with someone about a multiparty eltoo scheme and came up with a way to bound the state resolution but without state carrying covenants it requires a possible field of ~2^N transactions (of which, at most N will end up on-chain), and every party shares N*(N+1)/2 signatures. With PC+CSFS+CTV it still requires ~2^N transactions, but each party only needs to share their 1 signature over the merkle root. EDIT: Not 100% sure it works for my mutliparty eltoo scheme just yet, but I'm still >50% confident it does... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I find this BIP still somewhat hard to read. Many sections seem to expect a lot of prior knowledge from the reader. Overall, it seems to me that several sections could do with a bit more context. Maybe I’m not in the target audience for the BIP, but I would suggest that people who are more invested in this topic proofread this BIP and provide feedback with approachability in mind.
<a> <b> <c> | PC PC <pc-hash> OP_EQUALVERIFY | ||
``` | ||
|
||
### Use in LN-Symmetry |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a subsection of the Specification section, but does "Use in LN-Symmetry" actually belong to the Specification? Wouldn’t it make more sense for it to be in the Rationale or a section with example uses?
ENDIF | ||
``` | ||
|
||
### Use with future updates |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above, "Use with future updates" doesn’t seem to belong to the Specification.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using ##
instead of ###
for this section and for "Use in LN-Symmetry" might suffice (e.g. moving them out of the Specification section).
| Method | ChannelSc | UpdateSc | UpdateW | ForceC | Contest | Settle | | ||
| :------------ | --------: | -------: | ------: | ------: | ------: | :----: | | ||
| APO-Annex | 8 WU | 113 WU | 100 WU | 1221 WU | 627 WU | SigOp | | ||
| APO-Return | 8 WU | 113 WU | 66 WU | 1359 WU | 765 WU | SigOp | | ||
| CTV+CSFS+IKEY | 10 WU | 48 WU | 98 WU | 1328 WU | 732 WU | CTV | | ||
| CTV+CSFS | 43 WU | 81 WU | 98 WU | 1394 WU | 765 WU | CTV | | ||
| LNhance | 11 WU | 49 WU | 131 WU | 1191 WU | 594 WU | CTV | | ||
|
||
*ChannelSc: channel script, UpdateSc: update script, UpdateW: witness is the | ||
same size for both Force Close and Contest in LN-Symmetry, ForceC: total cost of unilateral close transactions* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some of these abbreviations are just a few characters shorter than the actual term. How about something along the lines of:
| Method | ChannelSc | UpdateSc | UpdateW | ForceC | Contest | Settle | | |
| :------------ | --------: | -------: | ------: | ------: | ------: | :----: | | |
| APO-Annex | 8 WU | 113 WU | 100 WU | 1221 WU | 627 WU | SigOp | | |
| APO-Return | 8 WU | 113 WU | 66 WU | 1359 WU | 765 WU | SigOp | | |
| CTV+CSFS+IKEY | 10 WU | 48 WU | 98 WU | 1328 WU | 732 WU | CTV | | |
| CTV+CSFS | 43 WU | 81 WU | 98 WU | 1394 WU | 765 WU | CTV | | |
| LNhance | 11 WU | 49 WU | 131 WU | 1191 WU | 594 WU | CTV | | |
*ChannelSc: channel script, UpdateSc: update script, UpdateW: witness is the | |
same size for both Force Close and Contest in LN-Symmetry, ForceC: total cost of unilateral close transactions* | |
| Method | Channel Script | Update Script | Update Witness¹ | Force Close² | Contest | Settlement Mechanism | | |
| :------------ | --------: | -------: | ------: | ------: | ------: | :----: | | |
| APO-Annex | 8 WU | 113 WU | 100 WU | 1221 WU | 627 WU | SigOp | | |
| APO-Return | 8 WU | 113 WU | 66 WU | 1359 WU | 765 WU | SigOp | | |
| CTV+CSFS+IKEY | 10 WU | 48 WU | 98 WU | 1328 WU | 732 WU | CTV | | |
| CTV+CSFS | 43 WU | 81 WU | 98 WU | 1394 WU | 765 WU | CTV | | |
| LNhance | 11 WU | 49 WU | 131 WU | 1191 WU | 594 WU | CTV | | |
¹ *witness is the same weight for both Force Close and Contest in LN-Symmetry* | |
² *total cost of unilateral close transactions* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This table is also provided barren of context. It would probably be useful to link to the compared schemas, or to the source of the table, and to add a couple sentence as to what we are looking at in the first place.
* OP_VECTORCOMMIT: generalized form for n > 2 elements | ||
* ReKey: key delegation and multiple use of OP_CHECKSIGFROMSTACK | ||
|
||
### Cost comparison of LN-Symmetry constructions |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
### Cost comparison of LN-Symmetry constructions | |
### Weight comparison of LN-Symmetry constructions |
### Behaviors LNhance tries to avoid introducing | ||
|
||
The following behaviors are out of scope for LNhance and should not be enabled |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the first mention of LNHANCE in this BIP, but is not further explained. LNHANCE is not introduced in this repository (except for a cursory mention in BIP 348 OP_CHECKSIGFROMSTACK). It would probably make sense to introduce the term, if this section is retained.
There are practical limits to the entropy space for the *inputs* as they need | ||
to be iterated over and hashed into a Merkle root. | ||
|
||
Taproot MAST trees can currently cover 128 bits of entropy space, which is over |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What are "Taproot MAST trees"? The taproot BIPs speaks of "Script Trees" and MAST would be understood as "Merklized Alternative Script Trees" in the context of Taproot. On the other hand, MAST as described in BIP 114 and BIP 117 speaks of Merklized Abstract Syntax Trees where multiple leaves are used in combination.
You mention MAST here in the context taproot, where only a single leaf is ever used at once, but it seems to me that you might be thinking of Abstract Syntax Trees. Either way, it is not clear to me what you are referring to here, when you speak of the "entropy space covered by Taproot MAST trees" while treating leaves as "inputs and outputs".
This section is jumping right in the middle of something. I’m not sure that the scenario is described sufficiently to understand what the supposed concern is, let alone why the supposed concern is not a concern. If this section is relevant to this BIP, I reckon that more context is necessary for the reader to understand why and how, e.g., add aa link to a description of this scheme, or provide a bit more explanation what this section is talking about.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMO this is a problem in the taproot BIP series, where various individuals decided it pertinent to change a well understood acronym (MAST) to suit taproot, rather than resepcting an existing body of literature including other BIPs.
I'd rather the taproot BIPs get updated to reflect the terminology Merklized Abstract Syntax Trees (or Tap Script Merkle Commitments, TSMC, if we're fond of confusing backronyming but should be less ambiguous in context) rather than Merklized Alternative Script Trees, which was a backronym.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
correction: it seems there is no mention of alt script tree in the bips repos, just abstract syntax tree, including in the BIPs for Taproot itself. It's just a confusing rename people have made outside of this repo.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So should it be "Taptrees" instead of "Taproot MAST trees"? Or "Tapscript trees"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think "Taproot script tree" or "Taproot Merkle tree" would both be clear, I prefer the former.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm gonna spend some time with this BIP today and will either make comments or offer a revision to put the sections of this into a more cohesive sequence.
Currently, bitcoin lacks a way to hash multiple stack elements together. Which | ||
means building Merkle trees or verifying inclusion in a tree is not supported. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Currently, bitcoin lacks a way to hash multiple stack elements together. Which | |
means building Merkle trees or verifying inclusion in a tree is not supported. | |
Currently, bitcoin lacks a way to commit to multiple stack elements together. It is common practice to hash a single item as part of a bitcoin script, either in hash/time locked contracts, or in pay-to-pubkey-hash (P2PKH) scripts, but there is no way to commit to multiple items with a single hash. | |
In a contrived but demonstrative example, if PAIRCOMMIT existed in legacy script, P2PKH could be extended to pay-to-pubkey-time-hash with scriptPubKey `2DUP PAIRCOMMIT RIPEMD160 <hash> EQUALVERIFY CHECKLOCKTIMEVERIFY DROP CHECKSIG`. This script format for single signature, time-locked bitcoin could be transformed into an address format. | |
With the ability to commit to pairs of elements, PAIRCOMMIT can be generalized Merklized commitments to a tree of elements with a single hash. On its own, this could enable a hash lock contract where the holder of any pre-image in a Merkle tree can unlock the spend, for example. | |
If `OP_CHECKSIGFROMSTACK` is combined with PAIRCOMMIT, the ability to sign commitments to multiple items enables both of the above but as a form of delegation. In cases where any single item can be used to unlock an output, additional off chain signatures be simply can be used as an alternative to PAIRCOMMIT. However in cases where multiple items must be used for spending together, PAIRCOMMIT removes the need for complex laddering schemes to ensure that all items were authorized together. |
The number of SHA256 iterations is minimized in the typical use cases we can | ||
optimize for. Since the Tag can be pre-computed as mid-state, it would only | ||
take 1 or 2 hash cycles in validation for the unilateral close scenario. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems like something that belongs in a footnote not in the main text.
There are practical limits to the entropy space for the *inputs* as they need | ||
to be iterated over and hashed into a Merkle root. | ||
|
||
Taproot MAST trees can currently cover 128 bits of entropy space, which is over |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think "Taproot script tree" or "Taproot Merkle tree" would both be clear, I prefer the former.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
WIP review.
in a way that makes length redistribution attacks infeasible. | ||
|
||
The number of SHA256 iterations is minimized in the typical use cases we can | ||
optimize for. Since the Tag can be pre-computed as mid-state, it would only |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does "Tag" here refer to this, as you are writing elsewhere in this draft?
optimize for. Since the Tag can be pre-computed as mid-state, it would only | |
optimize for. Since the tagged SHA256 hash can be pre-computed mid-state, it would only |
- drop "as"?
- s/in validation/to validate/ (line 34)?
ENDIF | ||
``` | ||
|
||
### Use with future updates |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using ##
instead of ###
for this section and for "Use in LN-Symmetry" might suffice (e.g. moving them out of the Specification section).
### Use with future updates | ||
|
||
Detailed introspection opcodes would also need vector commitments when used | ||
with `OP_CHECKSIGFROMSTACK`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit, could link to or mention BIP348 with CHECKSIGFROMSTACK here.
Detailed introspection opcodes would also need vector commitments when used | ||
with `OP_CHECKSIGFROMSTACK`. | ||
|
||
`OP_CHECKCONTRACTVERIFY` would also need a way to carry complex data. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't part of any BIP (number) yet, maybe add it later if that changes.
|
||
https://github.com/lnhance/bitcoin/pull/6/files | ||
|
||
## Rationale |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggest moving this Rationale section up to just after Motivation, before Specification.
|
||
## Rationale | ||
|
||
If `OP_CAT` was available, it could be used to combine multiple stack elements |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could link to or mention BIP347 with OP_CAT here.
* Merkle operation opcodes | ||
* 'Kitty' CAT: result or inputs arbitrarily limited in size | ||
* OP_CHECKTEMPLATEVERIFY committing to the taproot annex in tapscript | ||
* OP_CHECKSIGFROMSTACK on n elements as message |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could link to or mention BIP348
* SHA256 streaming opcodes | ||
* Merkle operation opcodes | ||
* 'Kitty' CAT: result or inputs arbitrarily limited in size | ||
* OP_CHECKTEMPLATEVERIFY committing to the taproot annex in tapscript |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could link to or mention BIP119
* OP_VECTORCOMMIT: generalized form for n > 2 elements | ||
* ReKey: key delegation and multiple use of OP_CHECKSIGFROMSTACK | ||
|
||
### Cost comparison of LN-Symmetry constructions |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It may make sense to put this section next to (or in) the "Use in LN-Symmetry" section.
a 1-byte `OP_TRUE` public key (substituting for the *taproot internal key*) and | ||
can commit to a number of stack elements as a message. | ||
|
||
### Behaviors LNhance tries to avoid introducing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it may be fine here if this section is moved up next to the Motivation section and the term LNHANCE is introduced clearly, ideally with a link to lnhance.org if that url is viable long-term.
Channel peers must be able to reconstruct the script that spends an | ||
intermediate state. | ||
|
||
Using in sequence `OP_CHECKTEMPLATEVERIFY`, `OP_PAIRCOMMIT`, `OP_INTERNALKEY` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The pseudocode below might be clearer if the acronyms are defined beforehand
Using in sequence `OP_CHECKTEMPLATEVERIFY`, `OP_PAIRCOMMIT`, `OP_INTERNALKEY` | |
Using in sequence `OP_CHECKTEMPLATEVERIFY` (`CTV`), `OP_PAIRCOMMIT` (`PC`), `OP_INTERNALKEY` (`IK`) |
(idem for CSFS on the next line)
Thanks so much Jon. we have a significant revision coming that does include defining abbreviations. @moonsettler should we move this to draft until we finish workshopping the revisions we're working on? |
OP_PAIRCOMMIT
is the newest member of the LNhance family of opcodes. It provides limited vector commitment functionality in tapscript.When evaluated, the
OP_PAIRCOMMIT
instruction:Discussion: https://delvingbitcoin.org/t/op-paircommit-as-a-candidate-for-addition-to-lnhance/1216/12