This guide explains BIP 386 tr() output descriptors in plain English. It covers the problem behind the BIP, why it matters and whether the proposal is part of Bitcoin today.
TL;DR
- What it is: BIP 386 specifies the deployed tr() output descriptor for pay-to-Taproot scripts. The top-level expression accepts an internal key and optionally a binary tree of script expressions.
- Why it matters: BIP 386 gives wallets a reproducible language for Taproot outputs. Safe use depends on exact key conversion, tree structure, tweak calculation and full descriptor recovery, not merely producing a Bech32m address.
- Current position: BIP 386 is Deployed and Informational, requires BIP 380 and has been implemented in Bitcoin Core since 22.
BIP 386 tr() output descriptors in simple English
BIP 386 tr() output descriptors: tr(KEY) describes a key-path output with no intended spendable script path. Tr(KEY,TREE) describes the same internal-key route plus one or more script leaves arranged in an explicit binary tree.
Simple example
A node operator is checking BIP 386 tr() output descriptors. Lift the key to an x-only point, calculate the TapTweak with either the internal key alone or the key plus Merkle root, add the tweak times G, and encode OP_1 followed by the 32-byte output key.
Key terms in plain English
- BIP:
- Bitcoin Improvement Proposal: a document describing a proposed rule, standard or process. Its status must be checked separately.
- Bitcoin Core:
- Widely used software that validates Bitcoin and can provide wallet, network and operator tools.
- Taproot:
- A Bitcoin upgrade that added new signature and script options for spending outputs.
- Node:
- A computer running Bitcoin software that checks data and communicates with other peers.
Status and dependency
BIP 386 is Deployed and Informational, requires BIP 380 and has been implemented in Bitcoin Core since 22.0. Pin parser behaviour because later descriptor fragments expand what may appear in trees.
Two forms
tr(KEY) describes a key-path output with no intended spendable script path. Tr(KEY,TREE) describes the same internal-key route plus one or more script leaves arranged in an explicit binary tree.
Output construction
Lift the key to an x-only point, calculate the TapTweak with either the internal key alone or the key plus Merkle root, add the tweak times G, and encode OP_1 followed by the 32-byte output key.
Tree grammar
A tree is either an allowed script expression or a brace-delimited pair of trees. Shape affects branch hashes and control-block paths, so semantically similar leaves in a different tree can produce a different output.
Key rules
Keys beneath tr() must produce x-only public keys. Uncompressed public keys are forbidden; compressed keys and extended-key descendants are converted to their x-only form.
Compatibility and recovery
The descriptor language was new even when output scripts were recognised. Preserve the full checksummed descriptor, origins, ranges, indexes and intended tree rather than backing up only an address or internal key.
How specialists test it
Developers test the proposal with made-up data on an isolated test network. They check normal cases and deliberately invalid cases. Different implementations should reach the same result before anyone relies on the proposal.
Frequently asked questions
What is the main point of BIP 386 tr() output descriptors?
BIP 386 tr() output descriptors: tr(KEY) describes a key-path output with no intended spendable script path.
For BIP 386 tr() output descriptors, what should a beginner know about status and dependency?
BIP 386 is Deployed and Informational, requires BIP 380 and has been implemented in Bitcoin Core since 22.0.
For BIP 386 tr() output descriptors, what should a beginner know about two forms?
tr(KEY) describes a key-path output with no intended spendable script path.
For BIP 386 tr() output descriptors, what should a beginner know about output construction?
Lift the key to an x-only point, calculate the TapTweak with either the internal key alone or the key plus Merkle root, add the tweak times G, and encode OP_1 followed by the 32-byte output key.
Conclusion
BIP 386 gives wallets a reproducible language for Taproot outputs. Safe use depends on exact key conversion, tree structure, tweak calculation and full descriptor recovery, not merely producing a Bech32m address.
Primary sources
- BIP 386 tr() Output Script Descriptors
- BIP 380 Output Script Descriptors General Operation
- Bitcoin Core descriptor documentation
Check the current specification status and the documentation for the exact implementation you operate before moving production funds or changing a mining node.



Join the ASIC Mining Discussion
Members can read and join the discussion
Log in to read comments from other miners. Create a free account if you would like to ask a question or share your experience.
Membership helps us protect the discussion from spam and keep answers useful.