BIP376: Spending Silent Payment outputs with PSBTs #2089

pull nymius wants to merge 14 commits into bitcoin:master from nymius:bip-spending-silent-payments-outputs-with-psbts changing 2 files +136 −0
  1. nymius commented at 10:07 pm on January 19, 2026: contributor

    Abstract

    This document proposes an additional per input field for BIP 370 PSBTv2 that allows BIP 352 silent payment tweaks to be included in a PSBT of version 2. This field will be relevant to silent payment outputs spending.

    Mailing list discussion: https://groups.google.com/g/bitcoindev/c/Kap7NMwzl2k Delving bitcoin discussion: https://delvingbitcoin.org/t/bip352-psbt-support/877/32

  2. bip-draft: spending silent payment outputs with psbts 9159b40629
  3. in bip-spending-silent-payments-outputs-with-psbts.mediawiki:14 in 9159b40629
     9+  License: BSD-2-Clause
    10+  Discussion: 2024-05-17: https://delvingbitcoin.org/t/bip352-psbt-support/877/30 [delving bitcoin post] Original discussion
    11+              2025-12-05: https://gist.github.com/nymius/b3dd0b8a08c6735d617e6216b73c4260 [gist] First draft
    12+              2025-12-15: https://gnusha.org/pi/bitcoindev/R53cG3TeXgXDUUS4kH_q226GlaFCjI0DZVT6mdTQzSQdj3RnNqWA-bFT7uGgGQFJG6938kDGvDJVoFQj8ItEMsJ6NyOjCTvpVEarYiyW6-8=@proton.me/ [bitcoin-dev] [BIP Proposal] Add PSBT_IN_SP_TWEAK field
    13+  Version: 0.1.0
    14+  Requires: 352, 375, 371
    


    murchandamus commented at 11:56 pm on January 26, 2026:
    0  Requires: 352, 370, 371, 375
    

    nymius commented at 7:51 pm on January 29, 2026:

    I’m not sure about BIP 375. It is related, but not needed by this specification. BIP 3 states the following for the Requires field:

    A list of existing BIPs the new proposal depends on.

    Shall I remove it?


    murchandamus commented at 9:24 pm on February 3, 2026:
    Sure, if your proposal doesn’t depend on it, you can remove it. I didn’t check the list, I just sorted it and added 370, because the first sentence said that you were adding a field to PSBTv2s, which is BIP 370. :)
  4. in bip-spending-silent-payments-outputs-with-psbts.mediawiki:31 in 9159b40629
    26+
    27+The existing PSBT fields are unable to support silent payments without changes, due to the new method by which outputs are created.
    28+
    29+BIP 375 and complementary BIP 374 specify how to create outputs locked with silent payment keys using PSBTs. But they don't specify how to unlock these outputs in a transaction.<ref name="why_not_adding_this_field_in_bip_375">''' Why not including this new field in BIP 375?''' Historically, Silent Payments have been categorized by the perspective of the user of the protocol: receiver or sender. BIP 375 has followed this convention, and its stated on its title: Sending Silent Payments with PSBTs. Given that spending belongs to the sphere of the receiver, and considering this convention, this specification should be a different BIP.</ref>
    30+
    31+Therefore a new field must be defined to allow PSBTs to carry the information necessary for tweaking taproot keys without following the BIP 340 tagging scheme.
    


    murchandamus commented at 0:00 am on January 27, 2026:
    I’m not sure what “without following the BIP 340 tagging scheme” is referring to here.

    nymius commented at 7:16 pm on January 29, 2026:
    This is a typo, should be 341 instead of 340. I was referring to the “constructing and spending taproot outputs” section from BIP 341, particularly the Computing the output script and Spending using the key path subsections. The main differences are related to the tag names and the committed data. For example, in taproot, the tweak is committed to the internal key, and is later added to that same key. On the contrary, in silent payments there can be two tweaks (first difference), let’s call them A and B, where B is optional. Tweak A is modifying public key T, but is not committing to public key T (second difference if we extrapolate public key T as our internal key). The idea is later developed when I mention that we cannot disguise silent payment tweaks as a merkle root even if tag names weren’t an issue.

    murchandamus commented at 9:27 pm on February 3, 2026:
    Okay, if you feel it’s clear enough, it’s fine with me, I was just reading it fairly quickly.
  5. in bip-spending-silent-payments-outputs-with-psbts.mediawiki:84 in 9159b40629
    79+
    80+Once a silent payment UTXO is scanned, is easier to store the output together with the tweak that generated it.
    81+
    82+To avoid the burden on the signer it would be better to pass this data into the PSBT together with the input spending the silent payment. Currently, there is no field prescribed for this. 
    83+
    84+The <tt>PSBT_IN_BIP32_DERIVATION</tt> field cannot be used because its different nature, neither the <tt>PSBT_IN_TAP_MERKLE_ROOT</tt> field because of the tagged hash used for tweaking.
    


    murchandamus commented at 0:02 am on January 27, 2026:
    0The <tt>PSBT_IN_BIP32_DERIVATION</tt> field cannot be used because of its different nature, neither can the <tt>PSBT_IN_TAP_MERKLE_ROOT</tt> field because of the tagged hash used for tweaking.
    
  6. in bip-spending-silent-payments-outputs-with-psbts.mediawiki:86 in 9159b40629
    81+
    82+To avoid the burden on the signer it would be better to pass this data into the PSBT together with the input spending the silent payment. Currently, there is no field prescribed for this. 
    83+
    84+The <tt>PSBT_IN_BIP32_DERIVATION</tt> field cannot be used because its different nature, neither the <tt>PSBT_IN_TAP_MERKLE_ROOT</tt> field because of the tagged hash used for tweaking.
    85+
    86+A change of the hash tag used for silent payments to <tt>TapTweak</tt> or something compatible with taproot tweaking wouldn't make sense: although the raw tweak can be disguised as the tap tree merkle root for spending, at the moment of verifying change outputs, you need the full tap tree, and there would be none backing this fake merkle root.
    


    murchandamus commented at 0:04 am on January 27, 2026:
    0A change of the hash tag used for silent payments to <tt>TapTweak</tt> or something compatible with taproot tweaking wouldn't make sense: although the raw tweak can be disguised as the script tree merkle root for spending, at the moment of verifying change outputs, you need the full script tree, and there would be none backing this fake merkle root.
    
  7. in bip-0376.mediawiki:13 in 9159b40629 outdated
     8+  Assigned: ?
     9+  License: BSD-2-Clause
    10+  Discussion: 2024-05-17: https://delvingbitcoin.org/t/bip352-psbt-support/877/30 [delving bitcoin post] Original discussion
    11+              2025-12-05: https://gist.github.com/nymius/b3dd0b8a08c6735d617e6216b73c4260 [gist] First draft
    12+              2025-12-15: https://gnusha.org/pi/bitcoindev/R53cG3TeXgXDUUS4kH_q226GlaFCjI0DZVT6mdTQzSQdj3RnNqWA-bFT7uGgGQFJG6938kDGvDJVoFQj8ItEMsJ6NyOjCTvpVEarYiyW6-8=@proton.me/ [bitcoin-dev] [BIP Proposal] Add PSBT_IN_SP_TWEAK field
    13+  Version: 0.1.0
    


    murchandamus commented at 0:06 am on January 27, 2026:
    Nit: Version corresponds to the latest line in the Changelog section, but there is no Changelog section here, yet.
  8. in bip-0376.mediawiki:103 in 9159b40629 outdated
     98+'''''TODO'''''
     99+
    100+== Reference implementation ==
    101+
    102+'''''TODO'''''
    103+
    


    murchandamus commented at 0:08 am on January 27, 2026:
    Copyright section is missing.
  9. murchandamus commented at 0:10 am on January 27, 2026: member
    This is a good start, most parts seem to already be here. Would be great to get some more eyes on this from other people working on Silent Payments.
  10. murchandamus added the label New BIP on Jan 27, 2026
  11. bip-draft(bip352/spending/psbt): reference BIP 370 as dependency for this proposal fd66836e43
  12. bip-draft(bip352/spending/psbt): fix typo `BIP 340` -> `BIP 341` 4ac8948f87
  13. bip-draft(bip352/spending/psbt): fix grammar 9b4b2004e0
  14. bip-draft(bip352/spending/psbt): add missing Copyright section 26c6685c06
  15. bip-draft(bip352/spending/psbt): add Changelog section 858275ea6c
  16. bip-draft(bip352/spending/psbt): add 'Test vectors' section as subsection of 'Reference implementation' d3b7256d52
  17. nymius commented at 7:52 pm on January 29, 2026: contributor
    I have pushed the changes in separated commits, to squash later. Thanks for the feedback!
  18. murchandamus commented at 9:32 pm on February 3, 2026: member
    What’s the next step here? Will you be asking for people to provide some review, do you still have planned work, are there any open questions?
  19. nymius commented at 4:11 pm on February 4, 2026: contributor
    So far, I haven’t received any negative feedback on the proposal, so I plan to do a second round of review on the rationale. I would like to steel-man the argument for this approach against the other alternatives. Since the feedback occurred outside the designated channels, I will try to move the discussion there whenever possible.
  20. murchandamus added the label Needs number assignment on Feb 4, 2026
  21. murchandamus commented at 6:27 pm on February 5, 2026: member
    Assigned BIP376. Please update the BIP and Assigned headers in the preamble, add a table entry in the README for your proposal, and update your documents filename.
  22. murchandamus renamed this:
    BIP Draft: Spending Silent Payment outputs with PSBTs
    BIP376: Spending Silent Payment outputs with PSBTs
    on Feb 5, 2026
  23. murchandamus removed the label Needs number assignment on Feb 5, 2026
  24. bip-draft(bip352/spending/psbt): remove BIP 375 from required BIPs de04a56893
  25. bip376: update header with assigned number and date of assignment dd626e9a2b
  26. bip376: rename draft document 4d17a191d8
  27. bip376: add reference in README's BIP table aa4c4edc46
  28. nymius force-pushed on Feb 5, 2026
  29. nymius commented at 8:47 pm on February 5, 2026: contributor

    While weighing the requirement of BIP 375, I detected there is no mention of how to source the base key to which the PSBT_IN_SP_TWEAK is added.

    I have multiple ideas for this:

    • The 33 byte spend public key is included in the keydata from the new field.
    • The derivation information of the spend key is included in the corresponding BIP 32 fields.
    • The spend public key is transformed into a 32 xonly public key and it is included in one of the BIP 371 fields and both parities are considered.
    • This is left unspecified and the signer should implement a way to match the private key with the input and the tweak.

    This would be a source of ambiguity. I will consider the options and update once I’ve a conclusion.

  30. murchandamus added the label PR Author action required on Feb 6, 2026
  31. murchandamus commented at 0:33 am on February 6, 2026: member
    Okay, I’ll consider this in your court until you state otherwise in a comment here. :)
  32. craigraw commented at 7:38 am on February 6, 2026: contributor

    Good catch. I don’t think this should be left unspecified.

    Further, I think this choice can be simplified by considering the requirements of hardware wallets. I checked the firmware for both the Coldcard and the BitBox02 - both derive private keys from derivation paths, not public keys.

    While you could use PSBT_IN_BIP32_DERIVATION, there may be some confusion with PSBT_OUT_TAP_BIP32_DERIVATION since BIP352 spends Taproot outputs.

    To avoid this I suggest creating a new field called PSBT_IN_SP_SPEND_BIP32_DERIVATION which contains the same keydata and valuedata definitions used for PSBT_IN_BIP32_DERIVATION.

  33. bip376: remove paragraph proposing changes to BIP 352
    After considering how to explain the difficulty of making BIP 341 and
    BIP 352 compatible to avoid the addition of this field, I decided to
    remove the paragraph completely, because at the end, the discussion if
    BIP 352 could have been made differently to be compatible with BIP 341
    tag hashes and reuse BIP 371 fields, belongs to BIP 352 and not here.
    This BIP should consider BIP 352 as it is. Changes to BIP 352 belong to
    a different BIP proposal.
    03e925c22f
  34. bip376: add PSBT_IN_SP_SPEND_BIP32_DERIVATION field 4bc76226f5
  35. bip376: unify Silent Payment protocol mentions in document 2a3ca6aa27
  36. nymius force-pushed on Feb 11, 2026
  37. nymius commented at 4:34 pm on February 11, 2026: contributor

    I have revised the spec to address grammar and phrasing, and included the following updates regarding content:

    • Following @craigraw suggestion (thanks!) I added a new PSBT_IN_SP_BIP32_DERIVATION field:
      • I considered other alternatives that do not adhere to the BIP 32 scheme, such as FROST. However, as the PSBT specification is primarily built around the BIP 32 derivation scheme, I decided not to deviate from that standard. When the time comes, these protocols will likely propose updates to align with the PSBT specification. I added a reference at the end explaining this.
      • I moved the PSBT_IN_SP_TWEAK below this new field.
      • I added a paragraph to the rationale justifying the creation of this new field rather than reusing one of the existing *_BIP32_DERIVATION fields.
    • I removed a paragraph from the rationale regarding the complexity of making BIP 341 and BIP 352 compatible to reuse Taproot BIP 371 fields (03e925c22f595b58fce3ba7e007227b4c59ed90d): I realized that the discussion of whether BIP 352 could have been designed to comprise BIP 341 tag hashes pertains to BIP 352 itself, not this document. This BIP should address BIP 352 as currently defined; changes to the BIP 352 standard belong to a different proposal.
  38. in bip-0376.mediawiki:43 in 2a3ca6aa27
    38+* ser<sub>256</sub>(p): serializes the integer p as a 32-byte sequence, most significant byte first.
    39+* ser<sub>P</sub>(P): serializes the coordinate pair P = (x,y) as a byte sequence using SEC1's compressed form: (0x02 or 0x03) || ser<sub>256</sub>(x), where the header byte depends on the parity of the omitted Y coordinate.
    40+* ''hash<sub>tag</sub>(x)'': refers to ''SHA256(SHA256(tag) || SHA256(tag) || x)''.
    41+
    42+=== Fields ===
    43+
    


    macgyver13 commented at 4:04 pm on February 16, 2026:

    I would suggest including the following:

    0This document specifies new fields and new field inclusion/exclusion requirements.
    1
    2The new per-input types are defined as follows:
    
  39. macgyver13 commented at 4:26 pm on February 16, 2026: contributor

    Concept ACK 2a3ca6a

    Thank you for putting this BIP forward. I support the addition of these two PSBT fields for spending Silent Payments outputs.

    Regarding the BIP text I would like to see more explicit use of language to describe the inclusion of these fields for spending Silent Payments, similar to BIP-375 (PSBT_OUT_SCRIPT / PSBT_OUT_SP_V0_INFO). I think the Rationale explains the reasoning but having a more clear specification would reduce ambiguity. I am on the fence as to whether to include the following as general spec statements or in a specific role.

    • PSBT_IN_SP_TWEAK must be included when an input spends a Silent Payment output
    • PSBT_IN_SP_SPEND_BIP32_DERIVATION should be included when spending a Silent Payment output using BIP 32 derivation schemes

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bips. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-02-17 00:10 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me