What is External Signer Support?
External signer support allows Bitcoin Core to:- Communicate with hardware wallets (Ledger, Trezor, Coldcard, etc.)
- Create watch-only wallets with keys managed by external devices
- Sign transactions using hardware wallet confirmation
- Verify addresses on the device screen for security
When to Use External Signers
External signers are ideal for:- Maximum Security: Private keys never leave the hardware device
- Cold Storage: Keep large amounts secure on hardware wallets
- Multi-sig Setups: Combine hardware wallets with Bitcoin Core’s descriptor wallets
- Regulatory Compliance: Maintain full node validation while using secure key storage
- Personal Sovereignty: Run your own full node without sacrificing key security
Setting Up External Signer
Prerequisites
- A compatible hardware wallet (Ledger, Trezor, Coldcard, etc.)
- HWI version 2.0 or newer installed
- Hardware wallet initialized and backed up per manufacturer instructions
Starting Bitcoin Core with Signer
Launch Bitcoin Core (orbitcoin-node) with the -signer option:
<cmd> argument is the path to an external tool (like HWI) that can sign transactions and interact with hardware devices.
Complete Setup Example with HWI
Step 1: Install HWI
Step 2: Initialize Hardware Wallet
Follow your hardware wallet manufacturer’s instructions to:- Set up a PIN
- Generate or restore a seed phrase
- Create a secure backup of your recovery seed
Step 3: Start Bitcoin Core
Step 4: Enumerate Signers
List connected signing devices:fingerprint is the master key fingerprint that uniquely identifies your device.
Step 5: Create Wallet
Create a wallet that automatically imports public keys from the hardware device:- Wallet name:
"my_hardware_wallet" true: Disable private keys (watch-only)true: Blank wallet"": Passphrase (empty)true: Avoid reusetrue: Descriptorstrue: External signer
bitcoin rpc command:
Using Your Hardware Wallet
Generate Receive Address
Verify Address on Device
Display the address on your hardware wallet screen for verification:Always verify receiving addresses on the device screen to prevent address substitution attacks.
Send Transaction
Send bitcoin to an address:- Create a Partially Signed Bitcoin Transaction (PSBT)
- Prompt your hardware wallet to review and sign
- Wait for your confirmation on the device
- Broadcast the transaction automatically if signed
Signer API Specification
Any external signer must conform to this API to be compatible with Bitcoin Core.Prerequisites
- Understanding of Output Descriptors
- Familiarity with PSBT (Partially Signed Bitcoin Transactions)
enumerate (Required)
Lists available signing devices:
fingerprint field is required. Future extensions may include device capabilities and reachability status.
signtransaction (Required)
Signs a PSBT:
- PSBT should include BIP32 derivation paths
- Should fail if no derivations match device keys
- Should fail if user cancels on device
- May validate coin type matches network (mainnet/testnet)
getdescriptors (Optional)
Returns descriptors supported by the device:
displayaddress (Optional)
Displays an address on the device screen:
- Must derive address type from descriptor
- Must fail if fingerprint or xpub doesn’t match device
- May validate coin type matches network
How Bitcoin Core Uses the API
enumeratesigners RPC
Calls <cmd> enumerate to list devices.
createwallet RPC
Calls:
walletdisplayaddress RPC
Extracts descriptor from address using getaddressinfo, then calls:
sendtoaddress and sendmany RPCs
Check if inputs have matching master_fingerprint, then calls:
Security Best Practices
- Verify on Device: Always check addresses on the hardware wallet screen
- Secure Backup: Keep recovery seeds in a safe, offline location
- PIN Protection: Use a strong PIN on your hardware wallet
- Firmware Updates: Keep device firmware updated from official sources
- Trusted Tools: Only use signing tools from reputable sources
- Test First: Test with small amounts before large transactions
Troubleshooting
Device Not Detected
- Ensure device is connected and unlocked
- Check USB cable and ports
- Verify HWI has necessary permissions (udev rules on Linux)
- Try
hwi.py enumeratedirectly to test HWI
Transaction Signing Fails
- Confirm device is unlocked
- Check that correct wallet is selected on device
- Verify the device supports the address type being used
- Ensure PSBT includes BIP32 derivation information
Address Verification Fails
- Verify device firmware supports address display
- Check that descriptor matches device’s key
- Ensure correct network (mainnet/testnet)