Skip to content

Commit

Permalink
Add bip-internalkey
Browse files Browse the repository at this point in the history
  • Loading branch information
reardencode committed May 14, 2024
1 parent 96161ae commit e7dfa7e
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
7 changes: 7 additions & 0 deletions README.mediawiki
Original file line number Diff line number Diff line change
Expand Up @@ -1093,6 +1093,13 @@ Those proposing changes should consider that ultimately consent may rest with th
| Standard
| Draft
|- style="background-color: #cfffcf"
| [[bip-internalkey.md|internalkey]]
| Consensus (soft fork)
| OP_INTERNALKEY
| Brandon Black, Jeremy Rubin
| Standard
| Draft
|- style="background-color: #cfffcf"
| [[bip-0350.mediawiki|350]]
| Applications
| Bech32m format for v1+ witness addresses
Expand Down
70 changes: 70 additions & 0 deletions bip-internalkey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
```
BIP: XXX
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-XXXX
Status: Draft
Type: Standards Track
Created: 2023-12-22
License: BSD-3-Clause
```

## Abstract

This BIP describes a new tapscript opcode (`OP_INTERNALKEY`) which
pushes the taproot internal key to the stack.

## Specification

When verifying taproot script spends having leaf version `0xc0` (as defined in
[BIP 342]), `OP_INTERNALKEY` replaces `OP_SUCCESS203` (0xcb). `OP_INTERNALKEY`
pushes the taproot internal key, 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 script 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

0 comments on commit e7dfa7e

Please sign in to comment.