Claude-skill-registry btc-terminology
Critical Bitcoin terminology rules to prevent confusion between bech32m (encoding) and taproot (address type). Use when working on BTC-related code, config files, or shell scripts.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/btc-terminology" ~/.claude/skills/majiayu000-claude-skill-registry-btc-terminology && rm -rf "$T"
manifest:
skills/data/btc-terminology/SKILL.mdsource content
BTC Terminology Rules
🚨 CRITICAL: Bech32m vs Taproot
This is a common source of bugs. Do NOT confuse these terms:
| Term | What It Is | Where Used |
|---|---|---|
| bech32m | Encoding format (HOW address is serialized) | Bitcoin Core RPC, shell scripts |
| taproot | Address type (WHAT the address represents) | Config files, domain model |
Key Rule:
bech32m ≠ taproot — They are related but NOT interchangeable.
Quick Reference Table
| Context | Correct Term | Example |
|---|---|---|
| Config YAML/TOML files | | |
| Environment variables | | |
| Bitcoin Core CLI/RPC | | |
| Shell scripts (receiver addresses) | | |
Go domain code () | | |
Go Bitcoin Core interface () | | |
Common Mistakes
❌ WRONG
# Config file - DON'T use bech32m address_type: "bech32m" # WRONG!
# Shell script - DON'T use taproot for Bitcoin Core RPC bitcoin-cli getnewaddress "" taproot # WRONG!
✅ CORRECT
# Config file - Use taproot address_type: "taproot" # CORRECT!
# Shell script - Use bech32m for Bitcoin Core RPC bitcoin-cli getnewaddress "" bech32m # CORRECT!
Technical Background
Why Two Different Terms?
- Taproot (BIP341) = SegWit version 1 address type (P2TR - Pay-to-Taproot)
- Bech32m (BIP350) = Encoding format that fixes checksum issues in original Bech32
All Taproot addresses are encoded using bech32m, but:
- User-facing config uses "taproot" (what you want)
- Bitcoin Core RPC uses "bech32m" (how it's encoded)
Address Format Comparison
| Encoding | SegWit Version | Address Type | Prefix | Config Value |
|---|---|---|---|---|
| Base58 | N/A | P2PKH | | |
| Base58 | N/A | P2SH | | |
| Bech32 | v0 | P2WPKH | | |
| Bech32m | v1 | P2TR | | |
Codebase Mapping
The project has two different type definitions:
// internal/domain/bitcoin/address_type.go // For Bitcoin Core RPC communication AddressTypeTaproot AddressType = "bech32m" // Bitcoin Core uses "bech32m" // internal/domain/address/types.go // For user-facing configuration AddrTypeTaproot AddrType = "taproot" // User sees "taproot"
Conversion between these is handled by mapper functions:
// internal/infrastructure/api/btc/btc/mapper.go // FromAddressType: "bech32m" (Bitcoin Core) → "taproot" (user-facing) // ToAddressType: "taproot" (user-facing) → "bech32m" (Bitcoin Core)
Verification Checklist
When working with Taproot/Bech32m code:
- Config files (YAML/TOML) use
address_type: "taproot" - Environment variables use
WALLET_ADDRESS_TYPE="taproot" - Bitcoin Core RPC calls in shell scripts use
bech32m - Shell scripts generating receiver addresses use
bech32m - Go code uses correct type for the layer:
- Domain/config layer:
(value:AddrTypeTaproot
)"taproot" - Bitcoin Core interface:
(value:AddressTypeTaproot
)"bech32m"
- Domain/config layer:
Related Files
| File | Purpose |
|---|---|
| User-facing definitions |
| Bitcoin Core definitions |
| Type conversion functions |
| Taproot user guide |