#35302 Silent Payments: Sending (take 2)

full analysis

https://github.com/bitcoin/bitcoin/pull/35302 · Eunovo · +8745/-114 in 47 files, 18 commits · labels: Needs rebase · draft

Goal

  • Allow wallet users to send BIP 352 silent payments
  • Improve on-chain privacy and eliminate address reuse by generating unique unlinked taproot outputs

Implements BIP 352 Silent Payments sending support in the Bitcoin Core wallet. It introduces address parsing and encoding for silent payments destinations, wraps libsecp256k1 silentpayments routines in common utilities, updates coin selection to ensure eligible inputs for shared secret derivation, and handles recipient script generation and RBF recomputation.

Problem: Traditional Bitcoin payments encourage address reuse or require interactive setup between sender and recipient, compromising user privacy on-chain. Silent payments allow senders to generate unique, unlinked taproot outputs from a recipient's static public address.

Category: Wallet (#16 of 84)

P2 · new feature

  • P2 because it brings a major privacy improvement for wallet users
  • Unblocks silent payments receiving support and the broader silent payments roadmap

Adds the sending side of BIP 352 Silent Payments, delivering a major privacy feature for wallet users and advancing the broader Silent Payments project tracked in issue #28536.

Membership: Extensively modifies wallet coin selection, spend, transaction construction, and wallet database records to support silent payments sending.

Factors: security/stability 1, bug 0, performance 0, user value 3, leverage 2

Category: Utilities (logging, arguments, libraries) (#53 of 66)

P3 · new feature

  • P3 because it adds shared BIP 352 cryptographic wrappers in common utilities
  • Provides reusable helper code for wallet operations and future indexing utilities

Introduces shared BIP 352 cryptographic wrappers in src/common/ designed to support wallet operations, RPCs, and potential indexing utilities.

Membership: Adds src/common/bip352.cpp and src/common/bip352.h wrapping libsecp256k1 silentpayments routines for shared use across the node and wallet.

Factors: security/stability 1, bug 0, performance 0, user value 2, leverage 2

Reviewability: Stale: Needs rebase

  • Review #35301 first
  • Needs rebase due to merge conflicts with master

The PR has merge conflicts with master and is explicitly dependent on unmerged prerequisite PR 35301.

Author status: active through July 2026 addressing test review, currently pending rebase

Resolved concerns:

  • theStack pointed out missing explicit checks against TxoutType enumeration in scriptpubkeyman and suggested code simplifications, which were adopted.
  • rkrux suggested testing bumpfee output replacement, context managers, and removing deprecated createwallet parameters, which were implemented.

Agreement: Positive

  • Concept approval (rkrux)
  • Feedback on script handling and spend RPCs was resolved (theStack)
  • Suggestions on functional tests and bumpfee test coverage were addressed (rkrux)

Concept ACK from rkrux; code and test feedback from theStack and rkrux was resolved.

Reviewers have expressed concept support and reviewed code and functional tests. All raised issues have been addressed by the author across subsequent updates.

  • rkrux gave Concept ACK (2026-05-20)
  • theStack gave inline comments on scriptpubkeyman and rpc spend which were addressed (2026-05-23, 2026-06-07)
  • rkrux reviewed functional tests and suggested coverage for bumpfee and test cleanup, addressed by author (2026-06-24 to 2026-07-01)

Review verdicts (DrahtBot): 0

Dependencies

Depends on: #35301

Enables:

  • Silent Payments milestone tracking issue #28536
  • Silent Payments receiving #32966

Files

7327 lines under test/bench/ci.

  • src/test/data/bip352_send_and_receive_vectors.json +5729/-0
  • test/functional/wallet_silentpayments_sending.py +588/-0
  • src/common/bip352.cpp +380/-0
  • src/test/bip352_tests.cpp +282/-0
  • src/wallet/spend.cpp +278/-4
  • test/functional/rpc_scantxforsilentpayments.py +230/-0
  • src/wallet/test/coinselector_tests.cpp +170/-0
  • src/common/bip352.h +160/-0
  • test/functional/wallet_sendall.py +101/-58
  • src/rpc/output_script.cpp +131/-0
  • src/wallet/rpc/spend.cpp +90/-18
  • src/wallet/feebumper.cpp +69/-14
  • src/key_io.cpp +77/-3
  • src/addresstype.h +69/-1
  • src/test/data/key_io_valid.json +51/-0
  • src/test/key_io_tests.cpp +39/-8
  • src/wallet/transaction.h +43/-0
  • src/wallet/walletdb.cpp +37/-0
  • src/addresstype.cpp +27/-0
  • src/test/data/key_io_invalid.json +27/-0
  • src/wallet/scriptpubkeyman.cpp +26/-0
  • src/wallet/wallet.cpp +23/-2
  • src/test/fuzz/util.cpp +20/-0
  • src/key.h +13/-0
  • src/test/fuzz/script.cpp +11/-1
  • src/wallet/receive.cpp +11/-0
  • src/wallet/spend.h +10/-0
  • src/kernel/chainparams.cpp +5/-0
  • src/rpc/util.cpp +5/-0
  • src/wallet/wallet.h +4/-1
  • src/wallet/walletdb.h +5/-0
  • src/script/descriptor.cpp +4/-0
  • src/test/transaction_tests.cpp +2/-2
  • src/wallet/coinselection.h +4/-0
  • src/wallet/feebumper.h +3/-1
  • src/wallet/scriptpubkeyman.h +4/-0
  • src/test/descriptor_tests.cpp +3/-0
  • src/kernel/chainparams.h +2/-0
  • src/test/CMakeLists.txt +2/-0
  • src/wallet/coincontrol.h +2/-0
  • src/wallet/interfaces.cpp +1/-1
  • test/functional/test_runner.py +2/-0
  • src/CMakeLists.txt +1/-0
  • src/bech32.h +1/-0
  • src/test/fuzz/rpc.cpp +1/-0
  • src/wallet/receive.h +1/-0
  • src/wallet/rpc/addresses.cpp +1/-0

Card

PR 35302 implements sending support for BIP 352 Silent Payments in the Bitcoin Core wallet. It enables senders to pay static silent payment addresses without on-chain address reuse by deriving taproot outputs from selected inputs and recipient public keys, alongside coin selection and RBF handling. This constitutes a major milestone for the project's silent payments roadmap (#28536). The PR is currently marked draft, needs a rebase against master, and relies on prerequisite PR 35301.

Data

dossier JSON · extract JSON · model openrouter/google/gemini-3.8-flash, generated 2026-09-17T15:52, confidence high, input hash 96e21b02c106f4f1