|
| 1 | +<pre> |
| 2 | + BIP: ? |
| 3 | + Layer: Applications |
| 4 | + Title: Pay-to-contract tweak fields for PSBT |
| 5 | + Author: Maxim Orlovsky < [email protected]>, |
| 6 | + Andrew Poelstra < [email protected]> |
| 7 | + Discussions-To: < [email protected]> |
| 8 | + Comments-URI: <to be assigned> |
| 9 | + Status: Draft |
| 10 | + Type: Standards Track |
| 11 | + Created: 2022-01-16 |
| 12 | + License: BSD-2-Clause |
| 13 | + Requires: BIP-174 |
| 14 | +</pre> |
| 15 | + |
| 16 | +==Introduction== |
| 17 | + |
| 18 | +===Abstract=== |
| 19 | + |
| 20 | +This document proposes additional fields for BIP 174 PSBTv0 and BIP 370 PSBTv2 |
| 21 | +that allow for pay-to-contract key tweaking data data to be included in a PSBT |
| 22 | +of any version. These will represent an extra-transaction information required |
| 23 | +for the signer to produce valid signatures spending previous outputs. |
| 24 | + |
| 25 | +===Copyright=== |
| 26 | + |
| 27 | +This BIP is licensed under the 2-clause BSD license. |
| 28 | + |
| 29 | +===Background=== |
| 30 | + |
| 31 | +Key tweaking is a procedure for creating a cryptographic commitment to some |
| 32 | +message using elliptic curve properties. The procedure uses the discrete log |
| 33 | +problem (DLP) to commit to an extra-transaction message. This is done by adding |
| 34 | +to a public key (for which the output owner knows the corresponding private key) |
| 35 | +a hash of the message multiplied on the generator point G of the elliptic curve. |
| 36 | +This produces a tweaked public key, containing the commitment. Later, in order |
| 37 | +to spend an output containing P2C commitment, the same commitment should be |
| 38 | +added to the corresponding private key. |
| 39 | + |
| 40 | +This type of commitment was originally proposed as a part of the pay to contract |
| 41 | +concept by Ilja Gerhardt and Timo Hanke in [1] and later used by Eternity Wall |
| 42 | +[2] for the same purpose. Since that time multiple different protocols for P2C |
| 43 | +has been developed, including OpenTimeStamps [3], Elements sidechain P2C tweaks |
| 44 | +[4] and LNPBP-1 [5], used in for constructing Peter Todd's single-use-seals [6] |
| 45 | +in client-side-validation protocols like RGB. |
| 46 | + |
| 47 | +===Motivation=== |
| 48 | + |
| 49 | +P2C outputs can be detected onchain and spent only if the output owner |
| 50 | +not just knowns the corresponding original private key, but also is aware about |
| 51 | +P2C tweak applied to the public key. In order to produce a valid signature, the |
| 52 | +same tweak value must be added (modulo group order) to the original private key |
| 53 | +by a signer device. This represents a channelge for external signers, which may |
| 54 | +not have any information about such commitment. This proposal addresses this |
| 55 | +issue by adding relevant fields to the PSBT input information. |
| 56 | + |
| 57 | +The proposal abstracts details of specific P2C protocols and provides universal |
| 58 | +method for spending previous outpus containing P2C tweaks, applied to the public |
| 59 | +key contained within any standard form of the <tt>scriptPubkey</tt>, including |
| 60 | +bare scripts and P2PK, P2PKH, P2SH, witness v0 P2WPKH, P2WSH, nested witness v0 |
| 61 | +P2WPKH-P2SH, P2WSH-P2SH and witness v1 P2TR outputs. |
| 62 | + |
| 63 | + |
| 64 | +==Design== |
| 65 | + |
| 66 | +P2C-tweaked public keys are already exposed in the |
| 67 | +<tt>PSBT_IN_REDEEM_SCRIPT</tt>, <tt>PSBT_IN_WITNESS_SCRIPT</tt>, |
| 68 | +<tt>PSBT_IN_TAP_INTERNAL_KEY</tt> and <tt>PSBT_IN_TAP_LEAF_SCRIPT</tt> fields; |
| 69 | +the only information signer is needed to recognize which keys it should sign |
| 70 | +with is from which of the original keys they were generated. This is achieved by |
| 71 | +introducing new `PSBT_IN_P2C_TWEAK` field which has the original key as a field |
| 72 | +key and the tweak as a field value. The signer will recognize the keys which are |
| 73 | +available to it, apply the tweak to them and see in which scripts it was used -- |
| 74 | +and use this information to apply tweaks for the corresponding private keys and |
| 75 | +produce valid signatures. |
| 76 | + |
| 77 | + |
| 78 | +==Specification== |
| 79 | + |
| 80 | +The new per-input type is defined as follows: |
| 81 | + |
| 82 | +{| |
| 83 | +! Name |
| 84 | +! <tt><keytype></tt> |
| 85 | +! <tt><keydata></tt> |
| 86 | +! <tt><keydata></tt> Description |
| 87 | +! <tt><valuedata></tt> |
| 88 | +! <tt><valuedata></tt> Description |
| 89 | +! Versions Requiring Inclusion |
| 90 | +! Versions Requiring Exclusion |
| 91 | +! Versions Allowing Inclusion |
| 92 | +|- |
| 93 | +| P2C Key Tweak |
| 94 | +| <tt>PSBT_IN_P2C_TWEAK = 0x19</tt> |
| 95 | +| <tt><pubkey></tt> |
| 96 | +| 33 bytes of compact public key serialization specifying to which of keys the |
| 97 | +P2C tweak may be applied (i.e. this MUST be a value of a public key before the |
| 98 | +tweak is applied). BIP-340 keys are serialized by appending `02` |
| 99 | +byte.<ref>'''Why compressed public keys are not distinguished from BIP-340 |
| 100 | +public keys'''We follow the logic of BIP32 key derivation which does not |
| 101 | +performs that distinguishment. The type of the key is defined by the input type, |
| 102 | +and adding additional PSBT field type will just create the need for handling |
| 103 | +errors when the input type does not match the provided key type.</ref> |
| 104 | +| <tt><tweak></tt> |
| 105 | +| The 32 byte value which MUST be added to a private key to produce correct |
| 106 | +ECDSA and/or Schnorr signature ("key tweak"). Signers SHOULD remove this field |
| 107 | +after <tt>PSBT_IN_PARTIAL_SIG</tt> is constructed. |
| 108 | +| |
| 109 | +| |
| 110 | +| 0, 2 |
| 111 | +| BIP-P2C |
| 112 | +|} |
| 113 | + |
| 114 | + |
| 115 | +==Security considerations== |
| 116 | + |
| 117 | +The scope of this proposal is deliberately kept narrow; it addresses |
| 118 | +only spending of transaction outputs containing P2C tweaks - and does not |
| 119 | +addresses construction of a new P2C commitments or transactions containing them |
| 120 | +in their outputs.<ref>'''Why only spending of P2C tweaked outputs is covered''' |
| 121 | +P2C tweaks commit to external data, some of which may represent certain value |
| 122 | +(like in some sidechains, single-use-seal applications like RGB etc). Creation |
| 123 | +of such outputs much allow hardware devices to understand the structure of such |
| 124 | +extra-transaction data, which may be in different formats and constantly |
| 125 | +involve. Thus, this should be addresses with a separate standards (or be a |
| 126 | +vendor-based). The current proposal only touches the question of spending an |
| 127 | +output which contained previously created P2C commitment, which does not creates |
| 128 | +a new commitment and does not provides that kind of risk of extra-blockchain |
| 129 | +value loses.</ref> |
| 130 | + |
| 131 | + |
| 132 | +==Rationale== |
| 133 | + |
| 134 | +<references/> |
| 135 | + |
| 136 | + |
| 137 | +==Compatibility== |
| 138 | + |
| 139 | +The proposal is compatible with the existing consensus rules and does not |
| 140 | +require any of their modifications. |
| 141 | + |
| 142 | +The proposed P2C PSBT fields provides sufficient information for creating a |
| 143 | +valid signatures for spendings of the following output types containing tweaked |
| 144 | +public keys: |
| 145 | +- bare scripts, |
| 146 | +- P2PK, |
| 147 | +- P2PKH, |
| 148 | +- P2SH, |
| 149 | +- witness v0 P2WPKH and P2WSH, |
| 150 | +- nested witness v0 P2WPKH-P2SH and P2WSH-P2SH, |
| 151 | + |
| 152 | +Post-0 witness versions, including taproot outputs and future witness versions, |
| 153 | +may not be supported or covered by this BIP and may require addition of new |
| 154 | +fields to the PSBT inputs. |
| 155 | + |
| 156 | + |
| 157 | +==Reference implementation== |
| 158 | + |
| 159 | +WIP |
| 160 | + |
| 161 | + |
| 162 | +==Acknowledgements== |
| 163 | + |
| 164 | +TBD |
| 165 | + |
| 166 | + |
| 167 | +==Test vectors== |
| 168 | + |
| 169 | +TBD |
| 170 | + |
| 171 | + |
| 172 | +==References== |
| 173 | + |
| 174 | +[1] Ilja Gerhardt, Timo Hanke. Homomorphic Payment Addresses and the |
| 175 | + Pay-to-Contract Protocol. arXiv:1212.3257 \[cs.CR\] |
| 176 | + <https://arxiv.org/pdf/1212.3257.pdf> |
| 177 | +[2] Eternity Wall's "sign-to-contract" article. |
| 178 | + <https://blog.eternitywall.com/2018/04/13/sign-to-contract/> |
| 179 | +[3] Peter Todd. OpenTimestamps: Scalable, Trust-Minimized, Distributed |
| 180 | + Timestamping with Bitcoin. |
| 181 | + <https://petertodd.org/2016/opentimestamps-announcement> |
| 182 | +[4] Adam Back, Matt Corallo, Luke Dashjr, et al. Enabling Blockchain |
| 183 | + Innovations with Pegged Sidechains (commit5620e43). Appenxix A. |
| 184 | + <https://blockstream.com/sidechains.pdf>;. |
| 185 | +[5] Maxim Orlovsky, Rene Pickhardt, Federico Tenga, et al. Key |
| 186 | + tweaking: collision- resistant elliptic curve-based commitments. |
| 187 | + LNPBP-1 Standard. |
| 188 | + <https://github.com/LNP-BP/LNPBPs/blob/master/lnpbp-0001.md> |
| 189 | +[6] Peter Todd. Single-use-seals. LNPBP-8 Standard. |
| 190 | + <https://github.com/LNP-BP/LNPBPs/blob/master/lnpbp-0008.md> |
0 commit comments