Skip to content
BIP ATLAS

BIP 0352

Can you receive without handing out an address?

Silent payments let a receiver publish one static address while every payment lands on a fresh taproot output. The price is that the receiver has to scan transactions to find them.

Paying the same address again and again ties every payment together. The usual remedy, a fresh address for each payment, means the receiver has to hand each sender something new: an address, a batch of addresses, or an xpub. BIP 352, assigned in 2023 and recorded as Complete, specifies another arrangement: a static address the receiver can publish once, without on-chain notifications and, in the BIP’s words, without on-chain linkability of payments.123

The address is long: 116 characters for version 0 on mainnet, always starting sp1q. Inside are two public keys of 33 bytes each, a scan key and a (possibly labeled) spend key. A sender never pays to either of them. It pays to a new taproot key computed from those two keys and from the inputs of its own transaction.4567

Source revision
bitcoin/bips @ 3a10b5b
Source checked
1 October 2026
Review state
Draft — independent technical review applied; awaiting human sign-off
Source details

This chapter is an independent explanation, not the proposals themselves. Preamble fields are shown as recorded in the pinned files, with author e-mail addresses omitted. Status is the proposal’s own field, not an endorsement or a sign of consensus.

BIP 352: Silent Payments

BIP
352
Layer
Applications
Title
Silent Payments
Authors
josibake
Ruben Somsen
Sebastian Falbesoner
Status
Complete
Type
Specification
Assigned
2023-03-09
License
BSD-2-Clause
Version
1.1.1
Requires
340, 341, 350

Pinned source · Reader view on bips.dev
SHA-256 a64d3b9ecc004ea4ae4c168e4631571f16e35eaa66595599729c6c066de4cff4
Git blob a369555d831ae5b409eb5dfa8f12d17851703fef

FIG. A15.1 Inside an sp1 address

sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv

  • sp human-readable part, mainnet (tsp on testnets)
  • 1 separator
  • q version 0
  • 106 characters B_scan ‖ B_m, 66 bytes
  • 9pkqwv bech32m checksum

Decoded: scan key 0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4, spend key 025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36.

Address from BIP 352’s first test vector (116 characters), re-encoded from the receiver’s keys by the tested model.

The address from BIP 352’s first test vector, split into its parts: the prefix, the version character, two public keys, and the checksum.458

A secret two parties can compute

The idea is elliptic-curve Diffie–Hellman. If Alice holds the private key a for public key A, and Bob holds b for B, then a·B and b·A are the same point. In BIP 352’s simple case, Alice pays Bob at P = B + hash(a·B)·G. Bob sees A in Alice’s transaction, computes hash(b·A) himself, and looks for P among the outputs. Under the usual Diffie–Hellman assumption, anyone without a or b cannot compute that hash, so cannot connect P to B.910

The full protocol adds three refinements. Alice uses all her eligible inputs at once: a is the sum of their private keys and A the sum of their public keys. She multiplies by an input hash, a tagged hash of the smallest outpoint in the transaction and A, so that a second payment from the same keys does not land on the same output. And Bob’s address carries two keys: B_scan for finding payments and B_spend for spending them, so the scanning key can sit on an online machine while the spending key stays in cold storage.61112

The shared secret is input_hash·a·B_scan on Alice’s side and input_hash·b_scan·A on Bob’s; they are the same point. From it Alice derives t_k, a tagged hash of the secret and a counter k, and pays to P_k = B_spend + t_k·G, starting with k = 0 and adding one for each further output to the same receiver. To spend, Bob uses b_spend + t_k (plus the label tweak, for a labeled output), mod n, as the private key.131415

FIG. A15.2 One payment, seen from both sides Interactive

A · Interactive

Static view: the sender’s side of the first vector, with every step shown. With JavaScript you can switch to the receiver, pick other vectors and hide the intermediate steps.

Inputs: which keys count

  1. P2PKHf4184fc5…:0key 025a1e61f8…dd9be5
  2. P2PKHa1075db5…:0key 03bd85685d…be3792

Sender: a = Σ aᵢ, secret = input_hash · a · B_scan

address paid
sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv
its B_scan · B_m
0220bcfac5…6c96d4 · 025cc9856d…8fcf36
A = a·G (sum of input keys)
032562c1ab…dc4bee
smallest outpoint
169e1e83e9…000000
input_hash
5bfe5321d7…ad0668
shared secret
028158aff7…14d80d (sender and receiver compute the same point)

Outputs created: P_k = B_m + t_k·G

  1. taproot key 3e9fce73d4e77a4809908e3c3a2e54ee147b9312dc5044a193d1fc85de46e3c1

t_k is a tagged hash of the shared secret and k. Each output is an ordinary taproot output; nothing in it mentions the address.

Source: BIP 352 send_and_receive_test_vectors.json, “Simple send: two inputs” (line 3). Recomputed at build time by the tested model and checked against the vector’s outputs, shared secret and found outputs.

B · Worked example

BIP 352’s first send-and-receive vector, “Simple send: two inputs”: from a static address to an output only the receiver can recognise.

12345
  1. The receiver publishes one static address

    address
    sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv
    B_scan
    0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4
    B_spend
    025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36
  2. The sender's eligible inputs give A

    input 1 key
    025a1e61f898173040e20616d43e9f496fba90338a39faa1ed98fcbaeee4dd9be5
    input 2 key
    03bd85685d03d111699b15d046319febe77f8de5286e9e512703cdee1bf3be3792
    A = sum
    032562c1ab2d6bd45d7ca4d78f569999e5333dffd3ac5263924fd00d00dedc4bee
  3. Input hash over the smallest outpoint and A

    smallest outpoint
    169e1e83e930853391bc6f35f605c6754cfead57cf8387639d3b4096c54f18f400000000
    input_hash
    5bfe5321d759e01a2ac9292f0f396ff9c3d8b58d89ccb21a6922e84bb7ad0668
  4. Both sides reach the same ECDH secret

    input_hash·a·B_scan = input_hash·b_scan·A
    028158aff7d61ea66b2fa7f555bc3c5937d1debbde16423d630f9aa7943e14d80d

    The sender used the inputs' private keys; the receiver used b_scan and the public A. Same point.

  5. Output P₀ = B_spend + t₀·G, found by the receiver's scan

    output key
    3e9fce73d4e77a4809908e3c3a2e54ee147b9312dc5044a193d1fc85de46e3c1

    The output is an ordinary taproot key; only the sender and whoever holds b_scan can recognise it.

Source: BIP 352 send_and_receive_test_vectors.json (line 3); recomputed by the tested model and checked against the vector.

Six of BIP 352’s send-and-receive vectors, recomputed by the tested model. The sender’s outputs, the receiver’s shared secret and the outputs the receiver finds all equal the published values.13141617

Each output is an ordinary BIP 341 taproot output. Among the authors’ stated goals are no increase in the size or cost of transactions, transactions that blend in with other bitcoin transactions, and no way for an outside observer to link them to a silent payment address.710

Which inputs count

Not every input contributes to the secret. Any UTXO with a known output script can fund the transaction (though the sender leaves out outputs with a SegWit version above 1), but sender and receiver MUST derive the shared secret only from inputs of four types: P2TR, P2WPKH, P2SH-P2WPKH and P2PKH. For each, the receiver has to find the public key in what the transaction reveals: the last witness item for the two P2WPKH forms, the scriptSig for P2PKH, and the taproot output key itself for P2TR.181920

Inputs with conditional branches or several keys, such as CHECKMULTISIG, are left out; the BIP explains that they would let a participant in a collaborative transaction re-sign with different keys after the output was derived. Only compressed and x-only keys count, so an input that reveals an uncompressed key is skipped. A taproot script-path spend still counts, through its output key: the sender MUST hold that key’s private key or leave the input out, unless the internal key is the NUMS point H from BIP 341, in which case the input is skipped.1921222324

Two details keep sender and receiver in step. A taproot key is x-only, and the receiver assumes the even-y point when it sums the keys, so the sender negates any taproot private key whose point has odd y. And for P2PKH, the receiver MUST parse the scriptSig for the key even when it does not match the usual template, because a third party can malleate a P2PKH scriptSig.2526

FIG. A15.3 Inputs that count, inputs that do not

Simple send: two inputs

  • P2PKHcounts: key 025a1e61f8…dd9be5
  • P2PKHcounts: key 03bd85685d…be3792

Pubkey extraction from malleated p2pkh

  • P2PKHcounts: key 025a1e61f8…dd9be5
  • P2PKHcounts: key 03782eeb91…323338
  • P2PKHcounts: key 02e0ec4f64…f1f85d

P2PKH and P2WPKH Uncompressed Keys are skipped

  • P2PKHcounts: key 025a1e61f8…dd9be5
  • P2PKHskipped: no compressed key in the scriptSig hashes to the output
  • P2WPKHskipped: last witness item is not a compressed key

Skip invalid P2SH inputs

  • P2SH-P2WPKHcounts: key 025a1e61f8…dd9be5
  • P2SH-P2WPKHskipped: last witness item is not a compressed key
  • P2SHskipped: P2SH, but not wrapping P2WPKH

Single recipient: taproot input with NUMS point

  • P2TRskipped: script-path spend with the NUMS internal key H
  • P2TRcounts: key 02782eeb91…323338
  • P2TRskipped: script-path spend with the NUMS internal key H

Inputs from BIP 352’s test vectors, read by the tested model’s transcription of the reference get_pubkey_from_input.

The inputs of five published vectors, read by the tested model: which contribute a key, and why the others are skipped.18222327

A transaction with no eligible input has no secret at all, so a sender’s coin selection MUST include at least one.28

The receiver has to look

Nothing on chain tells Bob a payment has arrived. For silent payments v0, a transaction MUST be scanned if and only if it has at least one taproot output, at least one eligible input, and spends no output with a SegWit version above 1. For each such transaction Bob sums the input keys, computes the input hash and the shared secret, and checks the taproot outputs for P_0.13293031

If P_0 is there, he checks for P_1, and so on; at the first one not found, he stops. These extra checks happen only after a match, so the authors call the added cost negligible. Since version 1.1.0 the search is also capped: a sender fails if any group of recipient addresses sharing one scan key is larger than K_max = 2323, and a receiver stops at k = 2323, which the changelog says mitigates quadratic scanning on adversarial transactions.14313233

Labels let Bob tell payments apart without scanning for several addresses. He publishes (B_scan, B_m), where B_m = B_spend + hash(b_scan ‖ m)·G. When an output does not match P_k directly, he subtracts P_k and checks whether the difference is one of his label points; if not, he negates the output and tries again, because an x-only output does not say which y it had. Label m = 0 is reserved for change: the BIP stresses that a wallet never hands it out, and says every receiving wallet should at least scan for it when recovering from backup.17343536

The scanning cost is real. The authors note that it is generally feasible for full nodes but poses a challenge for light clients, and they treat light-client support as open research. An appendix, outside the specification, sketches how a light client might fetch per-transaction tweak data and check BIP 158 block filters.3037

What it does not hide

The authors’ goal is that outside observers cannot link a transaction to a silent payment address. Even so, the scheme does not hide everything. Every labeled address shares the same B_scan, so anyone can tell that they belong to one receiver; the BIP says labels are not a way to manage separate identities.1038

The sender has rules of its own. It should sign with DEFAULT, ALL, SINGLE or NONE; the BIP calls ANYONECANPAY unsafe. And every output it generated MUST appear in the final transaction: if P_1 were dropped, the receiver, stopping at the first gap, would never find P_2.4041

Recovery needs scanning too. Each output is derived on its own, so the BIP recommends regular backups, and a wallet restored from its seed alone has to scan the chain from its birthday to rebuild its full history.42

Evidence

Each numbered marker in the text points here, and the ↩ links lead back to every place that cites an entry. Quotes are verbatim from the BIP files at commit 3a10b5b, including their wiki markup; links open the exact lines; the quoted text sits under each entry. Labels say what kind of statement each is: a rule, the author’s rationale, history, a test vector, or our own inference.

  1. ↩ Author’s rationale The authors motivate the BIP by the privacy value of fresh addresses, which usually needs sender-receiver interaction (an address, a batch, or an xpub).

    Quoted source text (1)

    Using a new address for each Bitcoin transaction is a crucial aspect of maintaining privacy. This often requires a secure interaction between sender and receiver, so that the receiver can hand out a fresh address, a batch of fresh addresses, or a method for the sender to generate addresses on-demand, such as an xpub.

    BIP 352, line 32
  2. ↩ History BIP 352 (josibake, Ruben Somsen, Sebastian Falbesoner) is a Specification BIP assigned in 2023 and recorded as Complete; this snapshot is version 1.1.1.

    Quoted source text (2)

    Title: Silent Payments Authors: josibake <josibake@protonmail.com> Ruben Somsen <rsomsen@gmail.com> Sebastian Falbesoner <sebastian.falbesoner@gmail.com> Status: Complete Type: Specification Assigned: 2023-03-09

    BIP 352, lines 4–10

    Version: 1.1.1

    BIP 352, line 16
  3. ↩ Rule BIP 352 specifies static payment addresses without on-chain linkability of payments or on-chain notifications.

    Quoted source text (1)

    This document specifies a protocol for static payment addresses in Bitcoin without on-chain linkability of payments or a need for on-chain notifications.

    BIP 352, line 24
  4. ↩ a b Rule An address is bech32m with HRP sp (mainnet) or tsp, the character q for version 0, and the 66-byte concatenation of B_scan and B_m; a v0 mainnet address is 116 characters.

    Quoted source text (2)

    ** The human-readable part "sp" for mainnet, "tsp" for testnets (e.g. signet, testnet) ** The data-part values: *** The character "q", to represent a silent payment address of version 0 *** The 66-byte concatenation of the receiver's public keys, ''ser<sub>P</sub>(B<sub>scan</sub>) || ser<sub>P</sub>(B<sub>m</sub>)''

    BIP 352, lines 205–209

    For a silent payments v0 address, this results in a 116-character address when using the 2-character mainnet HRP ("sp")

    BIP 352, line 221
  5. ↩ a b Rule Version 0 addresses start sp1q; the version is carried as in bech32 addresses.

    Quoted source text (1)

    This document defines version 0 (''sp1q'').

    BIP 352, line 149
  6. ↩ a b Author’s rationale An address carries a scan key and a spend key so b_spend can stay in cold storage while scanning uses b_scan.

    Quoted source text (1)

    Bob can instead publish an address of the form ''(B<sub>scan</sub>, B<sub>spend</sub>)''. This allows Bob to keep ''b<sub>spend</sub>'' in offline cold storage and perform the scanning with the public key ''B<sub>spend</sub>'' and private key ''b<sub>scan</sub>''.

    BIP 352, line 110
  7. ↩ a b Rule Receiver outputs are always BIP 341 taproot outputs.

    Quoted source text (1)

    * Receiver addresses are always [https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki BIP341] taproot outputs

    BIP 352, line 185
  8. ↩ Test vector The first vector's address decodes to two 33-byte compressed keys, and the model re-encodes the same 116-character address.

    Quoted source text (1)

    The 66-byte concatenation of the receiver's public keys

    BIP 352, line 209
  9. ↩ Rule Simple case: Alice pays P = B + hash(a·B)·G; since a·B == b·A (ECDH), Bob finds P by computing hash(b·A) from the input public keys.

    Quoted source text (2)

    * Let ''P = B + hash(a·B)·G'' * Encode ''P'' as a [https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki BIP341] taproot output Since ''a·B == b·A''

    BIP 352, lines 65–68

    Bob scans with his private key ''b'' by collecting the input public keys for each transaction with at least one unspent taproot output and performing the ECDH calculation until ''P'' is found

    BIP 352, line 68
  10. ↩ a b c Author’s rationale The stated goals include no increase in transaction size or cost, transactions that blend in, and no linking of transactions to a silent payment address by an outside observer.

    Quoted source text (1)

    * No increase in the size or cost of transactions * Resulting transactions blend in with other bitcoin transactions and can't be distinguished * Transactions can't be linked to a silent payment address by an outside observer

    BIP 352, lines 44–46
  11. ↩ Rule The sender tweaks with the sum of the input private keys, a = a1 + … + an, and A = a·G.

    Quoted source text (1)

    Alice performs the tweak with the sum of her input private keys in the following manner: * Let ''a = a<sub>1</sub> + a<sub>2</sub> + ... + a<sub>n</sub>'' * Let ''A = a·G''

    BIP 352, lines 101–104
  12. ↩ Rule The input hash prevents a second payment from the same key from deriving the same outputs; it hashes the smallest outpoint and A.

    Quoted source text (2)

    If Alice were to use a different UTXO from the same public key ''A'' for a subsequent payment to Bob, she would end up deriving the same destinations ''P<sub>k</sub>''. To prevent this, Alice should include an input hash

    BIP 352, line 90

    Let ''input_hash = hash<sub>BIP0352/Inputs</sub>(outpoint<sub>L</sub> || A)'', where ''outpoint<sub>L</sub>'' is the smallest ''outpoint'' lexicographically used in the transaction

    BIP 352, line 303
  13. ↩ a b c Rule The sender computes ecdh_shared_secret = input_hash·a·B_scan, t_k as a tagged hash of the secret and k, and P = B_m + t_k·G; the receiver computes input_hash·b_scan·A and P_k = B_spend + t_k·G.

    Quoted source text (4)

    ** Let ''ecdh_shared_secret = input_hash·a·B<sub>scan</sub>'' ** Let ''k = 0''

    BIP 352, lines 309–310

    Let ''t<sub>k</sub> = hash<sub>BIP0352/SharedSecret</sub>(ser<sub>P</sub>(ecdh_shared_secret) || ser<sub>32</sub>(k))''

    BIP 352, line 312

    Let ''P<sub>mn</sub> = B<sub>m</sub> + t<sub>k</sub>·G''

    BIP 352, line 314

    * Let ''ecdh_shared_secret = input_hash·b<sub>scan</sub>·A''

    BIP 352, line 343
  14. ↩ a b c Rule Further outputs to the same receiver use k = 1, 2, …; after finding P_0 the receiver checks P_1 and stops at the first one not found.

    Quoted source text (1)

    Once he detects the first output, he must: * Check for ''P<sub>1</sub> = B + hash(b·A || 1)·G'' * If ''P<sub>1</sub>'' is not found, stop

    BIP 352, lines 80–84
  15. ↩ Rule The receiver spends with d = (b_spend + t_k + optional label tweak) mod n.

    Quoted source text (1)

    Let ''d = (b<sub>spend</sub> + t<sub>k</sub> + hash<sub>BIP0352/Label</sub>(ser<sub>256</sub>(b<sub>scan</sub>) || ser<sub>32</sub>(m))) mod n''

    BIP 352, lines 368–369
  16. ↩ Test vector This site's silent payments model reproduces all 28 of BIP 352's send-and-receive vectors: sender outputs and shared secrets, receiver addresses, tweaks, shared secrets, found outputs and spending tweaks. The figures show six of them, recomputed at build time and checked against the published values.

    Quoted source text (1)

    A [[bip-0352/send_and_receive_test_vectors.json|collection of test vectors in JSON format]] is provided

    BIP 352, line 383
  17. ↩ a b Rule A label tweaks the spend key, B_m = B_spend + hash(b_scan || m)·G, so a receiver can tell payments apart without scanning for multiple addresses.

    Quoted source text (2)

    Naively, Bob could publish multiple silent payment addresses, but this would require him to scan for each one, which becomes prohibitively expensive. Instead, Bob can label his spend public key ''B<sub>spend</sub>'' with an integer ''m'' in the following way: * Let ''B<sub>m</sub> = B<sub>spend</sub> + hash(b<sub>scan</sub> || m)·G''

    BIP 352, lines 118–120

    Compute ''label = output - P<sub>k</sub>'' ***** Check if ''label'' exists in the list of labels used by the wallet

    BIP 352, lines 356–357
  18. ↩ a b Rule Any UTXO with known output scripts can fund the transaction, but sender and receiver MUST derive the secret from P2TR, P2WPKH, P2SH-P2WPKH and P2PKH inputs only.

    Quoted source text (1)

    While any UTXO with known output scripts can be used to fund the transaction, the sender and receiver MUST use inputs from the following list when deriving the shared secret: * ''P2TR'' * ''P2WPKH'' * ''P2SH-P2WPKH'' * ''P2PKH''

    BIP 352, lines 225–230
  19. ↩ a b Rule The receiver reads the key from the last witness item for P2WPKH and P2SH-P2WPKH, from the scriptSig for P2PKH, and from the scriptPubKey (output key) for P2TR, including script-path spends.

    Quoted source text (4)

    Same as a keypath spend, the receiver obtains the public key from the ''scriptPubKey'' (i.e. the taproot output key)

    BIP 352, line 254

    the receiver obtains the public key as the last witness item.

    BIP 352, line 265

    the receiver obtains the public key as the last witness item.

    BIP 352, line 275

    The receiver obtains the public key from the ''scriptSig''.

    BIP 352, line 283
  20. ↩ Rule In coin selection the sender excludes inputs with SegWit version > 1.

    Quoted source text (1)

    * Exclude inputs with SegWit version > 1

    BIP 352, line 292
  21. ↩ Author’s rationale Inputs with conditional branches or multiple keys are excluded because a malicious participant in a collaborative transaction could re-sign with different keys.

    Quoted source text (1)

    Inputs with conditional branches or multiple public keys (e.g. ''CHECKMULTISIG'') are excluded from shared secret derivation as this introduces malleability and would allow a sender to re-sign with a different set of public keys after the silent payment output has been derived. This is not a concern when the sender controls all of the inputs, but is an issue for CoinJoins and other collaborative protocols, where a malicious participant can participate in deriving the silent payment address with one set of keys and then re-broadcast the transaction with signatures for a different set of public keys.

    BIP 352, line 232
  22. ↩ a b Rule Only x-only and compressed public keys are permitted.

    Quoted source text (1)

    For all of the output types listed, only X-only and compressed public keys are permitted

    BIP 352, line 234
  23. ↩ a b Rule Script-path spends whose internal key is the NUMS point H are skipped.

    Quoted source text (2)

    The one exception is script path spends that use NUMS point ''H'' as their internal key

    BIP 352, line 256

    in which case the input will be skipped for the purposes of shared secret derivation

    BIP 352, line 256
  24. ↩ Rule For a taproot input, including a script-path spend, the sender MUST use the private key of the taproot output key; if it is not available the output cannot be an input, unless H is the internal key.

    Quoted source text (2)

    Same as a keypath spend, the sender MUST use the private key corresponding to the taproot output key. If this key is not available, the output cannot be included as an input to the transaction.

    BIP 352, line 254

    * For each taproot output spent the sending wallet MUST have access to the private key corresponding to the taproot output key, unless ''H'' is used as the internal public key

    BIP 352, line 293
  25. ↩ Rule The sender negates a taproot private key whose point has odd y, because the receiver assumes even y when summing x-only keys.

    Quoted source text (2)

    check that the private key produces a point with an even Y coordinate and negate the private key if not

    BIP 352, line 300

    since the receiver will assume the even Y coordinate when summing the taproot X-only public keys.

    BIP 352, line 300
  26. ↩ Rule The receiver MUST parse a P2PKH scriptSig for the key even when it does not match the template, to address third-party malleability.

    Quoted source text (1)

    The receiver MUST parse the ''scriptSig'' for the public key, even if the ''scriptSig'' does not match the template specified (e.g. <code><dummy> OP_DROP <Signature> <Public Key></code>). This is to address the [https://en.bitcoin.it/wiki/Transaction_malleability third-party malleability of ''P2PKH'' ''scriptSigs''].

    BIP 352, line 283
  27. ↩ Test vector Read by the model, the vectors with a malleated P2PKH scriptSig, uncompressed keys, a non-P2WPKH P2SH input and a NUMS script-path spend each have inputs that are skipped or parsed as the BIP requires, while the shared secret still matches.

    Quoted source text (1)

    Wallets should include inputs not in the ''[[#inputs-for-shared-secret-derivation|Inputs For Shared Secret Derivation]]'' list when testing to ensure that only inputs from the list are being used for shared secret derivation.

    BIP 352, line 442
  28. ↩ Rule Coin selection MUST include at least one eligible input.

    Quoted source text (1)

    * At least one input MUST be from the ''[[#inputs-for-shared-secret-derivation|Inputs For Shared Secret Derivation]]'' list

    BIP 352, line 291
  29. ↩ Rule A v0 transaction MUST be scanned iff it has at least one taproot output, at least one eligible input, and spends no output with SegWit version > 1.

    Quoted source text (2)

    For silent payments v0 a transaction MUST be scanned if and only if all of the following are true: * The transaction contains at least one BIP341 taproot output

    BIP 352, lines 191–195

    * The transaction has at least one input from the ''[[#inputs-for-shared-secret-derivation|Inputs For Shared Secret Derivation]]'' list * The transaction does not spend an output with SegWit version > 1

    BIP 352, lines 194–195
  30. ↩ a b Author’s rationale The benefits come at the cost of wallets scanning the blockchain; the authors call this generally feasible for full nodes but a challenge for light clients, and light-client support open research.

    Quoted source text (1)

    These benefits come at the cost of requiring wallets to scan the blockchain in order to detect payments. This added requirement is generally feasible for full nodes but poses a challenge for light clients. While it is possible today to implement a privacy-preserving light client at the cost of increased bandwidth, light client support is considered an area of open research

    BIP 352, line 36
  31. ↩ a b Rule The receiver computes P_k = B_spend + t_k·G starting at k = 0, checks the transaction's taproot output keys, rescans with k++ after each match, and stops when no match is found.

    Quoted source text (4)

    ** Let ''outputs_to_check'' be the taproot output keys from all taproot outputs in the transaction (spent and unspent). ** Starting with ''k = 0'':

    BIP 352, lines 345–350

    *** Compute ''P<sub>k</sub> = B<sub>spend</sub> + t<sub>k</sub>·G''

    BIP 352, line 350

    Remove ''output'' from ''outputs_to_check'' and rescan ''outputs_to_check'' with ''k++''

    BIP 352, line 354

    *** If no matches are found, stop

    BIP 352, line 362
  32. ↩ Rule Since version 1.1.0, a sender fails if a scan-key group exceeds K_max = 2323 addresses and a receiver stops at k = K_max, to mitigate quadratic scanning for adversarial transactions.

    Quoted source text (3)

    * If any of the groups exceed the limit of ''K<sub>max</sub>'' (=2323) silent payment addresses, fail.

    BIP 352, line 306

    *** If ''k == K<sub>max</sub>'' (=2323), stop scanning.

    BIP 352, line 347

    * '''1.1.0''' (2026-03-02): ** Introduce per-group recipient limit ''K<sub>max</sub>'' to mitigate quadratic scanning behavior for adversarial transactions.

    BIP 352, lines 510–511
  33. ↩ Author’s rationale Because the follow-up checks run only after a match, the authors call the added scanning cost negligible.

    Quoted source text (1)

    Since Bob will only perform these subsequent checks after a transaction with at least one output paying him is found, the increase to his overall scanning requirement is negligible.

    BIP 352, line 86
  34. ↩ Rule If no label matches, the receiver negates the output and checks again, because taproot outputs are x-only.

    Quoted source text (2)

    If a label is not found, negate ''output'' and check a second time

    BIP 352, line 361

    Unfortunately taproot outputs are X-only, meaning we don't know what the correct Y coordinate is.

    BIP 352, line 361
  35. ↩ Rule Label m = 0 is reserved for change; it is important that a wallet never hands it out.

    Quoted source text (2)

    We reserve ''m = 0'' for this use case.

    BIP 352, line 132

    It is important that the wallet never hands out the label with ''m = 0'' in order to ensure nobody else can create payments that are wrongly labeled as change.

    BIP 352, line 132
  36. ↩ Rule Every receiving silent payments wallet should at least scan for the change label when recovering from backup.

    Quoted source text (1)

    every receiving silent payments wallet should at least scan for the change label when recovering from backup in order to ensure maximum cross-compatibility.

    BIP 352, line 134
  37. ↩ Author’s rationale Light-client scanning is out of scope; an appendix sketches tweak data served per transaction and BIP 158 block filters.

    Quoted source text (2)

    While this is out of scope for the current BIP

    BIP 352, line 461

    Once a light client has the tweak data for a block, they can determine whether or not an output to them exists in the block using BIP158 block filters.

    BIP 352, line 479
  38. ↩ Author’s rationale An outside observer can easily tell that labeled addresses belong to one entity because they share B_scan; labels are not for separate identities.

    Quoted source text (1)

    It is important to note that an outside observer can easily deduce that each published ''(B<sub>scan</sub>, B<sub>m</sub>)'' pair is owned by the same entity as each published address will have ''B<sub>scan</sub>'' in common. As such, labels are not meant as a way for Bob to manage separate identities

    BIP 352, line 128
  39. ↩ Author’s rationale The design keeps CoinJoins and MuSig/FROST inputs in mind, but recommends that all inputs belong to one entity because there is no formal proof of security in a collaborative setting.

    Quoted source text (1)

    The design keeps collaborative transactions such as CoinJoins and inputs with MuSig and FROST keys in mind, but it is recommended that the keys of all inputs of a transaction belong to the same entity as there is no formal proof that the protocol is secure in a collaborative setting.

    BIP 352, line 38
  40. ↩ Rule The sender should sign with DEFAULT, ALL, SINGLE or NONE; ANYONECANPAY is unsafe.

    Quoted source text (1)

    The sender should sign with one of the sighash flags ''DEFAULT'', ''ALL'', ''SINGLE'', ''NONE'' (''ANYONECANPAY'' is unsafe).

    BIP 352, line 186
  41. ↩ Rule All generated outputs MUST be in the final transaction; omitting P_i hides later outputs from the receiver.

    Quoted source text (1)

    All generated outputs MUST be present in the final transaction. If an output ''P<sub>i</sub>'' with ''i < k'' is omitted, the receiver will not be able to find outputs ''P<sub>j</sub>'' where ''i < j <= k''.

    BIP 352, line 320
  42. ↩ Rule Each output is derived independently, so regular backups are recommended and recovery requires scanning; a seed-only restore scans from the wallet birthday.

    Quoted source text (2)

    Since each silent payment output address is derived independently, regular backups are recommended. When recovering from a backup, the wallet will need to scan since the last backup to detect new payments.

    BIP 352, line 373

    can recover the full wallet history by scanning the blockchain starting from the wallet birthday.

    BIP 352, line 375