-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1534 from reardencode/internalkey
Add BIP 349: OP_INTERNALKEY
- Loading branch information
Showing
2 changed files
with
79 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
<pre> | ||
BIP: 349 | ||
Layer: Consensus (soft fork) | ||
Title: OP_INTERNALKEY | ||
Author: Brandon Black <[email protected]> | ||
Jeremy Rubin <[email protected]> | ||
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0349 | ||
Status: Draft | ||
Type: Standards Track | ||
Created: 2024-11-14 | ||
License: BSD-3-Clause | ||
</pre> | ||
|
||
## Abstract | ||
|
||
This BIP describes a new tapscript opcode (`OP_INTERNALKEY`) which | ||
pushes the _taproot internal key_ to the stack. | ||
|
||
## Specification | ||
|
||
When verifying taproot script path spends having leaf version `0xc0` (as | ||
defined in [BIP 342]), `OP_INTERNALKEY` replaces `OP_SUCCESS203` (0xcb). | ||
`OP_INTERNALKEY` pushes the 32-byte x-only representation of the _taproot | ||
internal key_ (referred to as _p_), as defined in [BIP 341], to the stack. | ||
|
||
## Motivation | ||
|
||
### Key spend with additional conditions | ||
|
||
When building taproot outputs, especially those secured by an aggregate key | ||
representing more than one signer, the parties may wish to collaborate on | ||
signing with the _taproot internal key_, but only with additional script | ||
restrictions. In this case, `OP_INTERNALKEY` saves 8 vBytes. | ||
|
||
### Mitigated control block overhead for scripts using hash locks | ||
|
||
In cases where key path spending is not desired, the internal key may be set to | ||
a NUMS point whose bytes would otherwise be required in a tapscript. This could | ||
be used with any hash locked transaction, for example, to save 8 vBytes. | ||
|
||
Note: The internal key must be the X coordinate of a point on the SECP256K1 | ||
curve, so any such hash must be checked and modified until it is such an X | ||
coordinate. This will typically take approximately 2 attempts. | ||
|
||
## Reference Implementation | ||
|
||
A reference implementation is provided here: | ||
|
||
https://github.com/bitcoin/bitcoin/pull/29269 | ||
|
||
## Backward Compatibility | ||
|
||
By constraining the behavior of an OP_SUCCESS opcode, deployment of the BIP | ||
can be done in a backwards compatible, soft-fork manner. If anyone were to | ||
rely on the OP_SUCCESS behavior of `OP_SUCCESS203`, `OP_INTERNALKEY` would | ||
invalidate their spend. | ||
|
||
## Deployment | ||
|
||
TBD | ||
|
||
## Credits | ||
|
||
TODO | ||
|
||
## Copyright | ||
|
||
This document is licensed under the 3-clause BSD license. | ||
|
||
[BIP 341]: https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki | ||
|
||
[BIP 342]: https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki |