Skip to content

BIP321: make all example addresses intentionally invalid - #2229

Merged
jonatack merged 1 commit into
bitcoin:masterfrom
fametrano:invalidate-example-addresses
Aug 3, 2026
Merged

BIP321: make all example addresses intentionally invalid#2229
jonatack merged 1 commit into
bitcoin:masterfrom
fametrano:invalidate-example-addresses

Conversation

@fametrano

@fametrano fametrano commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

One of three mutually exclusive options for the same problem — see the table at the bottom. This is the one I'd recommend merging.

BIP 21's example address 175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W has a deliberately broken checksum (the final character was replaced, per @TheBlueMatt in #119), and #1861 documented that intent with a note. BIP 321 inherited the address but not the note, and the addresses added to BIP 321 after the fork from BIP 21 do not follow the convention — their checksums are valid:

Address Status on master
175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W invalid checksum (intentional)
bc1qufgy354j3kmvuch987xe4s40836x3h0lg8f5n2 valid bech32, witness v0, mainnet
bc1p5swkugezn97763tl0yty6556856uug0q6jflljvep9m4p7339x5qzyrh4g valid bech32m, witness v1, mainnet
tb1qghfhmd4zh7ncpmxl3qzhmq566jk8ckq4gafnmg valid bech32, witness v0, testnet

So the document currently ships two spendable mainnet addresses in its examples — exactly the accident #119 and #1861 were about.

This PR

Applies the existing convention to the remaining addresses by altering the final checksum character of each, then adds BIP 21's note verbatim, which is now accurate for every address in the document:

Note: The addresses used in these examples are intentionally invalid to prevent accidental transactions.

Properties preserved:

  • Bech32 detects any single-character substitution, so the modified strings cannot be valid addresses under either the bech32 or bech32m constant. I verified all of them against a reference implementation of both.
  • Human-readable part, charset and length are unchanged (42 and 62 characters), so the examples stay structurally representative of P2WPKH and P2TR and remain usable as negative test vectors.
  • The uppercase QR-code variants are updated to match.
  • The changed testnet address in the "Invalid URIs" section still demonstrates its point, which is the HRP/parameter-key mismatch (a tb address in the bc parameter), not the checksum.

The three options

PR Approach Diff
#2228 keep the addresses, word the note to match reality +2
#2229 invalidate every address, add BIP 21's note verbatim +7 / -5 this PR, my preference
#2230 make every address valid, warn against paying them +18 / -16

Only one should be merged; I'll close the other two.

My preference is this PR. It is the only one of the three that leaves no spendable address anywhere in the document, it makes BIP 21's existing wording literally true here so the two documents stay in sync, and the whole cost is four characters. #2228 is the minimal-diff fallback if maintainers would rather not touch strings that downstream implementations may already be using as test vectors. #2230 is on the table because #119 was closed for lack of author consensus rather than on the merits, so the option deserves to be stated explicitly rather than assumed dead — but it is the one I would close first.

The base58 example address has an intentionally invalid checksum, but
the bech32 and bech32m examples added later have valid checksums, so
they are spendable addresses that a reader may pay by accident -- the
very hazard that motivated the invalid base58 address in bitcoin#119. Two of
them are mainnet:

  bc1qufgy354j3kmvuch987xe4s40836x3h0lg8f5n2  (bech32, witness v0)
  bc1p5swkugezn...vep9m4p7339x5qzyrh4g        (bech32m, witness v1)
  tb1qghfhmd4zh7ncpmxl3qzhmq566jk8ckq4gafnmg  (bech32, testnet)

Alter the final checksum character of each, and document the intent
with the note BIP 21 received in bitcoin#1861. Bech32 detects any
single-character substitution, so the modified strings cannot be valid
addresses. The human-readable part, charset and length are unchanged,
so the examples remain structurally representative of P2WPKH and P2TR.

The uppercase QR-code variants are updated to match, and the changed
testnet address in the "Invalid URIs" section still demonstrates the
same point (a `tb` address in the `bc` parameter).

Alternative to bitcoin#2228, which leaves the addresses untouched and instead
words the note to match them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fametrano added a commit to fametrano/bips that referenced this pull request Jul 31, 2026
Revives bitcoin#119, closed in 2015 for lack of author consensus.

175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W has a deliberately broken checksum
-- the address from the Wikipedia Bitcoin page of the time with its
final character replaced -- while every other address in the document,
the bech32 and bech32m examples added after the fork from BIP 21, has a
valid checksum. That inconsistency has a documented cost: users have
filed URI-parsing bugs against wallets after copying URIs straight out
of the document (schildbach in bitcoin#119), and the examples cannot be used
as test vectors as they stand (evoskuil in bitcoin#119, who opened it for
exactly this reason).

Use 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L, the replacement bitcoin#119 proposed.
It is BIP 20's example address, where it is already paired with the
same label=Luke-Jr used here, so the labels in the examples stay
coherent -- luke-jr's objection in bitcoin#119.

Every address in the document is now valid and parseable, so the
examples work as test vectors, and a note states that they are
illustrative and must not be paid. That addresses laanwj's objection in
bitcoin#119 -- that valid example addresses are spendable ones -- by warning
the reader rather than by breaking the encoding.

Alternatives: bitcoin#2228 and bitcoin#2229, which keep the addresses unspendable
instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@jonatack jonatack left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approach ACK. Per #119 (comment), the BIP author doesn't mind either way and this follows what was already done in #1861.

@jonatack jonatack added the Fixups Minor fixups not worth bothering the BIP author(s) for label Jul 31, 2026

@jonatack jonatack left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

@jonatack
jonatack merged commit 74e01fc into bitcoin:master Aug 3, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Fixups Minor fixups not worth bothering the BIP author(s) for

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants