RPC This makes bech32m the default whenever possible. For legacy wallets the default remains bech32. Same for descriptor wallets without an active Taproot descriptor.
GUI A new wallet setting allows users to opt-in to Taproot. If they opt in, the GUI bech32 checkbox now produces either bech32 or bech32m depending on the wallet. This avoids having to explain the difference.
Considerations This lets users and developers experiment with taproot wallets. When merged before #22364, the user will have to manually import a taproot descriptor. After that PR, taproot descriptors will be present for all new wallets.
It is better to stick to bech32 addresses for the time being, because:
- It is expected that it will take a while for enough wallets and exchanges to correctly handle sending to bech32m addresses
- Taproot savings for a single signature wallet are not huge
- Explaining the difference between bech32 and bech32m is not great UX
But we don’t want to prevent users and developers who do understand the difference to use Taproot. Without this PR they can only do this via the RPC (getnewaddress some_label bech32m
). With this PR it’s a simple checkbox.
Changing the RPC default to bech32m seems acceptable to me, since those users will have a better understanding of the wallet. Though I can see the case against it because it might be a breaking change, e.g. if someone has an automated setup that creates new wallets (existing wallets currently don’t auto upgrade to taproot, so their behavior is not changed).
Suggested testing
- call
getnewaddress
without type andgetnewaddress Test bech32
/bech32m
- create a receive address in the GUI with and without the bech32 checkbox
- Legacy wallet
- Default descriptor wallet (current does not have taproot descriptor)
- Wallet with taproot descriptor:
- build #22364
- create new descriptor wallet
- build this PR again